Kernel Address Sanitizer (KASAN)
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.
Prerequisiti
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 1
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 al Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto del driver kernel e scegliere Proprietà. Nella pagina delle proprietà passare a Proprietà>>di configurazione C/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.
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:
1
se l'accesso è stato scritto,0
se 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 e 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:
Valore | Significato |
---|---|
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. |
>= 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 completamente non valide per indicare ulteriormente il tipo di memoria a cui è associata la cella e il motivo per cui non è valido:
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 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 all'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.