Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Kernel Address Sanitizer (KASAN) är en teknik för felidentifiering som stöds på Windows-kerneldrivrutiner som gör att du kan identifiera flera klasser av otillåtna minnesåtkomster, till exempel buffertspill och användningsfria händelser. Du måste aktivera KASAN i systemet och kompilera om kerneldrivrutinen med en specifik MSVC-kompilatorflagga.
Pre-requisites
För att kunna använda KASAN behöver du:
- Operativsystemversionen av målsystemet, på vilken kärndrivrutinen kommer att läsas in:
- Klient: Windows 11 24H2 eller senare.
- Server: Windows Server 2025 eller senare.
- VisualStudio: version 17.11 eller senare.
- WDK: version 10.0.26100.2161 eller senare.
KASAN stöds endast på x64.
Så här aktiverar du KASAN på kerneldrivrutinen
Ange följande kommandorad i ett administratörskommandofönster i målsystemet:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1Om du anger den här registernyckeln instrueras Windows-kerneln att förbereda sig för och acceptera inläsning av KASAN-instrumenterade drivrutiner. Om du inte anger den här registernyckeln nekar Windows-kerneln inläsning av KASAN-instrumenterade drivrutiner.
Starta om målsystemet för att ändringen ska börja gälla.
Kompilera om kerneldrivrutinen med KASAN-instrumentation aktiverad genom att skicka en ny flagga till MSVC-kompilatorn. Använd någon av följande metoder:
- GUI: i VisualStudio navigerar du till Solution Explorer, högerklickar på kerneldrivrutinsprojektet och väljer Egenskaper. På egenskapssidan går du till Konfigurationsegenskaper>>C/C++>>Allmänt och anger Aktivera kerneladressspridare till Ja. Återskapa sedan lösningen.
- Kommandotolk: Lägg till parametern /fsanitize=kernel-address i kommandoraden för kompilatorn. Återskapa sedan lösningen.
Läs in den omkompilerade kerneldrivrutinen i målsystemet och stresstesta den som vanligt. KASAN körs vid runtime och rapporterar händelser för ogiltig minnesåtkomst via Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS.
Regression i Visual Studio 17,12
Om du använder VisualStudio 17.12 kan det uppstå följande build-fel:
error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function
Du kan kringgå det här felet genom att lägga till följande flagga på länkarkommandoraden:
/alternatename:__asan_wrap_wcscat=wcscat
Denna regression har åtgärdats i VisualStudio 17.14.15.
Regression i Visual Studio 17.14 till 17.14.14
Om du använder VisualStudio 17.14 kan det uppstå följande build-fel:
error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME
Du kan kringgå det här felet genom att lägga till följande flagga på kommandoraden för kompilatorn:
/fno-sanitize-address-asan-compat-lib
Lägg till följande flaggor till din länkares kommandorad:
/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy
Denna regression har åtgärdats i VisualStudio 17.14.15.
Så här kontrollerar du att KASAN är aktiverat på kerneldrivrutinen
Kerneldrivrutinerna som kompilerats med KASAN har ett PE-avsnitt med namnet "KASAN". Kontrollera att KASAN är aktiverat på drivrutinen genom att köra följande kommando i en kommandotolk för utvecklare:
dumpbin /ALL YourDriver.sys
Om utdata innehåller ett avsnitt med namnet "KASAN" aktiveras KASAN på drivrutinen.
Så här analyserar du KASAN-rapporter
När KASAN identifierar en ogiltig minnesåtkomst i drivrutinen utfärdar den felkontroll 0x1F2: KASAN_ILLEGAL_ACCESS. Granska den genererade kernelminnedumpen för att avgöra exakt var drivrutinen utförde en otillåten minnesåtkomst.
Använd KASAN med en kärnfelsökare kopplad till det målsystemet så att minnet kan inspekteras dynamiskt så snart som felkontroll utfärdas, i stället för post mortem med en minnesdump.
Parametrar för buggkontroll
Parametrarna för felkontroll 0x1F2: KASAN_ILLEGAL_ACCESS är:
- Parameter 1: Adress som används olagligt.
- Parameter 2: Storleken på minnesåtkomsten.
- Parameter 3: Adressen till anroparen som utför den otillåtna minnesåtkomsten.
- Parameter 4: Extra information om minnesåtkomst:
- Bitar [0:7]: KASAN-skuggkoden. Se tabellen nedan.
- Bit 8:
1om åtkomsten var en skrivning,0om det var en läsning.
KASAN-skuggkoder
I KASAN anser vi att allt kernelminne är uppdelat i sammanhängande segment med åtta bytesjusterade celler med åtta byte. Med KASAN har varje cell med åtta byte i kernelminnet en skuggkod som är associerad med den, vilket är ett heltal med en byte som anger cellens giltighet. Kodningen av skuggkoderna är följande:
| Value | Meaning |
|---|---|
0x00 |
Cellen är helt giltig: åtkomsten till alla åtta byte av cellen är laglig. |
0x01 ->0x07 |
Cellen är delvis giltig: de första värdebytena i cellen är giltiga, men resten är ogiltiga. |
0x08 ->0x7F |
Cellen är villkorligt giltig: åtkomst till alla åtta byte av cellen kan vara laglig eller olaglig beroende på specifika villkor. |
>= 0x80 |
Cellen är helt ogiltig: åtkomsten till alla åtta byte av cellen är ogiltig. |
Flera underkoder används för de villkorligt giltiga och helt ogiltiga cellerna för att ytterligare ange vilken typ av minne cellen är associerad med och varför åtkomsten till den kan vara olaglig.
Underkoder som används av villkorligt giltiga celler:
-
0x09: Växlingsbart minne, vilket är olagligt att komma åt vid DISPATCH_LEVEL eller högre, men lagligt att komma åt annars.
Underkoder som används av helt ogiltiga celler:
-
0x81: vänster rödzon av alloca. -
0x82: den mellersta röda zonen av alloca. -
0x83: höger rödzon av alloca. -
0x84: höger rödzon för global variabel. -
0x85: generisk röd zon. -
0x86: höger redzone av poolminne. -
0x87: ledigt poolminne. -
0x8A: vänster rödzon av sammanhängande minne. -
0x8B: höger "redzone" av sammanhängande minne. -
0x8C: frigör lookasidelist-minne. -
0x8D: vänster redzone av poolminne. -
0xF1: vänster rödzon för stackvariabeln. -
0xF2: mellanrödzon för stackvariabel. -
0xF3: höger rödzon för stackvariabeln. -
0xF5: stackvariabeln för "used-after-ret". -
0xF8: stackvariabel utanför omfånget.
Förstå KASAN-buggkontroller: ett exempel
Anta att KASAN utfärdade en felkontroll när drivrutinen kördes med följande parametrar:
- Parameter 1:
0xFFFFFFFFFFFFABCD - Parameter 2:
0x0000000000000004 - Parameter 3:
0xFFFFFFFF12345678 - Parametern 4:
0x0000000000000184
Parameter 1 anger att drivrutinen försökte komma åt adressen 0xFFFFFFFFFFFFABCD och att den här åtkomsten var ogiltig.
Parameter 2 anger att det var en åtkomst på fyra byte.
Parameter 3 ger dig adressen till instruktionspekare där din drivrutin utförde den olagliga åtkomsten.
Parameter 4 anger att detta var en skrivåtkomst och att minnet som berördes var rätt rödzon för en global variabel.
Med andra ord försökte drivrutinen förmodligen utföra en buffertöverskrivning på en global variabel. Använd den här informationen för att undersöka och avgöra var och hur du åtgärdar felet i drivrutinen.
Prestandapåverkan av KASAN
KASAN ökar förbrukningen av kernelminne och medför en ungefärlig två gånger långsammare inbromsning i drivrutiner som kompilerats med KASAN aktiverat.
Jämförelse med drivrutinskontrollverktyget
KASAN och Drivrutinsverifierare är helt separata funktioner, men är ömsesidigt kompatibla.
KASAN fokuserar på att identifiera otillåtna minnesåtkomster och är effektivare än drivrutinsverifierare i den domänen, eftersom det använder en mer detaljerad metod och omfattar fler minnesregioner. Drivrutinsverifieraren har drivrutinsspecifika regler som syftar till att hitta andra typer av buggar, som KASAN inte identifierar. För mer information, se Microsoft: Introduktion av kernelsäkerhetssystem på Microsoft-plattformar.
Använd KASAN tillsammans med drivrutinsverifieraren för att maximera identifieringen av buggar i drivrutinen.