
PoC-эксплойт уязвимости повышения привилегий, обнаруженной в Google Osconfig
Процесс google_osconfig_agent является компонентом инструментария GoogleCloudPlatform (https://github.com/GoogleCloudPlatform/osconfig), работающим по умолчанию на каждой ВМ. Агент работает от имени root и отвечает за некоторые управляемые пользователем службы, включая OS config (https://cloud.google.com/compute/docs/os-config-management), что является своего рода реализацией Google управления конфигурацией желаемого состояния на основе опроса.
Этот репозиторий содержит демонстрацию уязвимости повышения привилегий, которую я обнаружил в реализации (и которая с тех пор была исправлена Google).
Задачи, которые должны быть выполнены, называются рецептами, и одним из поддерживаемых типов рецептов является выполнение shell-скрипта. При обработке такого рецепта агент — работающий от имени root и обладающий всеми возможностями — временно сохраняет файлы в каталог /tmp, а затем выполняет их. Созданный агентом каталог может быть перехвачен, и, таким образом, выполняемый скрипт может быть подменён, что фактически приводит к локальному повышению привилегий.
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)
ОС: инстанс f1-micro в GCE с образом Debian 10 по умолчанию.
Google перешёл на использование случайного временного каталога вместо предсказуемого.
Исправленная версия была выпущена 2020-09-05. Вам необходимо обновить свой пакет ОС.
Это уязвимость локального повышения привилегий, поэтому она может быть использована тем, кто уже имеет права на выполнение кода на затронутых ВМ GCE:
любой, у кого есть shell с низкими привилегиями
атакующий через уже скомпрометированный сетевой сервис
Ключевой момент — захват «базового каталога» (/tmp/osconfig_software_recipes), что возможно, если в текущей сессии ещё не обработано ни одного рецепта, а именно:
рецепты вообще ещё ни разу не выполнялись (например, функция osconfig не использовалась, но будет использоваться позже)
ВМ перезагружена, и все рецепты присутствуют в БД (/var/lib/google/osconfig_recipedb), но некоторые обновления политик выполняются в какой-то момент позже
Хотя такое особое сочетание действительно снижает вероятность эксплуатации, я считаю, что использование рабочего каталога в /tmp здесь небезопасно. (Google тоже так считал, эта проблема с тех пор исправлена.)
2020-08-07: Проблема обнаружена и передана
2020-08-08: Проблема рассмотрена Google, приоритет изменён на P1
2020-08-10: Проблема подтверждена Google («🎉 Отличная находка!»), приоритет изменён на P2, серьёзность на S2
2020-08-14: Обновление о процессе VRP
2020-09-05: Проблема исправлена Google
Imre Rad
https://github.com/GoogleCloudPlatform/osconfig
https://issuetracker.google.com/issues/163147689
https://github.com/GoogleCloudPlatform/osconfig/commit/fa7e4ba5ee85be212ffbac66d96862c792bd270c