第三階段 — 緩解
第三階段建立 CSD 緩解的前後對比證明。您先在不啟用任何緩解措施的情況下重新執行攻擊以建立基準線,套用緩解措施後,再重新執行相同的攻擊,以證明 CSD 能夠封鎖網路呼叫。繼續之前,第二階段必須已完成——所有 DET 檢查均須通過。
步驟 1:確認無作用中的緩解措施(基準線)
Section titled “步驟 1:確認無作用中的緩解措施(基準線)”在擷取「前」的快照之前,請確認環境是乾淨的——不應有任何作用中的緩解措施。這可確保基準線攻擊在沒有任何 CSD 封鎖的情況下執行。
檢查已緩解網域數量
Section titled “檢查已緩解網域數量”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'如果數量不是 0,表示有緩解措施遺留自先前的執行。請在繼續之前將其逐一刪除:
# 刪除已緩解的網域(對每個網域名稱重複執行)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.net、esm.sh、unpkg.com、ga.jspm.io、httpbin.org、jsonplaceholder.typicode.com)。如果清理 httpbin.org 後仍有剩餘項目,也請嘗試刪除 www.httpbin.org——部分先前的執行可能以此作為 metadata name。
確認第二階段的偵測結果存在
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}]}'| 檢查項目 | 預期結果 | 狀態 |
|---|---|---|
| 已緩解網域數量 | 0(乾淨的基準線) | 若為 0 則 PASS,若 > 0 則需清理 |
| 已偵測網域數量 | > 0(第二階段偵測結果存在) | 若 > 0 則 PASS |
| 外洩網域存在 | www.httpbin.org、jsonplaceholder.typicode.com | 若至少出現一個則 PASS |
步驟 2:執行攻擊——緩解前
Section titled “步驟 2:執行攻擊——緩解前”在沒有作用中緩解措施的情況下重新執行合併模擬,以擷取新鮮的基準線。這是**「前」的快照**——證明在未套用 CSD 緩解時攻擊能夠成功的證明。
AI 自動化執行
Section titled “AI 自動化執行”具備瀏覽器自動化工具的 AI 助理可使用與第二階段相同的 initScript(儲存原生 fetch)以程式方式執行攻擊模擬:
- 以 initScript 導覽 — 先導覽至
about:blank以確保乾淨的文件內容(避免先前導覽遺留的舊 initScript),然後使用第二階段 initScript(逐字複製自第二階段 — AI 自動化執行中的程式碼)以navigate_page導覽至http://$F5XC_DOMAINNAME/#/login。此 initScript 儲存原生的setInterval、clearInterval、fetch和console.log——由於此時尚無作用中的緩解措施,原生fetch參考是正確的 - 關閉歡迎橫幅 — 以
press_key按下Escape關閉歡迎橫幅。後續訪問時橫幅可能不會出現(Cookie 已持久化)。Cookie 同意對話框會由 Escape 鍵自動關閉 - 等待完成 — 等待 10 秒,讓所有 CDN 腳本載入/錯誤回呼及 fetch promise 解析完成
- 擷取證據 — 以
list_console_messages檢查是否有[CSD Demo] Simulation complete及 CDN 載入結果;以list_network_requests過濾script和fetch類型,驗證 HTTP 狀態碼(200/201表示成功)
不具備瀏覽器自動化工具的操作人員可依照與第二階段 — 步驟 8:攻擊模擬相同的程序手動執行模擬:
- 導覽至
http://xF5XC_DOMAINNAMEx/#/login - 在電子郵件和密碼欄位中輸入虛擬憑證(勿提交)
- 開啟 DevTools——按 F12 並切換至 Console 分頁
- 貼上並執行來自觸發偵測的合併偵測腳本
- 觀察主控台輸出——所有 CDN 腳本應能載入,且外洩呼叫應以
200/201回應成功
證據——緩解前
Section titled “證據——緩解前”| 檢查項目 | 預期結果(緩解前) | 狀態 |
|---|---|---|
| CDN 腳本已注入 | 所有 4 個腳本標籤載入——出現 [Supply Chain] Loaded from 訊息,網路分頁顯示 200 | PASS |
外洩 fetch 至 www.httpbin.org | 網路分頁顯示 200——資料已傳送 | PASS |
| 外洩 fetch 至 jsonplaceholder.typicode.com | 網路分頁顯示 201——資料已傳送 | PASS |
| 主控台輸出 | [CSD Demo] Simulation complete | PASS |
步驟 3:套用緩解措施
Section titled “步驟 3:套用緩解措施”針對每個已偵測到的網域,向已緩解網域端點發送 POST 請求。第二階段模擬的主要目標是 4 個 CDN 注入網域及任何已偵測到的資料外洩網域。
主要緩解目標(來自合併模擬腳本):
| 網域 | 角色 |
|---|---|
cdn.jsdelivr.net | CDN 腳本注入 |
esm.sh | CDN 腳本注入 |
unpkg.com | CDN 腳本注入 |
ga.jspm.io | CDN 腳本注入 |
www.httpbin.org | 資料外洩端點 |
jsonplaceholder.typicode.com | 資料外洩端點 |
緩解網域(每個網域執行一次):
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 .對每個網域重複執行:
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.comcurl -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.iocurl -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 — 使用 www.httpbin.org 作為 mitigated_domain(詳見下方說明)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.comcurl -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:確認緩解措施已套用”列出所有已緩解的網域,並確認數量與剛才提交的網域數量相符:
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 封鎖(<script> 標籤的 src 被清空為空字串)。
AI 自動化執行
Section titled “AI 自動化執行”具備瀏覽器自動化工具的 AI 助理可使用相同的第二階段 initScript(逐字複製自第二階段 — AI 自動化執行)以程式方式重新執行攻擊模擬。initScript 儲存原生 fetch 以避免 zone.js 錯誤——這不影響 CSD 緩解,因為 CSD 不攔截 fetch() 呼叫。
- 以 initScript 導覽 — 使用帶有
isolatedContext的new_page以取得乾淨的瀏覽器內容(避免步驟 2 遺留的舊 initScript),然後導覽至about:blank,再以第二階段 initScript 導覽至登入頁面 - 關閉歡迎橫幅 — 以
press_key按下Escape - 等待完成 — 等待 10 秒讓所有非同步回呼完成
- 擷取證據 — 以
list_console_messages檢查是否有[CSD Demo] Simulation complete;以list_network_requests過濾script和fetch類型,觀察 CDN 腳本載入不存在(CSD 清空了腳本 src),而對外洩網域的 fetch 呼叫仍正常完成
不具備瀏覽器自動化工具的操作人員可依照與第二階段 — 步驟 8:攻擊模擬相同的程序手動重新執行模擬:
- 導覽至
http://xF5XC_DOMAINNAMEx/#/login - 在電子郵件和密碼欄位中輸入虛擬憑證(勿提交)
- 開啟 DevTools——按 F12 並切換至 Console 分頁
- 貼上並執行來自觸發偵測的合併偵測腳本
- 觀察主控台和網路輸出——已緩解網域的 CDN 腳本
onload和onerror回呼不會觸發(CSD 將腳本src清空為空字串,完全阻止了網路請求)。向外洩網域(www.httpbin.org、jsonplaceholder.typicode.com)發出的 Fetch 呼叫仍會完成,返回200/201——CSD 緩解封鎖的是腳本載入,而非 fetch/XHR 呼叫
證據——緩解後
Section titled “證據——緩解後”| 檢查項目 | 預期結果(緩解後) | 狀態 |
|---|---|---|
| CDN 腳本載入 | 已封鎖 — 腳本不出現在網路分頁(CSD 將 src 清空為空字串) | PASS |
| CDN 腳本回呼 | 已緩解網域的 onload 和 onerror 均未觸發 | PASS |
外洩 fetch 至 www.httpbin.org | 200 — fetch 仍完成(CSD 不攔截 fetch) | INFO |
| 外洩 fetch 至 jsonplaceholder.typicode.com | 201 — fetch 仍完成(CSD 不攔截 fetch) | INFO |
| 主控台輸出 | [CSD Demo] Simulation complete | PASS |
步驟 6:前後比較
Section titled “步驟 6:前後比較”這是示範的核心成果——並排比較的證據,證明在相同頁面、使用相同腳本執行的相同攻擊,現在產生了截然不同的結果。
| 信號 | 緩解前(步驟 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 已緩解網域 API | 0 個已緩解 | 6 個已緩解 |
在後端資料中驗證緩解措施
Section titled “在後端資料中驗證緩解措施”每隔 60 秒查詢 /detected_domains,最多查詢 10 次(10 分鐘)。查詢返回結果後或達到 10 分鐘上限後,請繼續進行比較表——這些檢查僅供參考,不阻擋第四階段。
查詢緩解後的已偵測網域:
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}]}'查詢腳本的已緩解狀態:
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}]}'第三階段證據摘要
Section titled “第三階段證據摘要”| 檢查項目 | 預期結果 | 狀態 |
|---|---|---|
| 基準線乾淨(步驟 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 |
第三階段完成。 當您準備好移除所有部署物件時,請繼續進行第四階段 — 拆除。