Aracılığıyla paylaş


/gs (arabellek güvenlik denetimi)

Bir işlevin dönüş adresini, özel durum işleyici adresi veya belirli türdeki parametreleri üzerine bazı arabellek taşmaları algılar.Arabellek taşmasına neden olan, saldırganlar tarafından arabellek boyutu sınırlamaları zorlamaz kod yararlanmak için kullanılan bir tekniktir.

/GS[-]

Notlar

/GSVarsayılan olarak açıktır.Uygulamanız için hiçbir güvenlik açıklarını düşünüyorsanız kullanın /GS-.Hakkında daha fazla bilgi için /GS, bkz: , Derleyici güvenlik derinlik denetler.Arabellek Taşması algılaması engelleniyor hakkında daha fazla bilgi için bkz: safebuffers.

Güvenlik denetimleri

Arabellek Taşması sorunları gibi tabi derleyici tanıdığı işlevleri, derleyici dönüş adresini önce yığın alanı ayırır.İşlev girişinde ayrılan alanı ile yüklenen bir Güvenlik tanımlama bilgisi , hesaplanan bir kez modülü başlangıçta.İşlev çıkışta ve 64-bit işletim sistemleri üzerinde çerçeve unwinding sırasında çerezin değerini hala aynı olduğunu emin olmak için bir yardımcı işlevi çağrılır.Bir yığının üzerine oluşmuş olabilir farklı bir değer gösterir.Farklı bir değer algılarsa, işlem sonlandırılır.

gs arabellekleri

Bir arabellek taşması güvenlik denetimi üzerinde gerçekleştirilen bir gs arabellek.gs arabellek şunlardan biri olabilir:

  • 4 Bayttan büyük bir dizi ikiden fazla öğe varsa ve bir işaretçi türü değil bir öğe türü.

  • Boyutu 8 bayttan fazla olduğu ve hiçbir işaretçiler içeren veri yapısı.

  • Kullanarak ayrılmış arabellek _alloca işlevi.

  • Herhangi bir sınıf veya gs arabellek içeren yapısı.

Örneğin, aşağıdaki ifadeler gs arabellekleri bildirin.

    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 ifadeleri gs arabellekleri belirtmezsiniz.İlk iki bildirimleri işaretçisi türü öğelerini içerir.Üçüncü ve dördüncü ifadelerini diziler boyutları çok küçük bildirin.Beşinci ifade x 86 platformu üzerinde boyutu 8 bayttan fazlasını değil bir yapı bildirir.

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

Güvenlik tanımlama bilgisi başlatılamadı

/GS Derleyici seçeneği güvenlik tanımlama bilgisi tanımlama bilgisi kullanan işlevini çalıştırmadan önce başlatılmış gerekir.exe ya da dll girişindeki güvenlik tanımlama bilgisi başlatılmalıdır.Bu, varsayılan crt giriş noktalarını (mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup veya _DllMainCRTStartup) kullanırsanız, otomatik olarak yapılır.Diğer giriş noktası kullanıyorsanız, el ile güvenlik tanımlama bilgisi çağırarak başlatmalısınız __security_init_cookie.

Ne korumalı

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

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

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

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

Tüm platformlarda /GS arabellek taşmaları dönüş adresi olarak algılamaya çalışır.Arabellek taşmaları daha kolay x 86 ve x 64, yığında bir işlevin dönüş adresini saklamak hangi kullanım arama kuralları çağrısı gibi platformlarda mi.

Bir özel durum işleyici bir işlevini kullanıyorsa, x 86, derleyici özel durum işleyici adresi korumak için bir güvenlik tanımlama bilgisi injects.Tanımlama bilgisi, çerçeve unwinding sırasında denetlenir.

/GSkorur savunmasız parametreleri işlevi geçirilir.İşaretçiyi bir C++ başvurusu, bir c-bir işaretçi veya gs arabellek içeren yapısı (C++ pod türü) bir güvenlik açığından etkilenen parametresidir.

Güvenlik açığı bulunan bir parametre, tanımlama bilgisi ve yerel değişkenler önce tahsis edilir.Bu parametreler bir arabellek taşması üzerine yazabilirsiniz.Ve bu parametreleri kullanır işlev kodu saldırının işlevini verir ve güvenlik denetimi gerçekleştirilir önce neden olabilir.Bu tehlike en aza indirmek için derleyici sırasında işlev önsöz savunmasız parametreleri kopyasını oluşturur ve bunları herhangi bir arabellek depolama alanının altındaki koyar.

Derleyici aşağıdaki durumlarda savunmasız parametreleri kopyalarını yapmaz:

  • gs arabellek içermeyen fonksiyonlar

  • En iyi duruma getirme (/o seçenekler) etkin değil.

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

  • İle işaretlenmiş işlevleri çýplak.

  • İlk ifadesinde satır içi derleme kodu içeren fonksiyonlar

  • Bir parametre sadece bir arabellek taşması durumunda etkilenme olasılığını şekillerde kullanılır.

Ne korunmuyor

/GS Derleyici seçeneği tüm arabellek taşması güvenlik saldırılarına karşı koruma sağlamaz.Örneğin, bir arabellek ve bir vtable bir nesne varsa, bir arabellek taşması vtable bozabilir.

Kullanırsanız, /GS, her zaman hiçbir arabellek taşmaları olan güvenli kod yazmaya çalışın.

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

  1. Çözüm Gezgini'nde projeye sağ tıklayın ve sonra Özellikler'i tıklayın.

    Daha fazla bilgi için bkz. Nasıl yapılır: Proje özellik sayfalarını açın.

  2. İçinde Özellik sayfaları iletişim kutusunu tıklatın c/C++ klasörü.

  3. Tıklatın Kod oluşturma özellik sayfası.

  4. Değiştirmek Arabellek Güvenlik denetimi özelliği.

Bu derleyici seçeneği programlı olarak ayarlamak için

Örnek

Bu örnek bir arabellekten taşar.Bu uygulama çalışma zamanında hata vermesine 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.

Başvuru

Derleme Seçenekleri

Derleyici seçeneklerini ayarlama