Fue identificada una vulnerabilidad en Snapd la cual ya está descrita en (CVE-2019-7304), que permite a un usuario sin privilegios el poder obtener privilegios de administrador (root) en el sistema.
Para quienes desconocen de Snapd, les podemos decir que este es un kit de herramientas para administrar paquetes autocontenidos en formato snap. Para probar las vulnerabilidades de los sistemas, se publicaron dos prototipos del exploit.
- El primero que le permite al atacante poder crear a un nuevo usuario en el sistema.
- El segundo le permite al atacante tener la posibilidad de instalar cualquier tipo de paquete instantáneo en el sistema y ejecutar el código como root (al instalar el paquete en modo «devmode» con el adjunto del controlador llamado con privilegios root al instalar el paquete).
¿En qué consisten estos exploit?
El exploit creado para explotar la primera posibilidad señalada anteriormente omite las comprobaciones de control de acceso para usar una función de API restringida del servicio de snapd local.
Esto consulta al sistema por un nombre de usuario y una clave SSH pública de una dirección de correo electrónico proporcionada y luego crea un usuario local basado en este valor.
La explotación exitosa de esta versión requiere una conexión a Internet saliente y un servicio SSH accesible a través de localhost.
El segundo exploit creado para aprovechar el segundo punto señalado, a diferencia del exploit anterior descrito, no requiere que el servicio SSH se esté ejecutando.
También funcionará en las versiones más nuevas de Ubuntu sin conexión a Internet, lo que lo hace resistente a los cambios y efectivo en entornos restringidos.
Este exploit también debería ser efectivo en sistemas que no sean Ubuntu que tengan instalado snapd pero que no sean compatibles con la API debido a la sintaxis de shell de Linux.
Es posible que algunos sistemas Ubuntu más antiguos (como la version 16.04) no tengan instalados los componentes de snapd que se requieren para la descarga.
Si este es el caso, esta versión del exploit puede desencadenarla para instalar esas dependencias. Durante esa instalación, snapd puede actualizarse a una versión no vulnerable.
Para saber un poco más sobre estos pueden obtener más detalles en el siguiente enlace.
¿En que consisten este fallo encontrado?
La vulnerabilidad se debe a la falta de comprobaciones adecuadas en snapd al procesar una dirección de socket externa en el proceso de evaluación de los derechos de acceso para sockets de Unix.
Cuando se procesan solicitudes a la API a través de un socket Unix, se comprueba el UID del usuario asociado a la conexión y en base a ello, se toma la decisión sobre el acceso.
El usuario puede adjuntar la cadena «; uid = 0;» al nombre del archivo con el socket (por ejemplo, cree un socket «/tmp/sock; uid=0;») y esta cadena se procesará como parte de la dirección del socket del cliente.
Al analizar los parámetros en snapd, el identificador de usuario se asigna mediante una búsqueda cíclica mediante la máscara «;uid=» en la línea que también incluye el nombre del archivo con el socket (por ejemplo, al crear el socket del cliente «/tmp/sock;uid =0;» esta línea toma la forma » pid=5275; uid =1000; socket =/run/snapd.socket; /tmp/sock;uid= 0; «).
Por lo tanto, si hay una cadena «;uid=0;» en el nombre del socket, el identificador se asignará desde él y no desde el parámetro regular con el UID real.
Un atacante local puede usar este error para acceder al socket /run/snapd.socket a la API privilegiada snapd y obtener privilegios de administrador (las vulnerabilidades anteriores usan la API v2 /create-user y /v2/snaps).
¿Qué versiones afecta y ya existe solución?
El problema se manifiesta en las versiones snapd de 2.28 a 2.37 y afecta a todas las ramas compatibles Ubuntu (de 14.04 a 18.10) así como en distribuciones derivadas de cualquiera de estas versiones señaladas.
El problema también afecta a las distribuciones de Fedora y Debian, en las que snapd se ofrece desde repositorios regulares.
La vulnerabilidad se corrigió en el lanzamiento de snapd 2.37.1, así como en las actualizaciones de paquetes para distribuciones de Ubuntu y Debian.