GCP - Cloudfunctions Privesc
cloudfunctions
Cloud Functionsに関する詳細情報:
GCP - Cloud Functions Enumcloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
これらの権限を持つ攻撃者は、任意の(悪意のある)コードを持つ新しいCloud Functionを作成し、それにService Accountを割り当てることができます。次に、メタデータからService Accountトークンを漏洩させて、その権限を昇格させます。 関数をトリガーするためにいくつかの権限が必要な場合があります。
この方法のためのエクスプロイトスクリプトはこちらとこちらにあり、事前構築された.zipファイルはこちらにあります。
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
これらの権限を持つ攻撃者は、Functionのコードを変更し、トークンを抽出する目的で関連付けられたサービスアカウントを変更することができます。
Cloud Functionsをデプロイするには、デフォルトのコンピュートサービスアカウントまたはイメージを構築するために使用されるサービスアカウントに対するactAs権限も必要です。
バージョン1のcloudfunctionsに対する.call
権限や、関数をトリガーするためのrole/run.invoker
ロールなどの追加の権限が必要な場合があります。
Permission 'run.services.setIamPolicy' denied on resource...
というエラーが表示される場合は、--allow-unauthenticated
パラメータを使用しており、十分な権限がないためです。
このメソッドのエクスプロイトスクリプトはこちらで見つけることができます。
cloudfunctions.functions.sourceCodeSet
cloudfunctions.functions.sourceCodeSet
この権限を使用すると、関数バケットにファイルをアップロードするための署名付きURLを取得できます(ただし、関数のコードは変更されず、更新する必要があります)
攻撃者の視点からこの権限がどれほど有用かはあまり確信が持てませんが、知っておくのは良いことです。
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
前述の**.update
または.create
**のいずれかの権限を自分に与えて昇格します。
cloudfunctions.functions.update
cloudfunctions.functions.update
**cloudfunctions
の権限だけでは、iam.serviceAccounts.actAs
**がないと関数を更新することはできません。したがって、これは有効な昇格ではありません。
バケット書き込み権限
Cloud Functionsのコードが保存されているバケットに書き込み権限を持つ攻撃者は、function_code.zip
を上書きしてコードを任意のコードに変更できると考えるかもしれません。
しかし、これは真実ではありません。バケット内のコードを上書きしても、実行されるコードは変更されません。
参考文献
Last updated