Nuevamente, el subsistema del Kernel de Linux encargado de filtrar y modificar los paquetes de red se ha visto envuelto en una detección de vulnerabilidad. Y es que Netfilter se ha convertido en un foco rojo, ya que constantemente se dan a conocer noticias de problemas con este componente de Linux.
En esta ocasión, se dio a conocer una vulnerabilidad (ya catalogada bajo CVE-2024-1086) en Netfilter, la cual permite a un usuario local ejecutar código a nivel del kernel y escalar privilegios en el sistema. El problema radica en la doble liberación de memoria en el módulo nf_tables, que es responsable del filtrado de paquetes a través de nftables.
Sobre la vulnerabilidad se menciona que:
El problema radica en un error en la función nft_verdict_init(), que permite el uso de valores positivos como códigos de error DROP en los ganchos, lo que a su vez puede provocar la llamada a la función nf_hook_slow() para liberar memoria para un búfer que ya ha sido liberado previamente mediante la función free().
Esto sucede cuando una operación NF_DROP falla y el kernel interpreta inicialmente NF_DROP, pero luego libera el búfer y devuelve el estado NF_ACCEPT. Como resultado, a pesar de liberar el búfer asociado al paquete, su procesamiento continúa y se transfiere a otro controlador, que vuelve a llamar a la función de liberación de memoria.
Para probar que la vulnerabilidad puede ser explotable, el investigador de seguridad que descubrió esta vulnerabilidad y desarrolló un prototipo funcional del exploit, que ha sido demostrado en las versiones actuales de Debian y Ubuntu con los kernels de Linux 5.14 a 6.6.
El exploit también se ha probado en un entorno con el kernel KernelCTF (Capture the Flag), que incluye parches adicionales para bloquear métodos de exploit típicos y es utilizado por Google en su programa de recompensas por encontrar vulnerabilidades. Se estima que la tasa de éxito del exploit es del 99,4%. El artículo adjunto proporciona una descripción detallada del proceso de creación de un exploit complejo multinivel y cómo eludir los mecanismos de protección y contramedidas presentes en el kernel para hacer frente a exploits.
Cabe mencionar que segun las observaciones del investigador, es probable que todas las versiones, desde al menos la versión de Linux 5.14.21 hasta la versión 6.6.14, sean vulnerables al exploit, dependiendo de los valores de configuración (kconfig). Las ramas estables linux-5.15.y, linux-6.1.y y linux-6.6.y, y posiblemente linux-6.7.1, se ven afectadas por este exploit, según lo observado hasta la fecha de redacción del artículo. Sin embargo, se publicó una corrección de errores en febrero de 2024 para abordar esta vulnerabilidad en las ramas estables.
Es importante tener en cuenta que se utilizó el mismo archivo de configuración base para la mayoría de los kernels básicos, y todas las versiones mencionadas son susceptibles al error PoC. La configuración base se generó con kernel-hardening-checker.
Además, se señala que, para los kernels vanilla, se aplicaron cambios a la configuración CONFIG_INIT_ON_FREE_DEFAULT_ON
ya que se desactivó, lo que ayuda a mitigar parte del exploit al establecer una página en bytes nulos después de la liberación. Sin embargo, CONFIG_INIT_ON_ALLOC_DEFAULT_ON
permanece activo en las principales distribuciones como KernelCTF, Ubuntu y Debian, lo que puede provocar efectos secundarios como la detección de bad_page() en versiones a partir de la v6.4.0.
La tasa de éxito del exploit se sitúa en el 99,4%, con caídas ocasionales al 93,0% en ciertos escenarios. Este éxito puede variar ligeramente según la carga de trabajo del dispositivo. Se considera que el exploit funciona para una configuración específica si tiene éxito en todos los intentos de prueba, y se han investigado y documentado todos los fallos relacionados. Esto reduce la probabilidad de falsos positivos al verificar la efectividad del exploit.
Finalmente, cabe mencionar que la mayoría de las distribuciones ya cuentan con el parche de corrección y si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace o en las páginas específicas de cada distribución, como Debian, Ubuntu, Gentoo, RHEL, SUSE y Fedora.