Hace poco Google dio a conocer mediante una publicación de blog que ha tomado la decisión de deshabilitar de forma predeterminada en ChromeOS, Android y servidores de producción, la interfaz de asíncrona io_uring, esto debido a la deplorable situación de seguridad en io_uring.
Y es que durante el análisis de los resultados del «Programa de Recompensas por Vulnerabilidad» de kCTF, que ha estado en vigor desde 2020, se ha demostrado que el 60% de las solicitudes recibidas bajo el programa explotan vulnerabilidades emergentes y la situación no cambia con el tiempo, lo cual preocupa bastante, ya que se ha convertido en un punto vulnerable.
En total, se pagó alrededor de $1 millón en recompensas por exploits relacionados con io_uring, mientras que la cantidad total de recompensas pagadas por vulnerabilidades en el kernel de Linux durante la existencia de la iniciativa fue de $1,8 millones por 42 exploits provistos para vulnerabilidades aún no fijadas (remuneración máxima – 133 mil dólares).
Dado que el kernel de Linux es un componente clave no solo para Google, sino también para Internet, comenzamos a invertir fuertemente en esta área. Ampliamos el alcance y la recompensa máxima del VRP en 2021 (a $50 000), luego nuevamente en febrero de 2022 (a $91 000) y finalmente en agosto de 2022 (a $133 000). En 2022, también resumimos nuestros aprendizajes hasta la fecha en nuestro libro de cocina e introdujimos nuestras mitigaciones experimentales para las técnicas de explotación más comunes.
El año pasado, para mejorar la seguridad del kernel de Linux utilizado en el entorno de referencia en el que se produjo el exploit que pretende recibir el premio, Google aplicó ajustes y parches adicionales para bloquear los métodos típicos de explotación. Por ejemplo, se agregó protección contra daños a la estructura de Freelist, se prohibió escribir fuera de los límites del búfer en slab y se implementaron ataques de bloqueo relacionados con el uso compartido de caché. Pero estos cambios no afectaron la capacidad de explotar vulnerabilidades en io_uring, lo que llevó a Google a dejar de admitir io_uring en sus productos.
Si bien io_uring brinda beneficios de rendimiento y reacciona rápidamente a los problemas de seguridad con correcciones de seguridad integrales (como retroportar la versión 5.15 al árbol estable 5.10), es una parte bastante nueva del kernel. Como tal, io_uring continúa desarrollándose activamente, pero aún se ve afectado por vulnerabilidades graves y también proporciona fuertes primitivos de explotación. Por estos motivos, actualmente lo consideramos seguro solo para componentes de confianza.
En ChromeOS, la compatibilidad con io_uring está deshabilitada al compilar el kernel (CONIFG_IO_URING en kernelconfig). Android usa temporalmente un filtro basado en seccomp-bpf para bloquear el acceso a io_uring y planea usar SELinux para restringir selectivamente el acceso a io_uring a componentes confiables del sistema en versiones futuras.
Como tal, Google no ve con malos ojos a la interfaz io_uring, proporcionada por el kernel de Linux desde la versión 5.1, ya que menciona que dentro de sus puntos positivos, se destaca por su compatibilidad con el sondeo de E/S y la capacidad de trabajar con o sin almacenamiento en búfer, pero como tal aún es lo suficiente robusto como para seguir tomando riesgos y sobre todo seguir invirtiendo en las soluciones de errores y vulnerabilidades que constantemente surgen.
Con la API io_uring, los desarrolladores del kernel intentaron abordar las deficiencias de la antigua interfaz aio.
En términos de rendimiento, io_uring está muy cerca de SPDK y supera significativamente a libaio cuando el sondeo está habilitado. Por ejemplo, el uso de io_uring en la biblioteca libuv dio como resultado un aumento del rendimiento de 8 veces, y la inclusión de la escritura asíncrona en búfer basada en io_uring en el sistema de archivos XFS llevó a una disminución de la latencia en 80 veces y a un aumento de 2,7 veces en la tasa de transferencia de datos.
Cabe mencionar que adicionalmente, Google está considerando la posibilidad de deshabilitar io_uring por defecto en GKE AutoPilot (Google Kubernetes Engine).
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.