Detectaron una vulnerabilidad en el controlador exFAT de Linux
Hace pocos días se dio a conocer la noticia de que fue detectada una vulnerabilidad (ya catalogada bajo CVE-2023-4273) en el controlador para el sistema de archivos exFAT suministrado en el kernel de Linux.
El problema radica en que el controlador permite al montar una partición especialmente diseñada, (por ejemplo, al conectar un USB Flash malicioso), lograr una desbordamiento de pila y ejecute su código con derechos del kernel.
El problema es: el código supone que las entradas del nombre del archivo siempre producen un nombre de archivo concatenado que se ajusta a 255 caracteres (el límite es 258 caracteres, incluye 1 carácter adicional para un byte nulo y 2 caracteres adicionales para la conversión). Almacenar más de 255 caracteres de nombre de archivo en un conjunto de entradas de directorio es una violación del formato del sistema de archivos, pero el controlador de Linux lo acepta, pero también produce un desbordamiento de la pila (porque el nombre del archivo está concatenado en una variable asignada por la pila).
Sobre la vulnerabilidad se menciona que, esta es aprovechada debido a un fallo en la verificación del tamaño al copiar un nombre de archivo a un búfer asignado en la pila da como resultado un desbordamiento de la pila del kernel si se proporciona un nombre de archivo muy largo que excede el límite del sistema de archivos de 255 caracteres.
La función exfat_extract_uni_name() deja de copiar los caracteres en el búfer de destino una vez que se encuentra un carácter nulo (0x0000) y devuelve el número de caracteres copiados. Pero la persona que llama ignora el valor devuelto y avanza el puntero 15 caracteres (30 bytes) para la siguiente iteración. Por lo tanto, es posible omitir (dejar intactos) 14 caracteres o 28 bytes en una iteración.
La vulnerabilidad está presente en una función que realiza la reconstrucción de nombres largos leyendo cíclicamente registros con partes del nombre del archivo del índice del directorio y fusionando las partes resultantes del nombre en el nombre largo final.
La verificación de tamaño en el código dicha funcion se realizó en relación con cada entrada con una parte del nombre, pero no cubrió el nombre final (por ejemplo, el nombre se puede dividir en 100 partes y alcanzar 1500 caracteres en lugar de 258 caracteres en el buffer).
El investigador que descubrió la vulnerabilidad pudo preparar un prototipo de exploit que permite aumentar sus privilegios en el sistema. Cuando se prueba en una máquina virtual VirtualBox, el exploit funciona el 100% del tiempo, pero cuando se ejecuta en un entorno normal que se ejecuta sobre el hardware, la posibilidad de que se active se reduce a aproximadamente el 50%.
En particular, mi exploit sobrescribe un puntero asignado por pila a una cadena terminada en nulo, por lo que el siguiente intento de agregar un carácter nulo de terminación a esta cadena en realidad se convierte en la primitiva «escribir un byte nulo en una ubicación de memoria elegida por el atacante» .
Tambien se menciona que la vulnerabilidad podría usarse para comprometer los núcleos arrancados en modo UEFI Secure Boot, ya que se menciona que una imagen que contiene un kernel vulnerable, con un script de inicio correspondiente (y el exploit, por supuesto), que se inicia antes que un sistema operativo real, se coloca en una unidad de arranque. Cuando se inicia, esta imagen carga un módulo de kernel malicioso (y sin firmar), que establece su control sobre el modo de kernel y luego cambia al sistema operativo real (por ejemplo, usando la llamada kexec).
Finalmente cabe mencionar que el problema se solucionó en las versiones de Linux que aún tienen soporte. Al momento de la divulgación de la vulnerabilidad la versión del Kernel de Linux más actual era la versión de Linux 6.4.10, pero la nueva versión 6.5 ya cuenta con la corrección.
Para los interesados en realizar un seguimiento de la solución en las diferentes distribuciones, pueden hacerlo desde las siguientes páginas: Debian, Ubuntu, RHEL, SUSE y Fedora.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.