Seguridad

CVE-2024-1086: “make me root” en Linux con el exploit de Flipping Pages

Las vulnerabilidades de escalada de privilegio buscan, principalmente, conseguir ejecutar una shell con privilegio en el sistema. Es decir, conseguir ser root de la máquina que se ha comprometido en un proceso de Ethical Hacking. Dicho de otra forma, si estamos es un pentesting y conseguimos acceso a una máquina, vulnerando un servicio web, un FTP o una aplicación cualquiera que escucha en un puerto, lo más normal es que necesitemos escalar privilegios.

Recientemente ha sido publicada una nueva vulnerabilidad que afecta a sistemas Linux, más concretamente a versiones del kernel que van desde la 5.14 hasta la 6.6.14, aunque no se descarta que pueda haber más versiones afectadas. Si analizamos bien, nos damos cuenta de que son de las versiones más nuevas del kernel de Linux

La vulnerabilidad se ha clasificado bajo el CVE-2024-1086 y es una vulnerabilidad compleja en lo que a la parte de investigación se refiere. Revisando la vulnerabilidad podemos ver que tiene un CVSS de 7.8. Lógicamente, hay que entender que solo por ser vulnerabilidad local y no tener una vía de explotación remota, no obtendrá el 10 en el CVSS con Base Score.

Figura 3: CVE-2024-1086

Los sistemas afectados son Debian, Ubuntu, Red Hat o Fedora y puede que otras distribuciones no testeadas también están afectadas, no nos quedará duda de ello. El investigador que ha descubierto la vulnerabilidad se llama Notselwyn y ha emitido un informe técnico muy interesante dónde se detalla toda la información de la vulnerabilidad y los sistemas afectados desde un punto de vista técnico.  Además, indica que el exploit tiene una tasa de éxito del 99,4% en la versión 6.4.16 del kernel de Linux.

La actualización o parche de esta vulnerabilidad fue lanzada en Enero, por lo que si no has actualizado aún deberías revisarlo. Es importante disponer de un kernel que no se encuentre entre los mencionados. En el artículo publicado por el investigador de la vulnerabilidad se indica que las siguientes versiones de kernel han sido testeadas y sobre qué distribución:

El investigador Notselwyn comentó que “nunca había sentido tanta alegría desarrollando un proyecto, especialmente al conseguir la primera shell de root con la vulnerabilidad”. La vulnerabilidad está en un componente de netfilter en el kernel de Linux. Para mayor detalle, el componente nf_tables es el que es vulnerable. La función nft_verdict_init() permite valores posibles como error dentro del hook verdict y puede provocar la vulnerabilidad de tipo use-after-free cuando se emite un NF_DROP. En la siguiente imagen se puede ver la jerarquía de nftables, se puede obtener mayor detalle en el artículo de pwning tech.

Todo lo que se ha comentado puede provocar la ejecución de código arbitrario en el kernel, dicho código se ejecutará con privilegios de root. En el análisis que ha realizado el investigador, éste detalla los pasos necesarios para hacer drop de una shell de root en casi cualquier kernel afectado. Ya hemos comentado que hay un exploit en el repositorio de Github dónde se puede encontrar el código para su compilación.

La vulnerabilidad CVE-2024-1086 utiliza un método de explotación universal de kernel en Linux denominado Dirty Pagetable, el cual implica abusar de fallos basados en la manipulación de las tablas de páginas y conseguir el control no autorizado sobre la memoria, es decir, sobre el sistema.

Figura 7:  Las vulnerabilidades de use-after-free se explican en detalle
en el libro de Linux Exploiting de la editorial 0xWord.

El investigador Notselwyn ha denominado a su método Dirty Pagedirectory e indica que permite acceso de lectura y escritura ilimitado (y estable) a todas las páginas de memoria en un sistema Linux, lo que daría el control total a un atacante o una escalada de privilegios. El funcionamiento de la técnica, aunque parezca que no es complejo, lo es. Es cierto que resumido en lo siguiente, puede parecer sencillo:


