Se ha revelado información sobre la sexta vulnerabilidad (1, 2-3, 4, 5), que permite a un usuario local no privilegiado obtener derechos de root al sobrescribir datos en la caché de la página. La vulnerabilidad ha recibido el nombre en código PinTheft. Un prototipo de exploit está disponible. Aún no se ha asignado un identificador CVE. La solución está disponible solo en forma de parche, que fue publicado el 5 de mayo y aceptado en la rama netdev el 11 de mayo, pero no incluido en los lanzamientos de corrección del núcleo.
La vulnerabilidad está presente en la implementación del protocolo de red RDS (Reliable Datagram Sockets), diseñado para el intercambio de mensajes de alta velocidad entre nodos en un clúster, con latencia mínima y entrega garantizada. El ataque es posible en sistemas con el subsistema io_uring habilitado (io_uring_disabled=0) y un núcleo compilado con las opciones CONFIG_RDS, CONFIG_RDS_TCP y CONFIG_IO_URING. Para que el exploit funcione, debe existir un archivo ejecutable de lectura con el flag SUID-root en el sistema.
Para cargar automáticamente el módulo del núcleo rds_tcp, el exploit solicita el envío de datos a través de RDS utilizando el transporte SO_RDS_TRANSPORT=2. Se señala que, entre las distribuciones de Linux probadas, en la configuración por defecto, el módulo del núcleo rds está disponible solo en Arch Linux. Para mitigar la vulnerabilidad, se puede bloquear la carga automática de los módulos del núcleo rds y rds_tcp: rmmod rds_tcp rds printf ‘install rds /bin/false\ninstall rds_tcp /bin/false\n’ > /etc/modprobe.d/pintheft.conf
La vulnerabilidad es causada por un error en la implementación del mecanismo zerocopy en la función rds_message_zcopy_from_user(), que realiza una modificación directa de los datos en la caché de la página para evitar un exceso de almacenamiento en búfer. En caso de fallo, no se limpiaba el campo rm->data.op_nents, lo que resultaba en una doble liberación del búfer (double-free). Se pudo explotar la aparición de un valor incorrecto en el contador de referencias para sobrescribir datos en la caché de la página, mediante la manipulación de un puntero a un búfer fijo de io_uring.
En otros aspectos, el mecanismo de explotación es típico de todas las vulnerabilidades de esta clase: el atacante logra que un archivo de programa con la bandera suid root se almacene en la caché de páginas, tras lo cual inserta en el encabezado ELF el código para ejecutar /usr/bin/sh. Después de esta manipulación, el lanzamiento del programa provoca que se cargue en memoria no el archivo ejecutable original desde el almacenamiento, sino una copia modificada de la caché de páginas. A diferencia de los exploits anteriores, esta nueva variante se adapta exclusivamente para atacar la utilidad "su", aunque también puede aplicarse en sistemas donde existan programas suid como mount, passwd, chsh, newgrp, umount y pkexec.
Fuente: opennet.ru
