/GS (فحص من الأمان احتياطي)

الكشف عن بعض عمليات تجاوز للمخزن المؤقت للكتابة فوق دالة's بإرجاع العنوان أو العنوان معالج ‏‏ استثناء أو أنواع معينة من المعلمات. تتسبب في تجاوز المخزن مؤقت هو تقنية تستخدم من قبل المتطفلين من استغلال تعليمات برمجية التي لم فرض قيود الحجم احتياطي.

/GS[-]

ملاحظات

/GSهو على بشكل افتراضي. إذا كنت تتوقع أن تطبيق الخاص بك إلى أن لا التعرض للأمان، استخدم /GS-. ل المزيد من المعلومات حول /GS، راجع المحول البرمجي الأمان الاختبارات في العمق. ل المزيد المعلومات حول منع الكشف عن تجاوز سعة احتياطي، راجع safebuffers.

تدقيقات الأمان

حول الدالات التي يتعرف عليها المحول البرمجي كموضوع إلى مشاكل في تجاوز سعة احتياطي، المحول البرمجي يخصص مسافة تشغيل المكدس قبل العنوان المرسل. تشغيل إدخال دالة، والمساحة المخصصة هو تم تحميله ملفات تعريف الارتباط الأمان التي هو حسابها مرة واحدة عند تم تحميله وحدة نمطية?. عند الإنهاء الدالة، ومن خلال إطار unwinding على أنظمة تشغيل 64 بت، يتم استدعاء دالة مساعد إلى تأكد من أن القيمة ملف تعريف ارتباط هو ما زال نفسه. يشير إلى القيمة مختلفة التي الكتابة فوق من مكدس قد يكون حدث. إذا كانت القيمة مختلفة هو الكشف عن العملية هو منتهية.

GS المخازن المؤقتة

تحقق من الأمان overrrun المخزن مؤقت هو تنفيذها تشغيل احتياطي GS. GS احتياطي يمكن أن يكون واحد هذه:

  • صفيفة من المزيد عنصرين الموقع كتابة العنصر هو ليس من نوع مؤشر.

  • بنية بيانات التي حجمها هو أكثر من 8 وحدات البايت ويحتوي على لا توجد مؤشرات.

  • أ احتياطي المخصصة باستخدام دالة _alloca.

  • أي فئة أو بنية يحتوي على مخزن مؤقت GS.

على سبيل المثال، تعريف العبارات التالية GS المخازن المؤقتة.

    char buffer[20];
    int buffer[20];
    struct { int a; int b; int c; int d; } myStruct;
    struct { int a; char buf[20]; };

ومع ذلك، لا تعريف العبارات التالية GS المخازن المؤقتة. أن التصريحات الأولى والثانية تحتوي على عناصر نوع مؤشر. عبارات الثالث والرابع بتعريف الصفائف التي حجمها هو مربع متوسط جداً. بيان الخامس تعريف بنية حجمها تشغيل نظاما 86 x هو ليس المزيد 8 وحدات البايت.

    char *pBuf[20];
    void *pv[20];
    char buf[4];
    int buf[2];
    struct { int a; int b; };

يهيّئ ملف تعريف ارتباط للأمان

/GSالخيار المترجم يتطلب أن تتم تهيئة ملف تعريف ارتباط الأمان قبل أي وظيفة يستخدم ملفات تعريف الارتباط هو التشغيل. يجب تهيئة ملف تعريف ارتباط الأمان تشغيل إدخال إلى DLL أو EXE. ويتم تنفيذ ذلك تلقائياً إذا كنت استخدم نقاط الإدخال CRT الافتراضي (mainCRTStartup wmainCRTStartup، WinMainCRTStartup، wWinMainCRTStartup أو _DllMainCRTStartup). إذا كنت تستخدم يؤشر إدخال بديل، يجب أن يدوياً يهيّئ ملف تعريف ارتباط الأمان بواسطة استدعاء __security_init_cookie .

ما هو المحمي

/GSخيار المترجم بحماية عناصر التالية:

  • العنوان المرسل دالة يتصل.

  • العنوان معالج ‏‏ استثناء النسبة لأحد الوظائف.

  • معلمات دالة عرضه للثغرات الأمنية.

