コンテンツにスキップ

フェーズ 3 — 軽減

フェーズ 3 では CSD 軽減の前後の証拠を作成します。まず軽減なしで攻撃を再実行してベースラインを確立し、軽減を適用したうえで同じ攻撃を再実行することで、CSD がネットワーク呼び出しをブロックすることを証明します。先に進む前に、フェーズ 2 が完了していること(すべての DET チェックが PASS になっていること)が必要です。

ステップ 1: アクティブな軽減がないことを確認する(ベースライン)

Section titled “ステップ 1: アクティブな軽減がないことを確認する(ベースライン)”

「前」のスナップショットを取得する前に、環境がクリーンであること(軽減がアクティブでないこと)を確認します。これにより、CSD ブロックなしでベースライン攻撃が実行されます。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

カウントが 0 でない場合、前の実行から軽減が残っています。先に進む前に、それぞれを削除してください:

Terminal window
# 軽減済みドメインを削除する(ドメイン名ごとに繰り返す)
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/<domain-name>" \
| jq .

<domain-name> は、ドメインを軽減した際に使用した metadata.name(例: cdn.jsdelivr.netesm.shunpkg.comga.jspm.iohttpbin.orgjsonplaceholder.typicode.com)に置き換えてください。httpbin.org のクリーンアップ後にアイテムが残る場合は、www.httpbin.org の削除も試してください。前の実行でそちらをメタデータ名として使用している可能性があります。

フェーズ 2 の検出結果が存在することを確認する

Section titled “フェーズ 2 の検出結果が存在することを確認する”
Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'
チェック期待値ステータス
軽減済みドメイン数0(クリーンなベースライン)0 なら PASS、> 0 ならクリーンアップが必要
検出済みドメイン数> 0(フェーズ 2 の検出結果が存在)> 0 なら PASS
流出ドメインの存在www.httpbin.orgjsonplaceholder.typicode.com少なくとも 1 件あれば PASS

ステップ 2: 攻撃を実行する — 軽減前

Section titled “ステップ 2: 攻撃を実行する — 軽減前”

軽減がアクティブでない状態で、組み合わせシミュレーションを再実行し、新鮮なベースラインを取得します。これが**「前」のスナップショット**であり、CSD 軽減が適用されていない場合に攻撃が成功することの証明です。

ブラウザ自動化ツールを持つ AI アシスタントは、フェーズ 2 と同じ initScript(ネイティブ fetch を保存する)を使用して攻撃シミュレーションをプログラム的に実行します:

  1. initScript を使用してナビゲート — まずクリーンなドキュメントコンテキストを確保するために about:blank にナビゲートし(前のナビゲーションからの古い initScript を回避)、次にフェーズ 2 の initScriptフェーズ 2 — AI 自動実行 の逐語的なコード)を使用して http://$F5XC_DOMAINNAME/#/loginnavigate_page します。この initScript はネイティブの setIntervalclearIntervalfetchconsole.log を保存します。軽減がアクティブでないため、ネイティブ fetch の参照はここでは正しいものです
  2. ウェルカムバナーを閉じるEscape キーで press_key してウェルカムバナーを閉じます。再訪問時はバナーが表示されない場合があります(Cookie が永続化されています)。Cookie 同意ダイアログは Escape キーで自動的に閉じられます
  3. 完了を待つ — すべての CDN スクリプトのロード/エラーコールバックと fetch Promise の解決が完了するまで 10 秒待ちます
  4. 証拠を取得するlist_console_messages[CSD Demo] Simulation complete と CDN ロード結果を確認します;list_network_requestsscript および fetch タイプでフィルタリングして HTTP ステータスコード(成功の場合は 200/201)を確認します

ブラウザ自動化ツールを持たないオペレーターは、フェーズ 2 — ステップ 8: 攻撃シミュレーションと同じ手順でシミュレーションを手動で実行します:

  1. http://xF5XC_DOMAINNAMEx/#/login にナビゲートします
  2. メールとパスワードフィールドにダミーの認証情報を入力します(送信しないでください)
  3. DevTools を開きます — F12 を押して Console タブに切り替えます
  4. トリガー検出の組み合わせ検出スクリプトを貼り付けて実行します
  5. コンソール出力を観察します — すべての CDN スクリプトが読み込まれ、流出呼び出しが 200/201 レスポンスで成功するはずです
