Investigadores del equipo de Google Project Zero publicaron un método de explotación de la vulnerabilidad (CVE-2020-29661) en la implementación del controlador ioctl TIOCSPGRP del subsistema tty del núcleo de Linux, y examinaron detalladamente los mecanismos de protección que podrían bloquear dichas vulnerabilidades.
El error problemático fue corregido en el núcleo de Linux el 3 de diciembre del año pasado. El problema se manifiesta en núcleos hasta la versión 5.9.13, pero la mayoría de las distribuciones han abordado el problema en actualizaciones de paquetes con el núcleo que se ofrecieron el año pasado (Debian, RHEL, SUSE, Ubuntu, Fedora, Arch). Una vulnerabilidad similar (CVE-2020-29660) fue encontrada simultáneamente en la implementación de la llamada ioctl TIOCGSID, pero también ha sido corregida en todo el mundo.
El problema es causado por un error en la instalación de bloqueos, que da lugar a una condición de carrera en el código drivers/tty/tty_jobctrl.c, la cual se pudo explotar para crear condiciones de acceso a la memoria después de su liberación (use-after-free), siendo explotados desde el espacio de usuario mediante manipulaciones con la llamada ioctl TIOCSPGRP. Un exploit funcional fue demostrado para elevar privilegios en Debian 10 con núcleo 4.19.0-13-amd64.
En el artículo publicado, el énfasis no se pone tanto en la técnica para crear un exploit funcional, sino en qué herramientas existen en el núcleo para protegerse contra vulnerabilidades como estas. La conclusión no es alentadora; métodos como la segmentación de memoria en el montón y el control de acceso a la memoria después de su liberación no se implementan en la práctica, ya que resultan en una disminución del rendimiento, y la protección basada en CFI (Control Flow Integrity), que bloquea los exploits en etapas avanzadas del ataque, requiere más trabajo.
Al considerar qué podría cambiar la situación a largo plazo, se destaca la aplicación de analizadores estáticos avanzados o el uso de lenguajes que garantizan un manejo seguro de la memoria, como Rust y dialectos del lenguaje C con anotaciones extendidas (por ejemplo, Checked C), en la etapa de compilación para verificar el estado de bloqueos, objetos y punteros. Entre los métodos de protección también se menciona la activación del modo panic_on_oops, la conversión de estructuras del núcleo a un modo de solo lectura, y la restricción del acceso a las llamadas del sistema mediante mecanismos como seccomp.
Fuente: opennet.ru
