
Prueba de concepto sobre la falla de escalada de privilegios identificada en Osconfig de Google
El proceso google_osconfig_agent es un componente de la herramienta GoogleCloudPlatform (https://github.com/GoogleCloudPlatform/osconfig) que se ejecuta en cada VM por defecto. El agente se ejecuta como root y es responsable de algunos servicios controlables por el usuario, incluyendo OS config (https://cloud.google.com/compute/docs/os-config-management), que es una especie de implementación de Google de configuración de estado deseado basada en sondeo (polling).
Este repositorio aloja una demo sobre una falla de escalada de privilegios que identifiqué en la implementación (y que Google ha corregido desde entonces).
Las tareas a ejecutar se denominan recetas, y uno de los tipos de receta admitidos es ejecutar un script de shell. Al procesar una receta de este tipo, el agente —que se ejecuta como root con todas las capacidades— guarda archivos temporalmente en el directorio /tmp y luego los ejecuta. El directorio creado por el agente puede ser secuestrado y, por lo tanto, el script a ejecutar puede ser reemplazado, lo que efectivamente conduce a una elevación local de privilegios.
gcloud services enable osconfig.googleapis.com
gcloud compute project-info add-metadata --metadata=enable-osconfig=TRUE
# cat /tmp/poc.txt
cat: /tmp/poc.txt: No such file or directory
# pip3 install inotify_simple
# chroot --userspec=nobody:nogroup / /home/radimre83/osconfig-privesc-poc3.py
Running as 65534
calling inotify.read()
...
gcloud beta compute os-config guest-policies create test-policy-poc --file="C:\Projects\gcp-app-engine-experiments\compute-engine\osconfig-policy-poc.yaml"
Event(wd=1, mask=1073742080, cookie=0, name='recipe-runscript')
New recipe: recipe-runscript2, rename: /tmp/osconfig_software_recipes.mali1596821311/xxx-recipe-name -> /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript
New rundir recipe-runscript2, rename: /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript/xxx-rundir -> /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript/run_1596821899000709826
# cat /tmp/poc.txt
uid=0(root) gid=0(root) groups=0(root),1000(google-sudoers)
SO: instancia f1-micro de GCE con la imagen predeterminada de Debian 10.
Google optó por usar un directorio temporal aleatorio en lugar de uno predecible.
La versión corregida se publicó el 2020-09-05. Debes actualizar tu paquete del SO.
Esta es una vulnerabilidad de escalada local de privilegios, por lo que podría ser explotada por alguien que ya tenga derechos de ejecución de código en las VMs de GCE afectadas:
alguien con un shell de bajos privilegios
un atacante a través de un servicio de red ya comprometido
El punto clave es tomar el control del «directorio base» (/tmp/osconfig_software_recipes), lo cual es posible si aún no se ha procesado ninguna receta en la sesión actual, lo que significa:
no se ha ejecutado ninguna receta hasta ahora (p. ej., la función osconfig no estaba en uso, pero se usará en algún momento posterior)
la VM se reinicia y todas las recetas están presentes en la base de datos (/var/lib/google/osconfig_recipedb), pero algunas actualizaciones de políticas se ejecutan en algún momento posterior
Si bien esta combinación especial ciertamente reduce la probabilidad de explotación, creo que utilizar un directorio de trabajo en /tmp no es seguro aquí. (Tampoco Google lo consideró seguro; este problema está corregido desde entonces.)
2020-08-07: Problema descubierto y reportado
2020-08-08: Problema clasificado por Google, prioridad cambiada a P1
2020-08-10: Problema confirmado por Google («🎉 ¡Buen hallazgo!»), prioridad cambiada a P2, severidad a S2
2020-08-14: Actualización sobre el proceso de VRP
2020-09-05: Problema corregido por Google
Imre Rad
https://github.com/GoogleCloudPlatform/osconfig
https://issuetracker.google.com/issues/163147689
https://github.com/GoogleCloudPlatform/osconfig/commit/fa7e4ba5ee85be212ffbac66d96862c792bd270c