Freigeben über


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

  1. 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
    
  2. Starten Sie das Zielsystem neu, damit die Änderung wirksam wird.

  3. 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.
  4. 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:

  1. Parameter 1: Illegaler Zugriff auf die Adresse.
  2. Parameter 2: Größe des Speicherzugriffs.
  3. Parameter 3: Adresse des Aufrufers, der den unzulässigen Speicherzugriff ausführt.
  4. 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:

  1. Parameter 1: 0xFFFFFFFFFFFFABCD
  2. Parameter 2: 0x0000000000000004
  3. Parameter 3: 0xFFFFFFFF12345678
  4. 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.

Ressourcen