Share via


/GS (Arabellek Güvenlik Denetimi)

bir işlevin dönüş adresini, özel durum işleyici adresini veya belirli parametre türlerinin üzerine yazan bazı arabellek taşmalarını algılar. Arabellek taşmasına neden olmak, bilgisayar korsanları tarafından arabellek boyutu kısıtlamalarını zorlamayan koddan yararlanmak için kullanılan bir tekniktir.

Sözdizimi

/GS[-]

Açıklamalar

/GS varsayılan olarak açıktır. Uygulamanızın güvenlik açıklarına maruz kalmamasını bekliyorsanız /GS-kullanın. Arabellek taşması algılamasını gizleme hakkında daha fazla bilgi için bkz . safebuffers.

Güvenlik Denetimleri

Derleyicinin arabellek taşması sorunlarına tabi olarak tanıdığı işlevlerde, derleyici dönüş adresinden önce yığında yer ayırır. İşlev girdisinde, ayrılan alan modül yükünde bir kez hesaplanan bir güvenlik tanımlama bilgisi ile yüklenir. İşlev çıkışında ve 64 bit işletim sistemlerinde çerçeve geri sarma sırasında, tanımlama bilgisinin değerinin hala aynı olduğundan emin olmak için bir yardımcı işlev çağrılır. Farklı bir değer, yığının üzerine yazılmış olabileceğini gösterir. Farklı bir değer algılanırsa işlem sonlandırılır.

GS Arabellekleri

GS arabelleğinde arabellek taşması güvenlik denetimi gerçekleştirilir. GS arabelleği şunlardan biri olabilir:

  • 4 bayttan büyük bir dizi, ikiden fazla öğeye sahiptir ve işaretçi türü olmayan bir öğe türüne sahiptir.

  • Boyutu 8 bayttan fazla olan ve işaretçi içermeyen bir veri yapısı.

  • _alloca işlevi kullanılarak ayrılan arabellek.

  • GS arabelleği içeren herhangi bir sınıf veya yapı.

Örneğin, aşağıdaki deyimler GS arabelleklerini bildirir.

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

Ancak aşağıdaki deyimler GS arabelleklerini bildirmez. İlk iki bildirim işaretçi türünde öğeler içerir. Üçüncü ve dördüncü deyimler, boyutu çok küçük olan dizileri bildirir. Beşinci deyim, x86 platformunda boyutu 8 bayttan fazla olmayan bir yapı bildirir.

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

/GS derleyici seçeneği, tanımlama bilgisini kullanan herhangi bir işlev çalıştırılmadan önce güvenlik tanımlama bilgisinin başlatılmasını gerektirir. Güvenlik tanımlama bilgisi bir EXE veya DLL'ye girişte hemen başlatılmalıdır. Bu, varsayılan VCRuntime giriş noktalarını kullanırsanız otomatik olarak yapılır: mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup veya _DllMainCRTStartup. Alternatif bir giriş noktası kullanıyorsanız, __security_init_cookie çağırarak güvenlik tanımlama bilgisini el ile başlatmanız gerekir.

KorunanLar

/GS derleyici seçeneği aşağıdaki öğeleri korur:

  • İşlev çağrısının dönüş adresi.

  • bir işlev için özel durum işleyicisinin adresi.

  • Güvenlik açığı olan işlev parametreleri.

Tüm platformlarda/GS, dönüş adresine yapılan arabellek taşmalarını algılamaya çalışır. Arabellek taşmalarından, yığında işlev çağrısının dönüş adresini depolayan çağrı kurallarını kullanan x86 ve x64 gibi platformlarda daha kolay yararlanılır.

x86'da, bir işlev özel durum işleyicisi kullanıyorsa, derleyici özel durum işleyicisinin adresini korumak için bir güvenlik tanımlama bilgisi ekler. Tanımlama bilgisi, çerçeve geri sarma sırasında denetleniyor.

/GS , bir işleve geçirilen güvenlik açığı olan parametreleri korur. Güvenlik açığı olan parametre işaretçi, C++ başvurusu, işaretçi içeren bir C yapısı (C++ POD türü) veya GS arabelleğidir.

Güvenlik açığı olan bir parametre tanımlama bilgisi ve yerel değişkenlerden önce ayrılır. Arabellek taşması bu parametrelerin üzerine yazabilir. Bu parametreleri kullanan işlevdeki kod, işlev döndürülmeden ve güvenlik denetimi gerçekleştirilmeden önce bir saldırıya neden olabilir. Bu tehlikeyi en aza indirmek için, derleyici işlev günlüğü sırasında güvenlik açığı olan parametrelerin bir kopyasını alır ve bunları tüm arabellekler için depolama alanının altına yerleştirir.

Derleyici, aşağıdaki durumlarda güvenlik açığı olan parametrelerin kopyalarını almaz:

  • GS arabelleği içermeyen işlevler.

  • İyileştirmeler (/O seçenekleri) etkinleştirilmedi.

  • Değişken bağımsız değişken listesi (...) olan işlevler.

  • Çıplak olarak işaretlenmiş işlevler.

  • İlk deyimde satır içi derleme kodu içeren işlevler.

  • Parametre yalnızca arabellek taşması durumunda daha az yararlanılabilir olacak şekilde kullanılır.

Korunmayanlar

/GS derleyici seçeneği tüm arabellek taşması güvenlik saldırılarına karşı koruma sağlamaz. Örneğin, bir nesnede bir arabelleğe ve bir vtable'a sahipseniz, arabellek taşması vtable'ı bozabilir.

/GS kullansanız bile, her zaman arabellek taşması olmayan güvenli kod yazmayı deneyin.

Visual Studio'da bu derleyici seçeneğini ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Kod Oluşturma özellik sayfasını seçin.

  3. Arabellek Güvenlik Denetimi özelliğini değiştirin.

Bu derleyici seçeneğini program üzerinden ayarlamak için

Örnek

Bu örnek bir arabelleğin üzerinde taşıyor. Bu, uygulamanın çalışma zamanında başarısız olmasına neden olur.

// 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);
}

Ayrıca bkz.

MSVC Derleyicisi Seçenekleri
MSVC Derleyicisi Komut Satırı Söz Dizimi