KASAN al descubierto: memoria sombra, redzones y compilación instrumentada en el kernel

Fuentes: Poison, redzones and shadows: inside KASAN

El Kernel Address Sanitizer (KASAN) es la herramienta de referencia en el kernel de Linux para detectar en tiempo de ejecución dos de los errores de memoria más comunes en código C: accesos fuera de los límites y use-after-free. Aunque Rust gana terreno en el núcleo, la mayor parte del código sigue escribiéndose en C, un lenguaje propenso a comportamientos indefinidos, desbordamientos de búfer y fallos de segmentación. Para identificarlos antes de que lleguen a producción, los desarrolladores cuentan con KASAN, cuyo funcionamiento combina dos piezas. La primera es la instrumentación que introduce el compilador (GCC o LLVM) mediante la biblioteca Address Sanitizer de Google: añade código antes de cada acceso a memoria. La segunda es la memoria sombra, una región especial mantenida por el propio kernel que registra el estado de toda la memoria usable y permite distinguir accesos legítimos de inválidos. KASAN se activa con la opción CONFIG_KASAN al recompilar el kernel, y ofrece parámetros ajustables: instrumentación inline u outlined, soporte de etiquetas por hardware o software (MTE en arquitecturas compatibles) y selección de qué regiones se monitorizan (vmalloc, pila, etc.). Para experimentar de forma segura, Bootlin recomienda virtme-ng de Andrea Righi, que lanza el kernel instrumentado dentro de QEMU. Tras cargar el módulo kasan_test, dmesg muestra informes detallados: naturaleza del fallo, contexto de ejecución, pila de llamadas completa, tamaño del objeto, redzones adyacentes (zonas de memoria de relleno que detectan desbordamientos) y estado de la memoria sombra circundante, datos indispensables para depurar el error.