Por omisión una vulnerabilidad en io_uring estuvo presente al menos dos meses en Ubuntu
Se dio a conocer información sobre una vulnerabilidad (catalogada bajo CVE-2024-0582) que fue identificada en io_uring (la interfaz de E/S asíncrona del kernel de Linux), la cual representa un riesgo significativo, ya que podría permitir que un usuario sin privilegios obtenga privilegios de root en el sistema.
El problema de la vulnerabilidad (CVE-2024-0582) y el hecho porque causo tanto ruido, es debido a que ha estado presente en el kernel de Linux desde su versión 6.4 y se ha corregido en las versiones 6.7 y 6.6.5, pero a pesar de que los parches se aplicaron en tiempo y forma, el problema persistió en el paquete del kernel de Ubuntu 22.04 y 23.10, es decir no se transfirieron los parches a los kernels de Ubuntu durante más de dos meses.
Sobre esta vulnerabilidad, se menciona que se explota mediante el acceso local al sistema, sin necesidad de manipular espacios de nombres, y el problema radica en el uso después de la liberación de un bloque de memoria en el subsistema io_uring.
Sobre la vulnerabilidad
La gravedad de esta vulnerabilidad radica en su capacidad para proporcionar a un atacante acceso a páginas completas que se liberaron, en lugar de simplemente objetos individuales en el kernel y esto ocurre al registrar y liberar un búfer en anillo creado con el indicador IORING_REGISTER_PBUF_RING.
La explotación de esta vulnerabilidad se basa en la manipulación de datos después de la liberación (UAF). Cuando una aplicación registra un anillo de búfer proporcionado utilizando la bandera IOU_PBUF_RING_MMAP,
el kernel asigna memoria para el anillo de búfer proporcionado en lugar de que lo haga la aplicación. Esto crea una situación en la que el kernel no verifica si la memoria se asignó previamente en el espacio de usuario antes de liberarla y reasignarla para otros fines.
Al aplicar la operación mmap() a un búfer y luego liberarlo (IORING_UNREGISTER_PBUF_RING), la información del búfer permanece accesible en el espacio de usuario, lo que permite a un atacante leer y escribir datos en páginas de memoria que pertenecen al sistema de asignación de memoria del kernel.
Ademas de ello, se menciona que la solución en el kernel principal se implementó en diciembre de 2023, pero el acceso público a un mensaje de error que indicaba esta vulnerabilidad fue proporcionado por el proyecto Google Zero el 8 de enero, y el paquete con el kernel 6.5 corregido para Ubuntu se creó el 22 de febrero de 2024.
Para demostrar que la vulnerabilidad puede ser explotada, se desarrollaron exploits los cuales son funcionales y están puestos a disposición todos, y también se ha descrito una segunda técnica para aprovechar esta vulnerabilidad. Por lo tanto, es crucial que los sistemas afectados apliquen las actualizaciones y parches de seguridad disponibles para mitigar este riesgo potencial.
La primitiva de explotación proporciona a un atacante acceso de lectura y escritura a una cierta cantidad de páginas libres que han sido devueltas al asignador de páginas. Al abrir un archivo una gran cantidad de veces, el atacante puede forzar el agotamiento de todas las losas en la
filp
caché, de modo que se soliciten páginas libres al asignador de páginas para crear una nueva losa en esta caché. En este caso, se producirán más asignaciones defile
estructuras en las páginas en las que el atacante tiene acceso de lectura y escritura, pudiendo así modificarlas. En particular, por ejemplo, modificando elf_mode
campo, el atacante puede hacer que se pueda escribir en un archivo que se ha abierto con permisos de solo lectura.
Sobre el primer exploit que se elaboró, se menciona que este aprovecha la creación de un gran número de páginas de memoria controladas por el atacante para comprender la estructura de la memoria en el kernel y acceder a páginas de memoria física vecinas. Esto se logra utilizando contenido especialmente diseñado en estructuras de sockets de red para marcar las páginas. Para ejecutar el código malicioso, el exploit utiliza un «gadget» que existe en el kernel, lo que permite la ejecución de la función call_usermodehelper_exec
, diseñada para iniciar procesos en el espacio del usuario desde el kernel.
El segundo exploit se basa en el agotamiento de la caché de bloques, lo que lleva al sistema de asignación de memoria a utilizar páginas de memoria aún accesibles para el atacante. Esto se aprovecha para crear y colocar nuevas estructuras de archivos en bloques de memoria específicos.
Al organizar la entrada del archivo deseado en la caché de archivos y modificar el campo f_mode
en las estructuras de archivos asociadas, que determina los derechos de acceso, el exploit permite la creación de archivos en lugares sensibles del sistema, como /etc/passwd,
con permisos de escritura.
Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.