Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Kernel Address Sanitizer (KASAN) è una tecnologia di rilevamento dei bug supportata nei driver kernel di Windows che consente di rilevare diverse classi di accessi non validi alla memoria, ad esempio gli overflow del buffer e gli eventi senza utilizzo. È necessario abilitare KASAN nel sistema e ricompilare il driver del kernel con un flag del compilatore MSVC specifico.
Pre-requisites
Per usare KASAN, è necessario:
- Versione del sistema operativo del sistema di destinazione in cui verrà caricato il driver del kernel:
- Client: Windows 11 24H2 o versione successiva.
- Server: Windows Server 2025 o versione successiva.
- VisualStudio: versione 17.11 o successiva.
- WDK: versione 10.0.26100.2161 o successiva.
KASAN è supportato solo in x64.
Come abilitare KASAN nel driver del kernel
Immettere la riga di comando seguente in una finestra del prompt dei comandi dell'amministratore nel sistema di destinazione:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1L'impostazione di questa chiave del Registro di sistema indica al kernel di Windows di prepararsi e accettare il caricamento dei driver instrumentati KASAN. Non impostando questa chiave del Registro di sistema, il kernel di Windows rifiuta il caricamento dei driver instrumentati KASAN.
Riavviare il sistema di destinazione per rendere effettiva la modifica.
Ricompilare il driver del kernel con la strumentazione KASAN abilitata passando un nuovo flag al compilatore MSVC. Usare uno dei metodi seguenti:
- GUI: in VisualStudio passare a Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto del driver kernel e selezionare Proprietà. Nella pagina delle proprietà passare a Proprietà>> di configurazioneC/C++>>Generale e impostare Enable Kernel Address Sanitizer su Sì. Ricompilare quindi la soluzione.
- Prompt dei comandi: aggiungere il parametro /fsanitize=kernel-address alla riga di comando del compilatore. Ricompilare quindi la soluzione.
Caricare il driver kernel ricompilato nel sistema di destinazione e testarlo come di solito. KASAN opera in fase di esecuzione e segnala eventi di accesso alla memoria non validi tramite il controllo dei bug 0x1F2: KASAN_ILLEGAL_ACCESS.
Regressione in VisualStudio 17.12
Se si usa VisualStudio 17.12, è possibile che venga visualizzato l'errore di compilazione seguente:
error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function
È possibile risolvere questo errore aggiungendo il flag seguente alla riga di comando del linker:
/alternatename:__asan_wrap_wcscat=wcscat
Questa regressione è stata corretta in VisualStudio 17.14.15.
Regressione in VisualStudio da 17.14 a 17.14.14
Se si usa VisualStudio 17.14, è possibile che si verifichi l'errore di compilazione seguente:
error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME
È possibile risolvere questo errore aggiungendo il flag seguente alla riga di comando del compilatore:
/fno-sanitize-address-asan-compat-lib
Aggiungi i seguenti flag alla riga di comando del linker:
/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy
Questa regressione è stata corretta in VisualStudio 17.14.15.
Come verificare che KASAN sia abilitato nel driver del kernel
I driver del kernel compilati con KASAN hanno una sezione PE denominata "KASAN". Verificare che KASAN sia abilitato nel driver eseguendo il comando seguente in un prompt dei comandi per gli sviluppatori:
dumpbin /ALL YourDriver.sys
Se l'output contiene una sezione denominata "KASAN", KASAN viene abilitato nel driver.
Come analizzare i report KASAN
Quando KASAN rileva un accesso non valido alla memoria nel driver, rilascia il controllo dei bug 0x1F2: KASAN_ILLEGAL_ACCESS. Esaminare il dump della memoria del kernel generato per determinare dove esattamente il driver ha eseguito un accesso non valido alla memoria.
Usare KASAN con un debugger del kernel collegato al sistema di destinazione in modo che la memoria possa essere ispezionata dinamicamente non appena viene eseguito il controllo dei bug, anziché post-mortem con un dump della memoria.
Parametri di controllo dei bug
I parametri di Controllo bug 0x1F2: KASAN_ILLEGAL_ACCESS sono:
- Parametro 1: indirizzo a cui si accede illegalmente.
- Parametro 2: dimensioni dell'accesso alla memoria.
- Parametro 3: indirizzo del chiamante che esegue l'accesso alla memoria non valido.
- Parametro 4: informazioni aggiuntive sull'accesso alla memoria:
- Bit [0:7]: codice shadow KASAN. Vedere la tabella riportata di seguito.
- Bit 8:
1se l'accesso è stato scritto,0se si tratta di una lettura.
Codici shadow KASAN
In KASAN si considera che tutta la memoria del kernel è divisa in blocchi contigui di celle allineate a otto byte, ciascuna di otto byte. Con KASAN, a ogni cella a otto byte nella memoria kernel è associato un codice shadow , ovvero un numero intero a un byte che indica la validità della cella. La codifica dei codici shadow è la seguente:
| Value | Meaning |
|---|---|
0x00 |
La cella è completamente valida: gli accessi a tutti e otto byte della cella sono validi. |
0x01 ->0x07 |
La cella è parzialmente valida: i primi byte di valore nella cella sono validi, ma il resto non è valido. |
0x08 ->0x7F |
La cella è valida in modo condizionale: gli accessi a tutti e otto byte della cella possono essere legali o illegali a seconda di condizioni specifiche. |
>= 0x80 |
La cella non è valida: gli accessi a tutti e otto byte della cella non sono validi. |
Diversi codici secondari vengono usati per le celle valide e completamente non valide in modo condizionale per indicare ulteriormente il tipo di memoria a cui è associata la cella e perché l'accesso a esso potrebbe essere illegale.
Codici secondari usati da celle con validità condizionata
-
0x09: memoria paginabile, a cui è illegale accedere a DISPATCH_LEVEL o superiore, ma legale accedere in caso contrario.
Codici secondari usati da celle del tutto non valide
-
0x81: zona rossa sinistra di alloca. -
0x82: zona rossa centrale di alloca. -
0x83: zona rossa destra di alloca. -
0x84: zona rossa destra della variabile globale. -
0x85: zona rossa generica. -
0x86: zona rossa destra della memoria del pool. -
0x87: memoria del pool liberata. -
0x8A: zona rossa sinistra della memoria contigua. -
0x8B: zona rossa destra della memoria contigua. -
0x8C: memoria lookasidelist liberata. -
0x8D: zona rossa sinistra della memoria del pool. -
0xF1: zona rossa sinistra della variabile dello stack. -
0xF2: zona rossa centrale della variabile dello stack. -
0xF3: zona rossa destra della variabile dello stack. -
0xF5: variabile dello stack used-after-ret. -
0xF8: variabile dello stack out-of-scope.
Informazioni sui controlli dei bug KASAN: esempio
Si supponga che KASAN abbia emesso un controllo di bug durante l'esecuzione del driver, con questi parametri:
- Parametro 1:
0xFFFFFFFFFFFFABCD - Parametro 2:
0x0000000000000004 - Parametro 3:
0xFFFFFFFF12345678 - Parametro 4:
0x0000000000000184
Il parametro 1 indica che il driver ha tentato di accedere all'indirizzo 0xFFFFFFFFFFFFABCD e che l'accesso non è valido.
Il parametro 2 indica che si tratta di un accesso a quattro byte.
Il parametro 3 fornisce l'indirizzo del puntatore di istruzione in cui il driver ha eseguito l'accesso non valido.
Il parametro 4 indica che si tratta di un accesso in scrittura e che la memoria toccato è la zona rossa destra di una variabile globale.
In altre parole, è probabile che il driver tenti di eseguire un overflow del buffer di scrittura su una variabile globale. Usare queste informazioni per analizzare e determinare dove e come correggere il bug nel driver.
Impatto sulle prestazioni di KASAN
KASAN aumenta il consumo di memoria del kernel e introduce un rallentamento approssimativo di due volte nei driver compilati con KASAN abilitato.
Confronto con Driver Verifier
KASAN e Driver Verifier sono funzionalità completamente separate, ma sono reciprocamente compatibili.
KASAN è incentrato sul rilevamento di accessi in memoria non validi ed è più efficiente rispetto a Driver Verifier in tale dominio, perché usa un approccio più granulare e copre più aree di memoria. Driver Verifier include regole specifiche del driver che mirano a trovare altri tipi di bug, che KASAN non rileva. Per altre informazioni, vedere Microsoft: Introduzione ai sanificatori kernel nelle piattaforme Microsoft.
Usare KASAN insieme a Driver Verifier per ottimizzare il rilevamento dei bug nel driver.