チェック期待値(軽減前)ステータス
CDN スクリプト注入4 つのスクリプトタグがすべて読み込まれる — [Supply Chain] Loaded from メッセージが表示され、ネットワークタブに 200 が表示されるPASS
www.httpbin.org への流出 fetchネットワークタブに 200 — データが送信されたPASS
jsonplaceholder.typicode.com への流出 fetchネットワークタブに 201 — データが送信されたPASS
コンソール出力[CSD Demo] Simulation completePASS

検出されたドメインごとに、軽減済みドメインエンドポイントに POST します。フェーズ 2 のシミュレーションからの主要なターゲットは、4 つの CDN 注入ドメインと検出されたデータ流出ドメインです。

主要な軽減ターゲット(組み合わせシミュレーションスクリプトより):

ドメイン役割
cdn.jsdelivr.netCDN スクリプト注入
esm.shCDN スクリプト注入
unpkg.comCDN スクリプト注入
ga.jspm.ioCDN スクリプト注入
www.httpbin.orgデータ流出エンドポイント
jsonplaceholder.typicode.comデータ流出エンドポイント

ドメインを軽減する(ドメインごとに 1 回実行):

Terminal window
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"name": "cdn.jsdelivr.net",
"namespace": "xF5XC_NAMESPACEx"
},
"spec": {
"mitigated_domain": "cdn.jsdelivr.net"
}
}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .

各ドメインに対して繰り返します:

esm.sh
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"esm.sh","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"esm.sh"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# unpkg.com
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"unpkg.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"unpkg.com"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# ga.jspm.io
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"ga.jspm.io","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"ga.jspm.io"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# httpbin.org — mitigated_domain には www.httpbin.org を使用する(以下の注意を参照)
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"httpbin.org","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"www.httpbin.org"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .
# jsonplaceholder.typicode.com
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{"metadata":{"name":"jsonplaceholder.typicode.com","namespace":"xF5XC_NAMESPACEx"},"spec":{"mitigated_domain":"jsonplaceholder.typicode.com"}}' \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq .

200 レスポンスは作成された軽減済みドメインオブジェクトを返します。409 レスポンスはドメインがすでに軽減リストに含まれていることを意味します。これは成功条件です。

ステップ 4: 軽減が適用されたことを確認する

Section titled “ステップ 4: 軽減が適用されたことを確認する”

すべての軽減済みドメインを一覧表示し、カウントが送信したドメイン数と一致することを確認します:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'
チェック期待値ステータス
軽減済みドメイン数6(POST 数と一致)カウントが一致すれば PASS
ステップ 3 のすべての POST が 200 または 409 を返した各ドメインが受け入れられたPASS

カウントが期待値より少ない場合は、ステップ 3 から不足しているドメインの POST コマンドを再実行してください。

ステップ 5: 攻撃を実行する — 軽減後

Section titled “ステップ 5: 攻撃を実行する — 軽減後”

「後」のスナップショットを取得するために、まったく同じ組み合わせシミュレーションを再実行します。シミュレーションスクリプトは同一です。変わったのは CSD の軽減状態だけです。軽減済みドメインからのスクリプト読み込みは、CSD JavaScript によってブロックされるようになっています(&lt;script&gt; タグの src が空文字列にクリアされます)。

ブラウザ自動化ツールを持つ AI アシスタントは、フェーズ 2 と同じ initScriptフェーズ 2 — AI 自動実行 の逐語的なコード)を使用して攻撃シミュレーションをプログラム的に再実行します。initScript はネイティブ fetch を保存して zone.js エラーを回避します。CSD は fetch() 呼び出しをインターセプトしないため、これは CSD 軽減に影響しません。

  1. initScript を使用してナビゲート — クリーンなブラウザコンテキストのために isolatedContext を指定した new_page を使用し(ステップ 2 の古い initScript を回避)、about:blank にナビゲートし、次にフェーズ 2 の initScript を使用してログインページにナビゲートします
  2. ウェルカムバナーを閉じるEscape キーで press_key します
  3. 完了を待つ — すべての非同期コールバックが完了するまで 10 秒待ちます
  4. 証拠を取得するlist_console_messages[CSD Demo] Simulation complete を確認します;list_network_requestsscript および fetch タイプでフィルタリングして、CDN スクリプトの読み込みが存在しないこと(CSD がスクリプト src をクリアした)を観察し、流出ドメインへの fetch 呼び出しは引き続き正常に完了することを確認します

