/GS (Puffer-Sicherheitsüberprüfung)/GS (Buffer Security Check)

Erkennt einige Pufferüberläufe, welche die Rückgabeadresse einer Funktion, eine Ausnahmehandleradresse oder bestimmte Typen von Parametern überschreiben.Detects some buffer overruns that overwrite a function's return address, exception handler address, or certain types of parameters. Einen Pufferüberlauf zu verursachen ist eine von Hackern verwendete Technik, um Code auszunutzen, der keine Puffergrößeneinschränkungen erzwingt.Causing a buffer overrun is a technique used by hackers to exploit code that does not enforce buffer size restrictions.

SyntaxSyntax

/GS[-]

HinweiseRemarks

/ GS ist standardmäßig aktiviert./GS is on by default. Wenn Sie erwarten, die Anwendung keinerlei Sicherheitsrisiken ausgesetzt ist dass, verwenden Sie /GS-.If you expect your application to have no security exposure, use /GS-. Weitere Informationen zum Unterdrücken der pufferüberlauferkennung finden Sie unter Safebuffers.For more information about suppressing buffer overrun detection, see safebuffers.

SicherheitsüberprüfungenSecurity Checks

Bei Funktionen, die vom Compiler als überlaufgefährdet und problematisch eingestuft werden, reserviert der Compiler vor der Rückgabeadresse Speicherplatz auf dem Stapel.On functions that the compiler recognizes as subject to buffer overrun problems, the compiler allocates space on the stack before the return address. Beim Funktionsstart wird mit der zugeordnete Platz bearbeiten geladen eine Sicherheitscookie einmal beim Laden des Moduls berechnet wird.On function entry, the allocated space is loaded with a security cookie that is computed once at module load. Bei Funktionsende und beim Entladen von Rahmen auf 64-Bit-Betriebssystemen wird dann eine Hilfsfunktion aufgerufen, die sicherstellt, dass sich der Wert des Cookies nicht geändert hat.On function exit, and during frame unwinding on 64-bit operating systems, a helper function is called to make sure that the value of the cookie is still the same. Ein abweichender Wert gibt an, dass der Stapel möglicherweise überschrieben wurde.A different value indicates that an overwrite of the stack may have occurred. Ein abweichender Wert führt dazu, dass der Prozess beendet wird.If a different value is detected, the process is terminated.

GS-PufferGS Buffers

Eine Pufferüberlauf-sicherheitsüberprüfung erfolgt auf einer GS-Puffer.A buffer overrun security check is performed on a GS buffer. Ein GS-Puffer kann einer der Folgenden sein:A GS buffer can be one of these:

  • Ein Array, das größer als 4 Bytes ist und über mehr als zwei Elemente sowie einen Elementtyp verfügt, der kein Zeigertyp ist.An array that is larger than 4 bytes, has more than two elements, and has an element type that is not a pointer type.

  • Eine Datenstruktur, die größer als 8 Bytes ist und keine Zeiger enthält.A data structure whose size is more than 8 bytes and contains no pointers.

  • Ein Puffer zugeordnet werden, mithilfe der _alloca Funktion.A buffer allocated by using the _alloca function.

  • Eine beliebige Klasse oder Struktur, die einen GS-Puffer enthält.Any class or structure that contains a GS buffer.

Beispielsweise werden GS-Puffer durch die folgenden Anweisungen deklariert.For example, the following statements declare GS buffers.

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

Die folgenden Anweisungen deklarieren jedoch keine GS-Puffer.However, the following statements do not declare GS buffers. Die ersten beiden Deklarationen enthalten Elemente des Zeigertyps.The first two declarations contain elements of pointer type. Die dritte und vierte Anweisung deklariert Arrays, deren Größe zu klein ist.The third and fourth statements declare arrays whose size is too small. Die fünfte Anweisung deklariert eine Struktur, deren Größe auf einer x86-Plattform nicht mehr als 8 Bytes beträgt.The fifth statement declares a structure whose size on an x86 platform is not more than 8 bytes.

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

Die /GS -Compileroption erfordert, dass das Sicherheitscookie initialisiert werden, bevor alle Funktionen, die das Cookie wird verwendet, die ausgeführt wird.The /GS compiler option requires that the security cookie be initialized before any function that uses the cookie is run. Das Sicherheitscookie muss beim Einstieg in eine EXE oder DLL sofort initialisiert werden.The security cookie must be initialized immediately on entry to an EXE or DLL. Dies erfolgt automatisch bei der Verwendung der standardmäßigen VCRuntime-Einstiegspunkte: MainCRTStartup, WmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup, oder _DllMainCRTStartup.This is done automatically if you use the default VCRuntime entry points: mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup, or _DllMainCRTStartup. Wenn Sie einen alternativen Einstiegspunkt verwenden, müssen Sie das Sicherheitscookie manuell initialisieren, durch den Aufruf "__security_init_cookie".If you use an alternate entry point, you must manually initialize the security cookie by calling __security_init_cookie.

Geschützte InformationenWhat Is Protected

Die /GS -Compileroption schützt folgende Elemente:The /GS compiler option protects the following items:

  • Die Rückgabeadresse eines Funktionsaufrufs.The return address of a function call.

  • Die Adresse eines Ausnahmehandlers für eine Funktion.The address of an exception handler for a function.

  • Anfällige Funktionsparameter.Vulnerable function parameters.

