Saneador de dirección del kernel (KASAN)
Kernel Address Sanitizer (KASAN) es una tecnología de detección de errores compatible con controladores de kernel de Windows que permite detectar varias clases de accesos de memoria no válidos, como desbordamientos de búfer y eventos de uso después de liberar. Requiere habilitar KASAN en el sistema y volver a compilar el controlador de kernel con una marca específica del compilador de MSVC.
Requisitos previos
Para poder usar KASAN, necesita:
- Versión del sistema operativo del sistema de destino, en la que se cargará el controlador de kernel:
- Cliente: Windows 11 24H2 o superior.
- Servidor: Windows Server 2025 o superior.
- VisualStudio: versión 17.11 o superior.
- WDK: versión 10.0.26100.2161 o superior.
Habilitación de KASAN en el controlador de kernel
Escriba la siguiente línea de comandos en una ventana del símbolo del sistema de administrador en el sistema de destino:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
Reinicie el sistema de destino para que el cambio surta efecto.
Vuelva a compilar el controlador de kernel con la instrumentación KASAN habilitada pasando una nueva marca al compilador de MSVC. Use uno de los métodos siguientes:
- GUI: en VisualStudio, vaya al Explorador de soluciones, haga clic con el botón derecho en el proyecto de controlador de kernel y seleccione Propiedades. En la página de propiedades, vaya a Propiedades>>de configuración C/C++>>General y establezca Habilitar el saneador de direcciones del kernel en Sí. A continuación, vuelva a generar la solución.
- Símbolo del sistema: agregue el parámetro /fsanitize=kernel-address a la línea de comandos del compilador. A continuación, recompile la solución.
Cargue el controlador de kernel recompilado en el sistema de destino y pruébelo como lo haría normalmente. KASAN funciona en tiempo de ejecución e informa de eventos de acceso a memoria no válidos a través de la comprobación de errores 0x1F2: KASAN_ILLEGAL_ACCESS.
Comprobación de que KASAN está habilitado en el controlador de kernel
Los controladores de kernel compilados con KASAN tienen una sección PE denominada "KASAN
". Compruebe que KASAN está habilitado en el controlador ejecutando el siguiente comando en un símbolo del sistema para desarrolladores:
dumpbin /ALL YourDriver.sys
Si la salida contiene una sección denominada "KASAN
", KASAN está habilitada en el controlador.
Análisis de informes KASAN
Cuando KASAN detecta un acceso ilegal a la memoria en el controlador, emite la comprobación de errores 0x1F2: KASAN_ILLEGAL_ACCESS. Inspeccione el volcado de memoria del kernel generado para determinar dónde exactamente el controlador realizó un acceso de memoria no válido.
Use KASAN con un depurador de kernel asociado al sistema de destino para que la memoria se pueda inspeccionar dinámicamente en cuanto se emita la comprobación de errores, en lugar de post-mortem con un volcado de memoria.
Parámetros de comprobación de errores
Los parámetros del 0x1F2 comprobación de errores: KASAN_ILLEGAL_ACCESS son:
- Parámetro 1: Dirección a la que se accede de forma ilegal.
- Parámetro 2: tamaño del acceso a la memoria.
- Parámetro 3: dirección del autor de la llamada que realiza el acceso ilegal a la memoria.
- Parámetro 4: Información adicional sobre el acceso a la memoria:
- Bits [0:7]: el código de sombra KASAN. Vea la tabla siguiente.
- Bit 8:
1
si el acceso era una escritura,0
si era una lectura.
Códigos de sombra KASAN
En KASAN, consideramos que toda la memoria del kernel se divide en fragmentos contiguos de celdas alineadas con ocho bytes y ocho bytes. Con KASAN, cada celda de ocho bytes en la memoria del kernel tiene un código de sombra asociado, que es un entero de un byte que indica la validez de la celda. La codificación de los códigos de sombra es la siguiente:
Valor | Significado |
---|---|
0x00 |
La celda es totalmente válida: los accesos a los ocho bytes de la celda son legales. |
0x01 ->0x07 |
La celda es parcialmente válida: los primeros bytes de valor de la celda son válidos, pero el resto no es válido. |
>= 0x80 |
La celda no es válida: los accesos a los ocho bytes de la celda no son válidos. |
Se usan varios códigos secundarios para las celdas completamente no válidas para indicar aún más a qué tipo de memoria está asociada la celda y por qué no es válido:
0x81
: zona roja izquierda de alloca.0x82
: zona roja media de alloca.0x83
: zona roja derecha de alloca.0x84
: zona roja derecha de la variable global.0x85
: zona roja genérica.0x86
: zona roja derecha de la memoria del grupo.0x87
: memoria libre.0x8A
: zona roja izquierda de memoria contigua.0x8B
: zona roja derecha de memoria contigua.0x8C
: memoria lookasidelist libre.0x8D
: zona roja izquierda de la memoria del grupo.0xF1
: zona roja izquierda de la variable de pila.0xF2
: zona roja central de la variable de pila.0xF3
: zona roja derecha de la variable de pila.0xF5
: variable de pila used-after-ret.0xF8
: variable de pila fuera del ámbito.
Descripción de las comprobaciones de errores de KASAN: un ejemplo
Supongamos que KASAN emitió una comprobación de errores al ejecutar el controlador, con estos parámetros:
- Parámetro 1:
0xFFFFFFFFFFFFABCD
- Parámetro 2:
0x0000000000000004
- Parámetro 3:
0xFFFFFFFF12345678
- Parámetro 4:
0x0000000000000184
El parámetro 1 indica que el controlador intentó acceder a la dirección 0xFFFFFFFFFFFFABCD
y que este acceso era ilegal. El parámetro 2 indica que era un acceso de cuatro bytes. El parámetro 3 proporciona la dirección del puntero de instrucción en el que el controlador realizó el acceso ilegal. El parámetro 4 indica que se trataba de un acceso de escritura y que la memoria que se toca era la zona roja derecha de una variable global.
Es decir, es probable que el controlador intente realizar un desbordamiento de búfer de escritura en una variable global. Use esta información para investigar y determinar dónde y cómo corregir este error en el controlador.
Impacto en el rendimiento de KASAN
KASAN aumenta el consumo de memoria del kernel e introduce una ralentización aproximada de dos veces en los controladores compilados con KASAN habilitado.