Investigadores de la empresa ARMO demostraron la posibilidad de crear rootkits que no utilizan llamadas al sistema específicas para llevar a cabo operaciones típicas, como leer/escribir archivos y recibir comandos de un servidor externo. En lugar de las llamadas al sistema, se propuso utilizar la interfaz de entrada/salida asíncrona io_uring, soportada desde el núcleo de Linux 5.1.
La esencia del método es que, en lugar de llamadas al sistema individuales para acceder a archivos y realizar operaciones en red (read/write, recv/send/connect/bind/listen), se pueden utilizar llamadas al sistema generales io_uring (io_uring_enter, io_uring_setup, io_uring_register, etc.), que no son analizadas por las herramientas típicas para detectar actividades maliciosas. La interfaz io_uring soporta alrededor de 60 operaciones diferentes. Se está desarrollando una funcionalidad que permite iniciar nuevos procesos a través de io_uring.
Para demostrar la efectividad del método, se preparó un prototipo de rootkit llamado Curing, que realiza acciones como recibir comandos de un externo servidores y transferir/modificar archivos. En la demostración se utilizó el envío de una solicitud al puerto TCP 8888 de un host externo y el envío del contenido del archivo «/etc/shadow». Se supone que después de la exitosa compromisión del sistema y la obtención de privilegios de root, el atacante instala el rootkit para consolidar su presencia en el sistema comprometido.
En el experimento realizado, la actividad del rootkit Curing no fue detectada por las herramientas de monitoreo Falco y Tetragon, que se utilizan para identificar anomalías relacionadas con la seguridad en hosts y contenedores (se soporta la integración con la infraestructura basada en Kubernetes). Estas herramientas utilizan la intercepción de llamadas al sistema para analizar eventos como el inicio de procesos, la actividad de red y el manejo de archivos, pero no consideran la posibilidad de utilizar la subsistema io_uring para tales operaciones. La mayoría de los sistemas comerciales de detección y respuesta a incidentes de seguridad disponibles para Linux también se basa en la intercepción de llamadas al sistema.
Para evitar la elusión de las herramientas de seguimiento de la actividad de red y de archivos, se recomienda utilizar el mecanismo KRSI (Kernel Runtime Security Instrumentation) en lugar de interceptar llamadas al sistema, el cual apareció en el núcleo de Linux 5.7 y permite adjuntar programas BPF a cualquier gancho LSM. Por ejemplo, KRSI a nivel de los ganchos LSM permite rastrear operaciones con archivos, acceso a la red y ejecución de procesos, independientemente de si estas operaciones son iniciadas a través de llamadas al sistema específicas o mediante io_uring.
Anteriormente, el subsistema io_uring fue objeto de críticas debido a la aparición periódica de vulnerabilidades graves. En respuesta a las solicitudes de los usuarios que deseaban una herramienta simple para desactivar io_uring sin recompilar el núcleo, se añadió en el núcleo de Linux 6.6 el sysctl io_uring_disabled. Google, por defecto, desactivó io_uring en ChromeOS, Android y en sus como en entornos de nube públicos o privados., explicando que la lamentable situación de seguridad en io_uring supera las ventajas de usar io_uring para mejorar el rendimiento.
Fuente: opennet.ru