1. Asigna un directorio de páginas superior (PUD) y un directorio de páginas medio (PMD) a la misma dirección de kernel.
 
 

2. Para el paso 1 utiliza un fallo de tipo use-after-free.
 
 

3. Las VMA deben ser separadas para evitar conflictos, por lo que el PMD no puede ir dentro del área del PUD.
 
 

4. Después se escribe una dirección en la página en el rango del PMD y se lee la dirección en la página correspondiente del rango de PUD.
La vulnerabilidad tiene algunos requisitos:

  • La opción de espacios de nombres de usuario no privilegiados debe estar configurada para acceder a nf_tables. Por defecto, se encuentra habilitada en sistemas como Debian, Ubuntu y otras distros.
  • El atacante deberá explotar un use-after-free para escanear la memoria física y encontrar la dirección.

A continuación, se deja un esquemático que ha creado el investigador de la vulnerabilidad en el artículo publicado en pwning tech.

A continuación, se va a hacer un resumen de lo recogido en el artículo que ha publicado el investigador sobre el funcionamiento o flujo de trabajo de la explotación de la vulnerabilidad. Vamos a ir enumerando por partes:


1. Hay que desencadenar una doble liberación (double use-after-free)
: Este es el objetivo con el que se explotará la vulnerabilidad. Para ello se empieza agregando una regla de netfilter a un espacio de nombres de usuario sin privilegios. Aquí se puede ver el requisito que teníamos para explotar la vulnerabilidad y es que el espacio de nombres estuviera habilitado para todos los usuarios.
 
2. La regla de netfilter contiene una expresión que establece un valor malicioso, es el input en este caso: Este valor hará que el kernel, en la parte de nf_tables, interprete NF_DROP en primer lugar, liberando el skb. Luego devolverá NF_ACCEPT para que el manejo del parque continúe, liberando el skb por segunda vez.
3. Ahora se debe asignar un paquete IP de 16 páginas.
4. Para retrasar la segunda liberación y evitar la corrupción en memoria, se abusa de la lógica de fragmentación de IP en un paquete IP: Esto permite que un skbespere’ en la cola de fragmentación de IP sin ser liberado durante una cantidad arbitraria de segundos.
5. Ahora hay que hacer un IP Spoofing, falsificando la dirección IP de origen del paquete y la de destino: Hay que tener en cuenta que se debe desactivar en el espacio de nombres el RPF, pero no requiere privilegios.
6. Ahora y con el objetivo de lograr un R/W ilimitado a cualquier dirección física se utilizará la técnica Dirty Pagedirectory: De forma coloquial se puede decir que la técnica provocará confusión a las tablas de página.
7. Se utilizan dos métodos: PCP draining y page conversión technique, el segundo es una condición de carrera. Con estos métodos se consigue la escalada.
Para más detalle, se puede leer el artículo publicado por el investigador dónde puedes encontrar hasta el mínimo detalle del proceso. La explotación puede ser sencilla, debido a que el investigador ha publicado un exploit, después de que se lanzase ya las actualizaciones necesarias para proteger los sistemas, pero no es algo sencillo como se puede extraer del artículo publicado.

Si no has actualizado, hazlo ya, ya que la vulnerabilidad de escalada de privilegios tiene un buen rating de funcionamiento y podemos ser víctimas de ataques y escaladas de privilegios en nuestros sistemas. Un exploit para tener en nuestra mochila de pentesters.

Saludos,

Autor: Pablo González Pérezescritor de los libros «Metasploit para Pentesters«, «Hacking con Metasploit: Advanced Pentesting» «Hacking Windows«, «Ethical Hacking«, «Got Root«,  “Pentesting con Powershell” y de «Empire: Hacking Avanzado en el Red Team«, Microsoft MVP en Seguridad y Security Researcher en el equipo de «Ideas Locas» de la unidad CDCO de Telefónica.  Para consultas puedes usar el Buzón Público para contactar con Pablo González

Contactar con Pablo González

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.