Una vulnerabilidad de hace mas de 15 años en Netfilter permitía escalar privilegios
Hace pocos dias se dio a conocer la noticia de que se ha identificado una vulnerabilidad en Netfilter (un subsistema del kernel de Linux utilizado para filtrar y modificar paquetes de red), que permite a un usuario local obtener privilegios de root en un sistema, incluso mientras se encuentra en un contenedor aislado.
La vulnerabilidad CVE-2021-22555 es un problema que ha estado presente desde el kernel 2.6.19, lanzado hace 15 años y es causado por un error en los controladores IPT_SO_SET_REPLACE e IP6T_SO_SET_REPLACE, lo que provoca un desbordamiento del búfer al enviar parámetros especialmente decorados a través de la llamada setsockopt en modo compat.
Tal vez muchos en este punto se preguntaran como es posible que un fallo en el Kernel de Linux pudo pasar desapercibido durante tanto tiempo y la respuesta a ello es que aun que el fallo que estuvo presente desde Linux 2.6.19, la vulnerabilidad si encontró mediante auditoría de código, aun que el código C no era reproducible, por lo que no pudo ser explotado debido a que los recursos necesarios para poder escalar los privilegios no se encontraban en ese entonces.
Por ejemplo el soporte para espacios de nombres de usuarios sin privilegios, está en el kernel 3.8. Además de que algunas distribuciones tienen un parche que agrega sysctl para deshabilitar los espacios de nombres de usuarios sin privilegios.
En circunstancias normales, solo el usuario root puede llamar a compat_setsockopt(), pero los permisos necesarios para realizar un ataque también pueden ser obtenidos por un usuario sin privilegios en sistemas con espacios de nombres de usuario habilitados.
CVE-2021-22555 es una vulnerabilidad de escritura fuera de límites de pila de 15 años en Linux Netfilter que es lo suficientemente potente como para evitar todas las mitigaciones de seguridad modernas y lograr la ejecución del código del kernel.
Como tal, se describe que un usuario local puede crear un contenedor con un usuario root independiente y aprovechar la vulnerabilidad desde allí. Por ejemplo, los «espacios de nombres de usuario» se incluyen de forma predeterminada en Ubuntu y Fedora, pero no en Debian y RHEL.
Esta vulnerabilidad se puede aprovechar sobrescribiendo parcialmente el
m_list->next
puntero de lamsg_msg
estructura y logrando un uso después de libre. Esto es lo suficientemente poderoso como para obtener la ejecución del código del kernel sin pasar por KASLR, SMAP y SMEP.
Además, el problema surge en la función xt_compat_target_from_user() debido a un cálculo incorrecto del tamaño de la memoria al guardar las estructuras del kernel después de la conversión de la representación de 32 bits a la de 64 bits.
Como tal, se menciona que el error permite escribir cuatro bytes «cero» en cualquier posición fuera del búfer asignado, limitado por el desplazamiento 0x4C. Debido a esto, se menciona que esta característica resultó ser suficiente para crear un exploit que permite obtener derechos de root: al borrar el puntero m_list-> next en la estructura msg_msg, se crearon las condiciones para acceder a los datos después de liberar memoria (use-after-free), que luego fue se utiliza para obtener información sobre direcciones y cambios en otras estructuras mediante la manipulación de la llamada al sistema msgsnd().
En cuanto al informe del error, al igual que cualquier vulnerabilidad detectada, esto lleva un proceso y el informe que se realizó a los desarrolladores del kernel en abril, con lo cual posterior a ello se corrigió en unos días y se lanzó el parche que está incluido en todas las distribuciones compatibles, para después poder divulgar la información sobre el fallo.
Los proyectos Debian, Arch Linux y Fedora ya han generado actualizaciones de paquetes. A partir de Ubuntu, se están preparando las actualizaciones de RHEL y SUSE. Debido a que el error es grave, explotable en la práctica y permite escapar del contenedor, Google estimó su descubrimiento en $ 10,000 y doblo la recompensa al investigador que identificó la vulnerabilidad y por identificar un método para evitar el aislamiento de los contenedores de Kubernetes en el clúster kCTF.
Para las pruebas, se ha preparado un prototipo funcional de un exploit que elude los mecanismos de protección KASLR, SMAP y SMEP.
Finalmente si estás interesado en conocer más al respecto, puedes consultar los detalles en el siguiente enlace.