Privilege escalation through the lxd group
LXD es el gestor de contenedores de sistema de Ubuntu. Su demonio corre como root y atiende peticiones de cualquier miembro del grupo lxd, sin pedir contraseña. Como un contenedor privilegiado puede montar directorios del anfitrión, pertenecer a ese grupo equivale a ser root: no hay exploit, solo el uso previsto de la herramienta.
El punto de partida es un id que incluya el grupo:
id
# uid=1000(user) gid=1000(user) groups=1000(user),108(lxd)Hace falta una imagen mínima dentro del host. Se compila en la máquina atacante y se sube, o se usa una ya presente si la hay:
git clone https://github.com/saghul/lxd-alpine-builder
cd lxd-alpine-builder && sudo ./build-alpineYa en la víctima, se importa la imagen y se crea el contenedor con security.privileged=true, que es la pieza clave: sin esa opción el contenedor no puede tocar el disco del anfitrión.
lxc image import ./alpine.tar.gz --alias alpine
lxc init alpine escalada -c security.privileged=true
lxc config device add escalada host-root disk source=/ path=/mnt/root recursive=true
lxc start escalada
lxc exec escalada /bin/shDentro del contenedor somos root del contenedor, que no es gran cosa, pero /mnt/root es el sistema de ficheros del anfitrión montado con permisos de escritura. Desde ahí se lee la flag, se añade una clave a /mnt/root/root/.ssh/authorized_keys o se pone el bit SUID a una copia de bash.
Matices. El vector necesita que el servicio LXD esté inicializado (lxd init); si nunca se configuró un storage pool, el lxc init falla y hay que crearlo primero. En instalaciones modernas con LXD por snap el grupo puede llamarse lxd igualmente pero el socket vivir en otra ruta.
Cómo detectarlo. La firma es la creación de un contenedor con security.privileged=true y un device de disco que monta source=/ (el propio comando lxc config device add ... source=/ queda en el journal de lxd/snap.lxd.daemon). En el host, auditd/Sysmon for Linux ven procesos con uid=0 bajo el árbol de lxd/lxc escribiendo en /root/.ssh/authorized_keys o poniendo el bit SUID a bash, y un id de un usuario del grupo lxd que no gestiona contenedores es ya la desviación. El montaje de la raíz del host en un contenedor privilegiado es el indicador central.
Defensa. No meter usuarios en lxd salvo que administren contenedores, y entender que ese grupo es equivalente a root. Relacionado con los grupos privilegiados; cuando el contenedor forma parte de un orquestador, el vector cambia de sitio y pasa a ser el abuso del cluster.