Désinfecteur d’adresse du noyau (KASAN)
L’assainisseur d’adresses du noyau (KASAN) est une technologie de détection de bogues prise en charge sur les pilotes de noyau Windows qui vous permet de détecter plusieurs classes d’accès à la mémoire illégale, telles que les dépassements de mémoire tampon et les événements sans utilisation. Il vous oblige à activer KASAN sur votre système et à recompiler votre pilote de noyau avec un indicateur de compilateur MSVC spécifique.
Conditions préalables
Pour utiliser KASAN, vous avez besoin des éléments suivants :
- Version du système d’exploitation cible sur laquelle votre pilote de noyau sera chargé :
- Client : Windows 11 24H2 ou version ultérieure.
- Serveur : Windows Server 2025 ou version ultérieure.
- VisualStudio : version 17.11 ou ultérieure.
- WDK : version 10.0.26100.2161 ou ultérieure.
Comment activer KASAN sur votre pilote de noyau
Entrez la ligne de commande suivante dans une fenêtre d’invite de commandes administrateur sur le système cible :
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
Redémarrez votre système cible pour que la modification prenne effet.
Recompilez votre pilote de noyau avec l’instrumentation KASAN activée en passant un nouvel indicateur au compilateur MSVC. Utilisez l'une des méthodes suivantes :
- GUI : dans VisualStudio, accédez au Explorateur de solutions, cliquez avec le bouton droit sur votre projet de pilote de noyau, puis sélectionnez Propriétés. Dans la page de propriétés, accédez à Propriétés>>de configuration C/C++>>Général, puis définissez Activer le nettoyage de l’adresse du noyau sur Oui. Régénérez ensuite votre solution.
- Invite de commandes : ajoutez le paramètre /fsanitize=kernel-address à votre ligne de commande du compilateur. Ensuite, régénérez votre solution.
Chargez votre pilote de noyau recompilé sur votre système cible et testez-le comme vous le feriez habituellement. KASAN fonctionne au moment de l’exécution et signale des événements d’accès à la mémoire illégal via la vérification des bogues 0x1F2 : KASAN_ILLEGAL_ACCESS.
Comment vérifier que KASAN est activé sur votre pilote de noyau
Les pilotes de noyau compilés avec KASAN ont une section PE appelée «KASAN
». Vérifiez que KASAN est activé sur votre pilote en exécutant la commande suivante dans une invite de commandes développeur :
dumpbin /ALL YourDriver.sys
Si la sortie contient une section appelée «KASAN
», kasan est activé sur votre pilote.
Comment analyser les rapports KASAN
Quand KASAN détecte un accès à la mémoire illégal dans votre pilote, il émet une vérification des bogues 0x1F2 : KASAN_ILLEGAL_ACCESS. Inspectez le vidage de mémoire du noyau généré pour déterminer où exactement votre pilote a effectué un accès à la mémoire illégale.
Utilisez KASAN avec un débogueur de noyau attaché au système cible afin que la mémoire puisse être inspectée dynamiquement dès que la vérification du bogue est émise, plutôt que post-mortem avec un vidage de mémoire.
Paramètres de vérification des bogues
Les paramètres de 0x1F2 de vérification des bogues : KASAN_ILLEGAL_ACCESS sont les suivants :
- Paramètre 1 : Adresse accessible illégalement.
- Paramètre 2 : Taille de l’accès à la mémoire.
- Paramètre 3 : Adresse de l’appelant effectuant l’accès à la mémoire illégale.
- Paramètre 4 : Informations supplémentaires sur l’accès à la mémoire :
- Bits [0:7] : code d’ombre KASAN. Consultez le tableau ci-dessous.
- Bit 8 :
1
si l’accès était une écriture,0
s’il s’agissait d’une lecture.
Codes d’ombre KASAN
Dans KASAN, nous considérons que toutes les mémoires du noyau sont divisées en blocs contigus de cellules alignées sur huit octets et sur huit octets. Avec KASAN, chaque cellule de huit octets dans la mémoire du noyau a un code d’ombre associé à celui-ci, qui est un entier d’un octet qui indique la validité de la cellule. L’encodage des codes d’ombre est le suivant :
Valeur | Signification |
---|---|
0x00 |
La cellule est entièrement valide : les accès aux huit octets de la cellule sont légaux. |
0x01 ->0x07 |
La cellule est partiellement valide : les premiers octets de la cellule sont valides, mais le reste n’est pas valide. |
>= 0x80 |
La cellule n’est pas valide : les accès aux huit octets de la cellule ne sont pas valides. |
Plusieurs sous-codes sont utilisés pour les cellules entièrement non valides pour indiquer davantage le type de mémoire auquel la cellule est associée et pourquoi elle n’est pas valide :
0x81
: zone rouge gauche de alloca.0x82
: zone rouge moyenne d’alloca.0x83
: zone rouge droite de alloca.0x84
: zone rouge droite de la variable globale.0x85
: zone rouge générique.0x86
: zone rouge droite de la mémoire du pool.0x87
: mémoire libérée.0x8A
: zone rouge gauche de la mémoire contiguë.0x8B
: zone rouge droite de la mémoire contiguë.0x8C
: mémoire lookasidelist libérée.0x8D
: zone rouge gauche de la mémoire du pool.0xF1
: zone rouge gauche de la variable de pile.0xF2
: zone rouge moyenne de la variable de pile.0xF3
: zone rouge droite de la variable de pile.0xF5
: variable de pile after-ret utilisée.0xF8
: variable de pile hors portée.
Comprendre les vérifications de bogues KASAN : exemple
Supposons que KASAN a émis une vérification de bogue lors de l’exécution de votre pilote, avec les paramètres suivants :
- Paramètre 1 :
0xFFFFFFFFFFFFABCD
- Paramètre 2 :
0x0000000000000004
- Paramètre 3 :
0xFFFFFFFF12345678
- Paramètre 4 :
0x0000000000000184
Le paramètre 1 vous indique que votre pilote a essayé d’accéder à l’adresse 0xFFFFFFFFFFFFABCD
et que cet accès était illégal. Le paramètre 2 vous indique qu’il s’agissait d’un accès à quatre octets. Le paramètre 3 vous donne l’adresse du pointeur d’instruction auquel votre pilote a effectué l’accès illégal. Le paramètre 4 vous indique qu’il s’agissait d’un accès en écriture et que la mémoire touchée était la zone rouge droite d’une variable globale.
En d’autres termes, votre pilote a probablement essayé d’effectuer un dépassement de mémoire tampon d’écriture sur une variable globale. Utilisez ces informations pour examiner et déterminer où et comment résoudre ce bogue dans votre pilote.
Impact sur les performances de KASAN
KASAN augmente la consommation de mémoire du noyau et introduit un ralentissement approximatif de deux fois dans les pilotes compilés avec KASAN activé.