Noticia Rootkits invisibles: el nuevo desafío para las herramientas de seguridad en Linux

io_uring ha vuelto, esta vez como rootkit


Investigadores de la empresa ARMO realizaron hace pocos días una publicación en la cual han expresado su preocupación en una creciente tendencia en la evolución del malware: la capacidad de crear rootkits completamente funcionales que evaden los métodos tradicionales de detección.

Los investigadores mencionan en su publicación que el punto central de esta estrategia es el uso de io_uring, una interfaz de entrada/salida asíncrona del kernel de Linux que permite realizar operaciones comunes como leer y escribir archivos o establecer conexiones de red sin recurrir a las llamadas de sistema que suelen ser monitoreadas por las herramientas de seguridad.

Hace dos años, nuestro equipo en ARMO investigó cómo eludir y manipular las herramientas de monitorización basadas en eBPF. Algunas de las técnicas más interesantes que exploramos fueron la manipulación de mapas eBPF y los ataques TOC-TOU.

Esta investigación nos llevó a una interesante entrada de blog del 6 de junio de 2022. En su blog, Daniel Teixeira, operador sénior del Red Team, demostró cómo, mediante io_uring, se puede eludir la monitorización de llamadas al sistema en sistemas Linux. Este método nos pareció muy interesante, pero no se había explorado a fondo, por lo que seguimos de cerca su evolución

¿Qué es io_uring y por qué representa un cambio de paradigma?​


Introducido en Linux 5.1, io_uring es una API diseñada para operaciones de E/S asíncronas de alto rendimiento. Su funcionamiento se basa en dos búferes de anillo compartidos entre el espacio de usuario y el espacio de kernel. Esta estructura permite a las aplicaciones enviar múltiples solicitudes de E/S que se procesan sin bloquear el hilo llamador, eliminando la necesidad de múltiples llamadas al sistema.

A diferencia de las API tradicionales de E/S basadas en el estilo UNIX, donde cada operación (lectura, escritura, conexión, etc.) requiere una llamada explícita al sistema, io_uring ofrece una interfaz más eficiente y flexible. Entre sus ventajas está la reducción del overhead al evitar la copia constante de datos entre el kernel y el espacio de usuario.

Pero esta misma eficiencia es ahora vista como una debilidad desde el punto de vista de la seguridad: muchas herramientas diseñadas para detectar comportamiento malicioso se basan exclusivamente en el rastreo de llamadas al sistema. Si un rootkit actúa sin hacer uso de ellas, esas herramientas se vuelven ciegas.

Curing: un rootkit que pasa desapercibido​


Para demostrar esta técnica, ARMO desarrolló un prototipo funcional llamado Curing, un rootkit que opera exclusivamente mediante io_uring. Su propósito: recibir instrucciones desde un servidor remoto y realizar operaciones como transferir o alterar archivos del sistema. En la demostración, Curing logró exfiltrar el archivo /etc/shadow a través de una conexión TCP en el puerto 8888 sin que su actividad fuera detectada por las herramientas Falco o Tetragon.

Ambas soluciones fallaron al no considerar el uso de io_uring como canal de comunicación. Lo mismo ocurre con la mayoría de las herramientas comerciales de detección y respuesta ante incidentes en entornos Linux, que dependen de interceptar llamadas de sistema como medio principal de vigilancia.

¿Qué se puede hacer?​


Frente a esta amenaza, los investigadores recomiendan adoptar mecanismos de monitoreo más profundos, como KRSI (Kernel Runtime Security Instrumentation). Introducido a partir del kernel 5.7, KRSI permite conectar programas BPF (eBPF) directamente a ganchos LSM (Linux Security Module), lo que proporciona visibilidad incluso cuando las operaciones no generan llamadas al sistema.

Con esta técnica, es posible rastrear acceso a archivos, conexiones de red e incluso la ejecución de procesos iniciados a través de io_uring. La integración de KRSI en soluciones de seguridad permitiría un monitoreo más fiable, adaptado a las técnicas modernas de evasión.

Y es que no es la primera vez que io_uring genera problemas, ya que en los últimos años ha estado en el centro de varias vulnerabilidades críticas. Debido a estos problemas de seguridad, Google ha optado por deshabilitarlo por defecto en entornos como ChromeOS, Android y sus propias infraestructuras de servidor. En esa línea, desde el kernel Linux 6.6 se ha introducido un nuevo parámetro sysctl llamado io_uring_disabled, que permite a los administradores desactivar completamente io_uring sin necesidad de recompilar el kernel.

Finalmente si estás interesado en poder conocer más al respecto, puedes consular los detalles en el siguiente enlace.

Continúar leyendo...