تشغيل الجميع الأنظمة الأساسية، /GSيحاول الكشف عن عمليات تجاوز احتياطي في العنوان المرسل. يتم بسهولة استغلال عمليات تجاوز احتياطي تشغيل الأنظمة الأساسية مثل x86 و ‏‫x64، استدعاء أي اصطلاحات استدعاء استخدم التي تقوم بتخزين العنوان المرسل دالة تشغيل المكدس.

تشغيل x86، إذا كان يستخدم دالة معالج استثناء، المحول البرمجي injects ملف ملف تعريف ارتباط الأمان إلى حماية العنوان معالج ‏‏ استثناء. ملف تعريف ارتباط هو التحقق من خلال إطار unwinding.

/GSيحميمعلمات عرضه التي تم تمريرها في دالة. معلمة عرضه هو مؤشر، مرجع في C + + C-بنية (نوع POD C + +) الذي يحتوي على مرجع، أو GS احتياطي.

معلمة عرضه هو المخصصة من قبل ملف تعريف ارتباط والمتغيرات المحلية. أ احتياطي يمكن لتجاوز الكتابة فوق هذه المعلمات. وقد يؤدي التعليمات البرمجية في دالة التي تستخدم هذه المعلمات هجوم قبل أن تقوم دالة بإرجاع وفحص من الأمان هو تنفيذه. إلى تصغير هذا خطر، يجعل نسخ من المعلمات عرضه أثناء prolog دالة المحول البرمجي ويضع عليها أسفل المنطقة sإلىrage لأية مخازن مؤقتة.

لا تجري المحول البرمجي النسخ معلمات عرضه في الحالات التالية:

  • الدالات التي لا تحتوي على GS احتياطي.

  • لم يتم ممكّن أمثلية الأداء ( خيارات/O).

  • دالات التي تحتوي على قائمة وسائط متغيرات (...).

  • دالات التي يتم وضع علامة naked .

  • الدالات التي تحتوي على تجميع مضمنة تعليمات برمجية في العبارة الأولى.

  • معلمة هو يستخدم فقط في الطرق التي أقل احتمالاً أن يكون exploitable في حدوث لتجاوز المخزن مؤقت.

ما هو غير المحمي

/GSخيار المحول البرمجي لا يحمي من الجميع تجاوز سعة المخزن المؤقت الأمان الهجمات. على سبيل المثال، إذا كان لديك المخزن مؤقت و vtable في كائن، قد يلحق تجاوز المخزن مؤقت في vtable.

حتى إذا كنت تستخدم /GS، حاول دائماً إلى كتابة تعليمات برمجية آمنة له لا توجد عمليات تجاوز احتياطي.

إلى قم بتعيين هذا خيار المترجم في ‏‫Visual Studio

  1. في مستكشف الحلول انقر بزر الماوس الأيمن فوق المشروع ثم انقر فوق خصائص.

    لمزيد من المعلومات، راجع كيفية: صفحات الخصائص المشاريع المفتوحة.

  2. في صندوق الحوار خاصية الصفحات ، انقر فوق المجلد /C + + C.

  3. انقر فوق صفحة الخصائص توليد تعليمات برمجية.

  4. قم بتعديل تدقيق الأمان احتياطي خاصية .

لتعيين هذا خيار المحول البرمجي برمجياً

مثال

هذا النموذج overruns مخزن مؤقت. ويؤدي هذا تطبيق إلى فشل في وقت التشغيل.

// compile with: /c /W1
#include <cstring>
#include <stdlib.h>
#pragma warning(disable : 4996)   // for strcpy use

// Vulnerable function
void vulnerable(const char *str) {
   char buffer[10];
   strcpy(buffer, str); // overrun buffer !!!

   // use a secure CRT function to help prevent buffer overruns
   // truncate string to fit a 10 byte buffer
   // strncpy_s(buffer, _countof(buffer), str, _TRUNCATE);
}

int main() {
   // declare buffer that is bigger than expected
   char large_buffer[] = "This string is longer than 10 characters!!";
   vulnerable(large_buffer);
}

راجع أيضًا:

المرجع

خيار المحول البرمجي

خيارات إعداد المترجم