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.