Auf allen Plattformen /GS versucht, Pufferüberläufe in die Rücksprungadresse zu ermitteln.On all platforms, /GS attempts to detect buffer overruns into the return address. Auf Plattformen wie x86 und x64 mit Aufrufkonventionen, durch welche die Rücksprungadresse eines Funktionsaufrufes auf dem Stapel gespeichert wird, lassen sich Pufferüberläufe leichter ausnutzen.Buffer overruns are more easily exploited on platforms such as x86 and x64, which use calling conventions that store the return address of a function call on the stack.

Wird auf x86-Systemen ein Ausnahme-Handler verwendet, fügt der Compiler ein Sicherheitscookie ein, um die Adresse des Ausnahmehandlers zu schützen.On x86, if a function uses an exception handler, the compiler injects a security cookie to protect the address of the exception handler. Dieses Cookie wird beim Entladen von Rahmen überprüft.The cookie is checked during frame unwinding.

/ GS schützt verwundbarer Parameter , die an eine Funktion übergeben werden./GS protects vulnerable parameters that are passed into a function. Ein verwundbarer Parameter ist ein Zeiger, ein C++-Verweis oder eine C-Struktur (C++-POD-Typ), die einen Zeiger oder einen GS-Puffer enthält.A vulnerable parameter is a pointer, a C++ reference, a C-structure (C++ POD type) that contains a pointer, or a GS buffer.

Ein verwundbarer Parameter wird vor dem Cookie und den lokalen Variablen zugeordnet.A vulnerable parameter is allocated before the cookie and local variables. Durch einen Pufferüberlauf kann dieser Parameter überschrieben werden.A buffer overrun can overwrite these parameters. Und der in der Funktion enthaltene Code, der diesen Parameter verwendet, könnte einen Angriff verursachen, bevor der Rücksprung aus der Funktion erfolgt und die Sicherheitsprüfung ausgeführt wird.And code in the function that uses these parameters could cause an attack before the function returns and the security check is performed. Um diese Gefahr zu minimieren, erstellt der Compiler während des Funktionsprologs eine Kopie der verwundbaren Parameter und legt diese unterhalb des Speicherbereichs ab, in dem sich sämtliche Puffer befinden.To minimize this danger, the compiler makes a copy of the vulnerable parameters during the function prolog and puts them below the storage area for any buffers.

Der Compiler erstellt keine Kopien verwundbarer Parameter, wenn folgende Bedingungen erfüllt sind:The compiler does not make copies of vulnerable parameters in the following situations:

  • Funktionen enthalten keinen GS-Puffer.Functions that do not contain a GS buffer.

  • Optimierungen (/o-Optionen) sind nicht aktiviert.Optimizations (/O options) are not enabled.

  • Funktionen verfügen über eine variable Argumentliste (...).Functions that have a variable argument list (...).

  • Funktionen, die mit markierten Felder naked.Functions that are marked with naked.

  • Funktionen enthalten Inlineassemblycode in der ersten Anweisung.Functions that contain inline assembly code in the first statement.

  • Ein Parameter wird nur auf eine Art und Weise verwendet, die im Falle eines Pufferüberlaufs höchstwahrscheinlich nicht ausgenutzt werden kann.A parameter is used only in ways that are less likely to be exploitable in the event of a buffer overrun.

Nicht geschützte InformationenWhat Is Not Protected

Die /GS -Compileroption bietet keinen Schutz vor allen Angriffen Pufferüberlauf.The /GS compiler option does not protect against all buffer overrun security attacks. Wenn ein Objekt beispielsweise einen Puffer und eine vtable enthält, könnte der Pufferüberlauf die vtable beschädigen.For example, if you have a buffer and a vtable in an object, a buffer overrun could corrupt the vtable.

Auch wenn Sie /GS, versuchen immer, sicheren Code zu schreiben, der keine Pufferüberläufe hat.Even if you use /GS, always try to write secure code that has no buffer overruns.

So legen Sie diese Compileroption in Visual Studio festTo set this compiler option in Visual Studio

  1. In Projektmappen-Explorermit der rechten Maustaste auf das Projekt, und klicken Sie dann auf Eigenschaften.In Solution Explorer, right-click the project and then click Properties.

    Weitere Informationen finden Sie unter Working with Project Properties (Arbeiten mit Projekteigenschaften).For more information, see Working with Project Properties.

  2. In der Eigenschaftenseiten Dialogfeld klicken Sie auf die C/C++- Ordner.In the Property Pages dialog box, click the C/C++ folder.

  3. Klicken Sie auf die Codegenerierung Eigenschaftenseite.Click the Code Generation property page.

  4. Ändern der Puffer-Sicherheitsüberprüfung Eigenschaft.Modify the Buffer Security Check property.

So legen Sie diese Compileroption programmgesteuert festTo set this compiler option programmatically

BeispielExample

In diesem Beispiel wird ein Pufferüberlauf stattfinden.This sample overruns a buffer. Dadurch versagt die Anwendung zur Laufzeit.This causes the application to fail at runtime.

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

Siehe auchSee Also

CompileroptionenCompiler Options
Festlegen von CompileroptionenSetting Compiler Options