Vulnerabilidad en el subsistema io_uring que permite obtener privilegios de root

En la interfaz de entrada/salida asíncrona io_uring proporcionada por el núcleo de Linux, se ha identificado una vulnerabilidad (CVE-2024-0582) que permite a un usuario no privilegiado obtener derechos de root en el sistema. Para explotar esta vulnerabilidad, solo se requiere acceso local normal al sistema, sin necesidad de manipular espacios de nombres. Actualmente, hay un exploit funcional disponible públicamente, así como una segunda técnica de explotación de la vulnerabilidad que se describe en detalle.

La vulnerabilidad es causada por el acceso a un bloque de memoria ya liberado (use-after-free) en la subestructura io_uring, que se produce al registrar y liberar un búfer circular creado con la bandera IORING_REGISTER_PBUF_RING. En el caso de aplicar la operación mmap() al búfer, este permanece reflejado en el espacio de usuario después de ejecutar su operación de liberación (IORING_UNREGISTER_PBUF_RING). Utilizando esta característica, un atacante puede leer y escribir datos en las páginas de memoria que el sistema de distribución de memoria del núcleo devuelve.

El problema se manifiesta a partir de la versión del núcleo de Linux 6.4 y se ha solucionado en las versiones 6.7 y 6.6.5, así como en el paquete del núcleo 6.5.0-21 preparado para Ubuntu 22.04 y 23.10. Es notable que en el núcleo principal, el problema fue corregido en diciembre de 2023, el proyecto Google Zero hizo público el mensaje de error que informa sobre la vulnerabilidad el 8 de enero, y el paquete con el núcleo corregido 6.5 para Ubuntu se compiló solo el 22 de febrero de 2024. En otras distribuciones, se puede rastrear la corrección y la vulnerabilidad en las páginas: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.

El primer exploit manipula la creación de un gran número de páginas de memoria controladas por el atacante para determinar la disposición de la memoria en el núcleo y acceder a las páginas de memoria físicas adyacentes, utilizando como marcadores el contenido de estructuras de sockets de red llenadas de cierta manera. Para ejecutar el código en el exploit se utiliza un 'gadget' (una secuencia de instrucciones existentes en el núcleo) que conduce a la ejecución de la función call_usermodehelper_exec, diseñada para iniciar procesos en el espacio de usuario desde el núcleo.

El segundo exploit se basa en que, al agotar todos los bloques slab en la caché (por ejemplo, al abrir un archivo múltiples veces), las páginas de memoria libres a las que tiene acceso el atacante son utilizadas por el sistema de distribución de memoria para crear un nuevo bloque slab y todas las nuevas estructuras de archivos comienzan a almacenarse en ese bloque. Por lo tanto, algunas estructuras de archivos acabarán en páginas de memoria que el atacante puede leer y escribir. La explotación consiste en organizar que el archivo deseado llegue a la caché de archivos y reemplazar en las estructuras de archivos relacionadas el campo f_mode, que determina los derechos de acceso, lo que permite hacer accesible para escritura un archivo del sistema necesario, por ejemplo, \/etc\/passwd.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster