
Preuve de concept concernant la faille d'élévation de privilèges identifiée dans Osconfig de Google
Le processus google_osconfig_agent est un composant de l'outillage GoogleCloudPlatform (https://github.com/GoogleCloudPlatform/osconfig), exécuté sur chaque VM par défaut. L'agent s'exécute en tant que root et est responsable de certains services contrôlables par l'utilisateur, notamment OS config (https://cloud.google.com/compute/docs/os-config-management), qui est une sorte d'implémentation par Google de la configuration d'état souhaité, basée sur un mécanisme d'interrogation.
Ce dépôt héberge une démonstration d'une faille d'élévation de privilèges que j'ai identifiée dans l'implémentation (et qui a été corrigée par Google depuis).
Les tâches à exécuter sont appelées recettes, et l'un des types de recettes pris en charge consiste à exécuter un script shell. Lors du traitement d'une telle recette, l'agent - qui s'exécute en tant que root avec toutes les capacités - enregistre temporairement des fichiers dans le répertoire /tmp, puis les exécute. Le répertoire créé par l'agent peut être détourné et ainsi le script à exécuter peut être remplacé, ce qui conduit effectivement à une élévation locale de privilèges.
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)
OS : instance f1-micro de GCE avec l'image Debian 10 par défaut.
Google a opté pour l'utilisation d'un répertoire temporaire aléatoire au lieu d'un répertoire prévisible.
La version corrigée a été publiée le 5 septembre 2020. Vous devez mettre à niveau votre paquet du système d'exploitation.
Il s'agit d'une vulnérabilité d'élévation locale de privilèges, elle pourrait donc être exploitée par une personne disposant déjà de droits d'exécution de code sur les VM GCE concernées :
une personne disposant d'un shell à faibles privilèges
un attaquant via un service réseau déjà compromis
Le point clé est de prendre le contrôle du "répertoire de base" (/tmp/osconfig_software_recipes), ce qui est possible si aucune recette n'a encore été traitée dans la session en cours, ce qui signifie :
aucune recette n'a été exécutée jusqu'à présent (par exemple, la fonctionnalité osconfig n'était pas utilisée, mais le sera plus tard)
la VM est redémarrée et toutes les recettes sont présentes dans la base de données (/var/lib/google/osconfig_recipedb), mais certaines mises à jour de politique sont exécutées plus tard
Bien que cette combinaison particulière diminue effectivement la probabilité d'exploitation, je pense que l'utilisation d'un répertoire de travail dans /tmp n'est pas sûre ici. (Google non plus ne le pensait pas, ce problème est corrigé depuis.)
2020-08-07 : Problème découvert et signalé
2020-08-08 : Problème trié par Google, priorité changée à P1
2020-08-10 : Problème confirmé par Google ("🎉 Bien vu !"), priorité changée à P2, sévérité à S2
2020-08-14 : Mise à jour concernant le processus VRP
2020-09-05 : Problème corrigé par Google
Imre Rad
https://github.com/GoogleCloudPlatform/osconfig
https://issuetracker.google.com/issues/163147689
https://github.com/GoogleCloudPlatform/osconfig/commit/fa7e4ba5ee85be212ffbac66d96862c792bd270c