/GS (Kontrola zabezpečení vyrovnávací paměti)
Zjistí-li některé chyby přetečení vyrovnávací paměti, které přepisují funkce zpáteční adresa, adresa popisovač výjimky nebo určité typy parametrů.Způsobuje přetečení vyrovnávací paměti je technika používaná hackerů k škodlivý kód, který nevynucuje omezení velikosti vyrovnávací paměti.
/GS[-]
Poznámky
/GSje ve výchozím nastavení.Pokud očekáváte, že aplikace mít žádné ohrožení zabezpečení, použijte /GS-.Další informace o /GS, viz Kompilátor zabezpečení kontroly v hloubku.Další informace o potlačení rozpoznávání přetečení vyrovnávací paměti viz safebuffers.
Kontroly zabezpečení
Na funkce, které kompilátor rozpozná jako podléhají problémy přetečení vyrovnávací paměti kompilátor alokuje místa v zásobníku před zpáteční adresu.Funkce položky přidělené místo načtena s zabezpečení souborů cookie , který je vypočítávána jednou při načtení modulu.Při ukončení funkce a během snímku příkazem v 64bitových operačních systémech pomocné funkce se nazývá zajistit, že hodnota souboru cookie je stále stejný.Jiné hodnoty označuje pravděpodobně došlo přepsání zásobníku.Pokud je zjištěn jinou hodnotu, proces ukončen.
GS vyrovnávacích pamětí
Je provedena kontrola zabezpečení přetečení vyrovnávací paměti v GS vyrovnávací paměti.GS vyrovnávací paměti může být jeden z těchto:
Matice, která je větší než 4 bajty, má více než dva prvky a typ prvku, který není typu ukazatel.
Struktura dat, jejichž velikost je větší než 8 bajtů a obsahuje žádné ukazatele.
Vyrovnávací paměť pomocí přidělených _alloca funkce.
Třídy nebo struktury, která obsahuje vyrovnávací paměti GS.
Následující příkazy například deklarovat GS vyrovnávacích pamětí.
char buffer[20];
int buffer[20];
struct { int a; int b; int c; int d; } myStruct;
struct { int a; char buf[20]; };
Následující příkazy však není deklarovat GS vyrovnávacích pamětí.První dvě prohlášení obsahovat prvky typu ukazatel.Třetí a čtvrté příkazy prohlásit pole, jehož velikost je příliš malá.Pátý prohlášení prohlašuje struktury, jejichž velikost na platformě x 86 není více než 8 bajtů.
char *pBuf[20];
void *pv[20];
char buf[4];
int buf[2];
struct { int a; int b; };
Inicializace zabezpečení souborů Cookie
/GS Vyžaduje kompilátor možnost inicializovat soubor cookie zabezpečení před spuštěním libovolné funkce, která používá soubor cookie.Zabezpečení souborů cookie musí být inicializována položky EXE nebo DLL.To se provádí automaticky při použití výchozí CRT vstupní body (mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup nebo _DllMainCRTStartup).Pokud používáte alternativní vstupní bod, musíte inicializovat soubor cookie zabezpečení ručně voláním __security_init_cookie.
Co je chráněn
/GS Volba kompilátoru chrání následující položky:
Zpáteční adresa volání funkce.
Adresa popisovač výjimky pro funkci.
Parametry funkce ohroženy.
Na všech platformách /GS pokusí rozpoznat chyby přetečení vyrovnávací paměti do zpáteční adresu.Přeběhy vyrovnávací paměti jsou snadno zneužít na platformách x 86 a x 64, které použití volající konvencí ukládat zpáteční adresu funkce volání v zásobníku.
X 86 Pokud funkce používá popisovač výjimky kompilátor injects zabezpečení cookie chránit adresu zpracování výjimek.Soubor cookie je kontrolována během snímku příkazem.
/GSchrání parametry ohrožené , jsou předány do funkce.Ohrožené parametr je ukazatel, reference C++, C-struktuře (typ LUSKU C++), která obsahuje ukazatel nebo vyrovnávací paměti GS.
Ohrožené parametr přidělena před místní proměnné a souborů cookie.Přetečení vyrovnávací paměti mohou přepsat tyto parametry.A kód funkce, která používá tyto parametry může způsobit útok, vrátí funkce a je provedena kontrola zabezpečení.Minimalizaci tohoto nebezpečí, kompilátor vytvoří kopii parametry ohrožené během funkce prologu a dostanou pod oblast úložiště pro všechny vyrovnávací paměti.
Kompilátor neprovede kopie ohrožen parametry v následujících situacích:
Funkce, které neobsahují GS vyrovnávací paměti.
Optimalizace (/O možnosti) nejsou povoleny.
Funkce, které mají Proměnný seznam argumentů (...).
Funkce, které jsou označeny holé.
Funkce, které obsahují kód v prvním příkazu sestavení.
Parametr se používá pouze způsobem, který je méně pravděpodobné, že využitelné v případě, že přetečení vyrovnávací paměti.
Co není chráněn
/GS Volba kompilátoru neposkytuje ochranu proti všem útokům zabezpečení přetečení vyrovnávací paměti.Například pokud máte vyrovnávací paměti a virtuální tabulka v objektu, přetečení vyrovnávací paměti může způsobit poškození virtuální tabulka.
I když použijete /GS, vždy se pokuste psát zabezpečený kód, který nemá žádné chyby přetečení vyrovnávací paměti.
Nastavení této možnosti kompilátoru Visual Studio
V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt a potom klikněte na Vlastnosti.
Další informace naleznete v tématu Jak: otevření stránky vlastností projektu.
V Stránky vlastností dialogové okno, klepněte C/C++ složky.
Klepněte Generování kódu stránky vlastností.
Změnit Kontrola zabezpečení vyrovnávací paměti vlastnost.
Programově nastavit tuto volbu kompilátoru
- Viz téma BufferSecurityCheck.
Příklad
Tento vzorek způsobí přetečení vyrovnávací paměti.To způsobí chybu za běhu aplikace.
// 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);
}