Udostępnij za pośrednictwem


/ GS (kontrola zabezpieczeń buforu)

Wykrywa niektóre przepełnienia bufora, które zastąpić adres zwrotny funkcji, adres procedury obsługi wyjątku lub niektórych rodzajów parametrów.Powodując przepełnienie buforu jest technika używana przez hakerów do wykorzystania kodu, który nie Wymuszaj ograniczenia rozmiaru buforu.

/GS[-]

Uwagi

/GSjest domyślnie włączone.Jeśli aplikacja ma narażenia nie zabezpieczeń, należy użyć /GS-.Aby uzyskać więcej informacji o /GS, zobacz Kompilatora zabezpieczeń sprawdza, czy w głębi.Aby uzyskać więcej informacji dotyczących pomijania wykrywania przepełnienia buforu, zobacz safebuffers.

Sprawdzanie zabezpieczeń

W funkcjach, które kompilator uznaje się za podlegające problemów przepełnienie buforu kompilator przydziela miejsce na stosie przed adres zwrotny.Przy wejściu do funkcji, przydzielony obszar jest ładowany z cookie zabezpieczeń raz obliczona przy ładowaniu modułu.Po wyjściu z funkcji i podczas ramki niekontrolowanej na 64-bitowych systemów operacyjnych wywoływana jest funkcja helper upewnić się, że wartość cookie jest nadal takie same.Inną wartość wskazuje mogło Zastąp stosu.Jeśli zostanie wykryta inną wartość, proces zostanie zakończony.

Bufory GS

Sprawdzenie zabezpieczeń przepełnienie buforu jest wykonywana na buforu GS.Bufor GS może być jedną z nich:

  • Tablica jest większy niż 4 bajty, ma więcej niż dwa elementy i ma typ elementu, który nie jest typu wskaźnika.

  • Struktura danych, których rozmiar jest większy niż 8 bajtów i zawiera żadne wskaźniki.

  • Bufor, przydzielane przy użyciu _alloca funkcji.

  • Klasy lub struktury, która zawiera buforu GS.

Na przykład poniższe instrukcje zadeklarować GS buforów.

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

Jednakże następujące instrukcje nie są deklarowane GS buforów.Pierwsze dwie deklaracje zawierają elementy typu wskaźnika.Trzeciego i czwartego sprawozdania deklarować tablic, których rozmiar jest za mały.Piąty instrukcji deklaruje strukturę, której rozmiar na platformy x 86 nie jest więcej niż 8 bajtów.

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

/GS Opcję kompilatora wymaga zainicjowanej cookie zabezpieczeń przed uruchomieniem funkcji, które wykorzystuje plik cookie jest.Plik cookie zabezpieczeń musi być zainicjowany w zapisie EXE lub DLL.Jest wykonywane automatycznie użycie domyślnej CRT punkty wejścia (odpowiednio mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup lub _DllMainCRTStartup).Użycie punktu wejścia alternatywnej, musi ręcznie zainicjować cookie zabezpieczeń, wywołując __security_init_cookie.

Co to jest chroniony

/GS Opcję kompilatora chroni następujące elementy:

  • Adres zwrotny w wywołaniu funkcji.

  • Adres procedury obsługi wyjątków dla funkcji.

  • Parametry funkcji zagrożony.

Na wszystkich platformach /GS próbuje wykryć przekroczenia buforu do adresu zwrotnego.Przekroczenia buforu łatwiej są wykorzystywane na platformach, takich jak x 86 i x 64, których wykorzystanie konwencji wywoływania, przechowujące adres zwrotny funkcji wywołania na stosie.

W architekturze x 86 Jeśli funkcja wykorzystuje procedury obsługi wyjątków, kompilator wstawia cookie zabezpieczeń, aby chronić adres procedury obsługi wyjątków.Plik cookie jest sprawdzana podczas niekontrolowanej ramki.

/GSchroni zagrożony parametrów , są przekazywane do funkcji.Ryzykownym parametrem jest wskaźnik, odwołanie C++, C-strukturą (typ C++ POD), która zawiera wskaźnik lub bufor GS.

Ryzykownym parametrem jest przydzielany przed cookie i zmienne lokalne.Przepełnienie buforu można zastąpić te parametry.A kod w funkcji, która korzysta z tych parametrów może spowodować atak, zanim funkcja zwraca i wykonywane jest sprawdzanie zabezpieczeń.Aby zminimalizować zagrożenie to, kompilator tworzy kopię parametry narażone podczas prolog funkcji i umieszcza je poniżej obszaru magazynowania dla wszelkich buforów.

Kompilator nie oznacza, że kopie zagrożony parametry w następujących sytuacjach:

  • Funkcje, które nie zawierają buforu GS.

  • Optymalizacje (/O opcje) nie są włączone.

  • Funkcje, które mają listę zmiennych, argument (...).

  • Funkcje, które są oznaczone naked.

  • Funkcje, które zawierają kod zestawu wbudowanej w pierwszej instrukcji.

  • Parametr jest używany tylko w sposób mniej prawdopodobne do wykorzystania omawianej luki z przepełnienie buforu.

Co nie jest chroniony

/GS Opcję kompilatora nie chroni przed atakami, zabezpieczeń wszystkich przepełnienie buforu.Na przykład jeśli masz buforu i vtable w obiekcie przepełnienie buforu może spowodować uszkodzenie vtable.

Nawet jeśli używasz /GS, zawsze Staraj się bezpieczny kod, który ma nie przekroczenia buforu.

Aby ustawić tę opcję kompilatora w programie Visual Studio

  1. W Solution Explorer, kliknij prawym przyciskiem myszy projekt, a następnie kliknij przycisk Właściwości.

    Aby uzyskać więcej informacji, zobacz Jak: Otwórz strony właściwości projektu.

  2. W Stron właściwości okno dialogowe, kliknij przycisk C i C++ folder.

  3. Kliknij przycisk Generowanie kodu stronę właściwości.

  4. Modyfikowanie Sprawdzaniu zabezpieczeń buforu właściwości.

Aby programowo ustawić tę opcję kompilatora

Przykład

Próbka ta overruns buforu.To powoduje, że aplikacja się niepowodzeniem w czasie wykonywania.

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

Zobacz też

Informacje

Opcje kompilatora

Ustawianie opcji kompilatora