Kerneladressen-Sanitizer (KASAN)
Der Kernel Address Sanitizer (KASAN) ist eine Fehlererkennungstechnologie, die von Windows-Kerneltreibern unterstützt wird, mit der Sie mehrere Klassen illegaler Speicherzugriffe erkennen können, z. B. Pufferüberläufe und Use-after-free-Ereignisse. Es erfordert, dass Sie KASAN auf Ihrem System aktivieren und den Kerneltreiber mit einem bestimmten MSVC-Compilerflagge neu kompilieren.
Voraussetzungen
Um KASAN zu verwenden, benötigen Sie Folgendes:
- Betriebssystemversion des Zielsystems, auf dem Ihr Kerneltreiber geladen wird:
- Client: Windows 11 24H2 oder höher.
- Server: Windows Server 2025 oder höher.
- VisualStudio: Version 17.11 oder höher.
- WDK: Version 10.0.26100.2161 oder höher.
KASAN wird nur auf x64 unterstützt.
So aktivieren Sie KASAN auf Ihrem Kerneltreiber
Geben Sie die folgende Befehlszeile in ein Administrator-Eingabeaufforderungsfenster im Zielsystem ein:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
Starten Sie das Zielsystem neu, damit die Änderung wirksam wird.
Kompilieren Sie Ihren Kerneltreiber mit aktivierter KASAN-Instrumentierung, indem Sie ein neues Flag an den MSVC-Compiler übergeben. Verwenden Sie eine der folgenden beiden Methoden:
- GUI: Navigieren Sie in VisualStudio zum Projektmappen-Explorer, klicken Sie mit der rechten Maustaste auf Ihr Kerneltreiberprojekt, und wählen Sie "Eigenschaften" aus. Navigieren Sie auf der Eigenschaftenseite zu Konfigurationseigenschaften>>C/C++>>, und legen Sie "Kerneladressenbereinigung aktivieren" auf "Ja" fest. Erstellen Sie dann Ihre Lösung neu.
- Eingabeaufforderung: Fügen Sie den Parameter "/fsanitize=kernel-address " zur Befehlszeile des Compilers hinzu. Erstellen Sie dann Ihre Lösung neu.
Laden Sie ihren neu kompilierten Kerneltreiber auf Ihr Zielsystem, und testen Sie ihn wie üblich. KASAN arbeitet zur Laufzeit und meldet illegale Speicherzugriffsereignisse über Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS.
So überprüfen Sie, ob KASAN auf Ihrem Kerneltreiber aktiviert ist
Die mit KASAN kompilierten Kerneltreiber verfügen über einen PE-Abschnitt namens "KASAN
". Vergewissern Sie sich, dass KASAN auf Ihrem Treiber aktiviert ist, indem Sie den folgenden Befehl in einer Entwickler-Eingabeaufforderung ausführen:
dumpbin /ALL YourDriver.sys
Wenn die Ausgabe einen Abschnitt namens "KASAN
" enthält, ist KASAN auf Ihrem Treiber aktiviert.
Analysieren von KASAN-Berichten
Wenn KASAN einen unzulässigen Speicherzugriff in Ihrem Treiber erkennt, gibt es Fehlerüberprüfungen 0x1F2: KASAN_ILLEGAL_ACCESS. Überprüfen Sie das generierte Kernelspeicherabbild, um zu ermitteln, wo genau Ihr Treiber einen ungültigen Speicherzugriff ausgeführt hat.
Verwenden Sie KASAN mit einem Kerneldebugger, der an das Zielsystem angefügt ist, damit der Speicher dynamisch überprüft werden kann, sobald die Fehlerüberprüfung ausgestellt wird, anstatt nach der Mortem-Prüfung mit einem Speicherabbild.
Fehlerüberprüfungsparameter
Die Parameter der Fehlerüberprüfung 0x1F2: KASAN_ILLEGAL_ACCESS sind:
- Parameter 1: Illegaler Zugriff auf die Adresse.
- Parameter 2: Größe des Speicherzugriffs.
- Parameter 3: Adresse des Aufrufers, der den unzulässigen Speicherzugriff ausführt.
- Parameter 4: Zusätzliche Informationen zum Speicherzugriff:
- Bits [0:7]: der KASAN-Schattencode. Siehe Tabelle unten.
- Bit 8:
1
Wenn der Zugriff ein Schreibvorgang war,0
wenn es sich um einen Lesevorgang handelte.
KASAN-Schattencodes
In KASAN stellen wir fest, dass der gesamte Kernelspeicher in zusammenhängenden Blöcken von acht byte ausgerichteten, acht Bytezellen geteilt wird. Bei KASAN weist jede Acht-Byte-Zelle im Kernelspeicher einen Schattencode auf. Dabei handelt es sich um eine ganzzahlige Zahl mit einem Byte, die die Gültigkeit der Zelle angibt. Die Codierung der Schattencodes lautet wie folgt:
Wert | Bedeutung |
---|---|
0x00 |
Die Zelle ist vollständig gültig: Der Zugriff auf alle acht Bytes der Zelle ist zulässig. |
0x01 ->0x07 |
Die Zelle ist teilweise gültig: Der erste Wert in der Zelle ist gültig, aber der Rest ist ungültig. |
>= 0x80 |
Die Zelle ist vollständig ungültig: Der Zugriff auf alle acht Bytes der Zelle ist unzulässig. |
Mehrere Untercodes werden für die vollständig ungültigen Zellen verwendet, um weiter anzugeben, welchem Speichertyp die Zelle zugeordnet ist und warum sie ungültig ist:
0x81
: linke rote Zone von alloca.0x82
: mittlere rote Zone von alloca.0x83
: rechte rote Zone von alloca.0x84
: rechte rote Zone der globalen Variablen.0x85
: generische Redzone.0x86
: rechter roter Bereich des Poolspeichers.0x87
: Freigegebener Speicher.0x8A
: linke rote Zone des zusammenhängenden Speichers.0x8B
: rechte rote Zone des zusammenhängenden Speichers.0x8C
: Freigegebener Lookasidelist-Speicher.0x8D
: linke rote Zone des Poolspeichers.0xF1
: linke rote Zone der Stapelvariable.0xF2
: mittlere roter Bereich der Stapelvariable.0xF3
: rechte rote Zone der Stapelvariable.0xF5
: used-after-ret stack variable.0xF8
: Out-of-Scope Stack Variable.
Grundlegendes zu KASAN-Fehlerüberprüfungen: ein Beispiel
Gehen Sie davon aus, dass KASAN beim Ausführen des Treibers eine Fehlerüberprüfung mit den folgenden Parametern ausgestellt hat:
- Parameter 1:
0xFFFFFFFFFFFFABCD
- Parameter 2:
0x0000000000000004
- Parameter 3:
0xFFFFFFFF12345678
- Parameter 4:
0x0000000000000184
Parameter 1 teilt Ihnen mit, dass Ihr Treiber versucht hat, auf die Adresse 0xFFFFFFFFFFFFABCD
zuzugreifen und dass dieser Zugriff illegal war. Parameter 2 teilt Ihnen mit, dass es sich um einen Vier-Byte-Zugriff handelte. Mit Parameter 3 erhalten Sie die Adresse des Anweisungszeigers, an dem Ihr Fahrer den illegalen Zugriff ausgeführt hat. Parameter 4 teilt Ihnen mit, dass es sich um einen Schreibzugriff handelte und dass der zu berührende Speicher die rechte rote Zone einer globalen Variablen war.
Mit anderen Worten, Ihr Treiber hat wahrscheinlich versucht, einen Schreibpufferüberlauf für eine globale Variable auszuführen. Verwenden Sie diese Informationen, um zu untersuchen und zu bestimmen, wo und wie sie diesen Fehler in Ihrem Treiber beheben können.
Leistungseinbußen von KASAN
KASAN erhöht den Kernelspeicherverbrauch und führt zu einer ungefähren zweifachen Verlangsamung von Treibern, die mit kasan aktivierter KASAN kompiliert wurden.
Vergleich mit Driver Verifier
KASAN und Driver Verifier sind völlig separate Features, sind aber gegenseitig kompatibel.
KASAN konzentriert sich auf die Erkennung illegaler Speicherzugriffe und ist effizienter als driver Verifier in dieser Domäne, da er einen feineren Ansatz verwendet und mehr Speicherbereiche abdeckt. Driver Verifier verfügt über treiberspezifische Regeln, die darauf abzielen, andere Arten von Fehlern zu finden, die KASAN nicht erkennt. Weitere Informationen finden Sie unter Microsoft: Einführung von Kernel-Sanitizern auf Microsoft-Plattformen.
Verwenden Sie KASAN in Verbindung mit Driver Verifier, um die Erkennung von Fehlern in Ihrem Treiber zu maximieren.