ブラウザ自動化ツールを持たないオペレーターは、フェーズ 2 — ステップ 8: 攻撃シミュレーションと同じ手順でシミュレーションを手動で再実行します:

  1. http://xF5XC_DOMAINNAMEx/#/login にナビゲートします
  2. メールとパスワードフィールドにダミーの認証情報を入力します(送信しないでください)
  3. DevTools を開きます — F12 を押して Console タブに切り替えます
  4. トリガー検出の組み合わせ検出スクリプトを貼り付けて実行します
  5. コンソールとネットワーク出力を観察します — 軽減済みドメインの CDN スクリプトの onload および onerror コールバックは発火しません(CSD がスクリプト src を空文字列にクリアし、ネットワークリクエスト自体を防いだためです)。流出ドメイン(www.httpbin.org、jsonplaceholder.typicode.com)への fetch 呼び出しは200/201引き続き完了します — CSD 軽減はスクリプトの読み込みをブロックし、fetch/XHR 呼び出しはブロックしません
チェック期待値(軽減後)ステータス
CDN スクリプトの読み込みブロック済み — スクリプトがネットワークタブに表示されない(CSD が src を空文字列にクリアした)PASS
CDN スクリプトコールバック軽減済みドメインの onloadonerror も発火しないPASS
www.httpbin.org への流出 fetch200 — fetch は引き続き完了する(CSD は fetch をインターセプトしない)INFO
jsonplaceholder.typicode.com への流出 fetch201 — fetch は引き続き完了する(CSD は fetch をインターセプトしない)INFO
コンソール出力[CSD Demo] Simulation completePASS

これがデモのクライマックスです。同じページで、同じスクリプトを使用して、まったく同じ攻撃を実行したにもかかわらず、まったく異なる結果になることを並べて示す証拠です。

シグナル軽減前(ステップ 2)軽減後(ステップ 5)
CDN スクリプトの読み込み200 — 4 つの CDN スクリプトがすべて正常に読み込まれるブロック済み — スクリプトがネットワークタブに表示されない(CSD が src を空文字列にクリアした)
CDN onload コールバック[Supply Chain] Loaded from メッセージが表示されるコールバックは発火しない(ネットワークリクエストが行われなかった)
www.httpbin.org への流出200 — データが流出した200 — fetch は引き続き完了する(CSD は fetch をインターセプトしない)
jsonplaceholder.typicode.com への流出201 — データが流出した201 — fetch は引き続き完了する(CSD は fetch をインターセプトしない)
CSD 軽減済みドメイン API0 件軽減済み6 件軽減済み

バックエンドデータでの軽減確認

Section titled “バックエンドデータでの軽減確認”

/detected_domains を 60 秒ごとに最大 10 回(10 分)クエリします。クエリが返ってきた時点、または最大 10 分後に比較表に進んでください。これらのチェックは情報提供目的であり、フェーズ 4 のゲートにはなりません。

軽減後の検出済みドメインの確認:

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{total_domains: .domain_summary.totalDomains, domains: [.domains_list[]? | {domain: .domain, category: .category}]}'

軽減済みステータスのスクリプト確認:

Terminal window
NOW=$(date +%s)
START=$(( NOW - 86400 ))
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \
| jq '{total: (.scripts | length), scripts: [.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]}'
チェック期待値ステータス
ベースラインクリーン(ステップ 1)開始時に軽減済みドメインが 0 件PASS / FAIL
前 — 攻撃が成功する(ステップ 2)スクリプトが読み込まれ、流出が 200/201 を返すPASS / FAIL
軽減が適用された(ステップ 3)6 つのドメインすべてが POST で受け入れられた(200 または 409)PASS / FAIL
軽減済み数が確認された(ステップ 4)リストに 6 件PASS / FAIL
後 — スクリプトの読み込みがブロックされた(ステップ 5)CDN スクリプトがネットワークタブに表示されず、fetch 呼び出しは引き続き完了するPASS / FAIL
前後比較(ステップ 6)ステップ 2 とステップ 5 の証拠に明確な違いがあるPASS / FAIL

フェーズ 3 完了。 すべてのデプロイメントオブジェクトを削除する準備ができたら、フェーズ 4 — ティアダウンに進んでください。