ข้ามไปยังเนื้อหา

เฟส 3 — ลดผลกระทบ

เฟส 3 สร้าง หลักฐานก่อน/หลัง ของการลดผลกระทบ CSD คุณรันการโจมตีอีกครั้งโดยไม่มีการลดผลกระทบเพื่อสร้างเส้นฐาน จากนั้นใช้การลดผลกระทบ แล้วรันการโจมตีเดิมอีกครั้งเพื่อพิสูจน์ว่า CSD บล็อกการเรียก network ได้ เฟส 2 ต้องเสร็จสิ้นก่อน — การตรวจสอบ DET ทั้งหมดต้องผ่าน (PASS) — จึงจะดำเนินการต่อได้

ขั้นตอนที่ 1: ยืนยันว่าไม่มีการลดผลกระทบที่ใช้งานอยู่ (เส้นฐาน)

หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 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.net, esm.sh, unpkg.com, ga.jspm.io, httpbin.org, jsonplaceholder.typicode.com) หากการล้างข้อมูล httpbin.org ยังเหลือรายการค้างอยู่ ให้ลอง delete www.httpbin.org ด้วย — การรันก่อนหน้าบางครั้งอาจใช้ชื่อนั้นเป็น metadata name

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 (เส้นฐานสะอาด)PASS ถ้าเป็น 0, ต้องทำความสะอาดถ้า > 0
จำนวนโดเมนที่ตรวจพบ> 0 (มีการตรวจจับจากเฟส 2)PASS ถ้า > 0
มีโดเมน Exfilwww.httpbin.org, jsonplaceholder.typicode.comPASS ถ้าปรากฏอย่างน้อยหนึ่งรายการ

รันการจำลองรวมอีกครั้งโดยไม่มีการลดผลกระทบที่ใช้งานอยู่ เพื่อบันทึกเส้นฐานใหม่ นี่คือภาพ “ก่อน” — หลักฐานที่พิสูจน์ว่าการโจมตีประสบความสำเร็จเมื่อไม่ได้ใช้การลดผลกระทบ CSD

ผู้ช่วย AI ที่มีเครื่องมือ browser automation รันการจำลองการโจมตีด้วยโปรแกรมโดยใช้ initScript เดียวกับเฟส 2 (ซึ่งบันทึก native fetch):

  1. นำทางด้วย initScript — นำทางไปที่ about:blank ก่อนเพื่อให้มั่นใจว่า document context สะอาด (หลีกเลี่ยง initScript เก่าจากการนำทางก่อนหน้า) จากนั้น navigate_page ไปที่ http://$F5XC_DOMAINNAME/#/login ด้วย initScript ของเฟส 2 (โค้ดที่เหมือนกันทุกประการใน เฟส 2 — การรันอัตโนมัติด้วย AI) initScript นี้บันทึก native setInterval, clearInterval, fetch และ console.log — การอ้างอิง native fetch ถูกต้องที่นี่เพราะยังไม่มีการลดผลกระทบที่ใช้งานอยู่
  2. ปิด Welcome Bannerpress_key ด้วย Escape เพื่อปิด Welcome Banner ในการเยี่ยมชมครั้งต่อๆ ไป banner อาจไม่ปรากฏ (cookies ถูกเก็บไว้) dialog ขอความยินยอม cookie จะถูกปิดโดยอัตโนมัติด้วยปุ่ม Escape
  3. รอจนเสร็จ — รอ 10 วินาทีให้ callback การโหลด/error ของสคริปต์ CDN และการ resolve promise ของ fetch เสร็จสิ้นทั้งหมด
  4. บันทึกหลักฐานlist_console_messages เพื่อตรวจสอบ [CSD Demo] Simulation complete และผลลัพธ์การโหลด CDN; list_network_requests กรองตามประเภท script และ fetch เพื่อตรวจสอบ HTTP status codes (200/201 สำหรับความสำเร็จ)

ผู้ปฏิบัติงานที่ไม่มีเครื่องมือ browser automation รันการจำลองแบบ manual โดยใช้ขั้นตอนเดียวกับ เฟส 2 — ขั้นตอนที่ 8: การจำลองการโจมตี:

  1. นำทางไปที่ http://xF5XC_DOMAINNAMEx/#/login
  2. กรอก credentials จำลองในช่อง Email และ Password (อย่ากด submit)
  3. เปิด DevTools — กด F12 และสลับไปที่แท็บ Console
  4. วางและรัน Combined Detection Script จาก การตรวจจับทริกเกอร์
  5. สังเกต console output — สคริปต์ CDN ทั้งหมดควรโหลดได้และการเรียก exfil ควรสำเร็จด้วยการตอบสนอง 200/201
การตรวจสอบที่คาดหวัง (ก่อนการลดผลกระทบ)สถานะ
สคริปต์ CDN ถูก injectแท็กสคริปต์ทั้ง 4 โหลด — ข้อความ [Supply Chain] Loaded from ปรากฏ, แท็บ network แสดง 200PASS
Exfil fetch ไปที่ www.httpbin.orgแท็บ network แสดง 200 — ส่งข้อมูลแล้วPASS
Exfil fetch ไปที่ jsonplaceholder.typicode.comแท็บ network แสดง 201 — ส่งข้อมูลแล้วPASS
Console output[CSD Demo] Simulation completePASS

สำหรับแต่ละโดเมนที่ตรวจพบ ให้ POST ไปที่ mitigated domains endpoint เป้าหมายหลักจากการจำลองในเฟส 2 คือโดเมน CDN injection 4 โดเมนและโดเมน data exfiltration ที่ตรวจพบ

เป้าหมายการลดผลกระทบหลัก (จากสคริปต์การจำลองรวม):

โดเมนบทบาท
cdn.jsdelivr.netCDN script injection
esm.shCDN script injection
unpkg.comCDN script injection
ga.jspm.ioCDN script injection
www.httpbin.orgเอนด์พอยต์การขโมยข้อมูล
jsonplaceholder.typicode.comเอนด์พอยต์การขโมยข้อมูล

ลดผลกระทบโดเมน (รันครั้งเดียวต่อโดเมน):

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 — ใช้ 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.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 จะคืน object ของ mitigated domain ที่สร้างขึ้น การตอบสนอง 409 หมายความว่าโดเมนอยู่ในรายการ mitigated แล้ว — นี่คือเงื่อนไขความสำเร็จ

ขั้นตอนที่ 4: ตรวจสอบว่าการลดผลกระทบถูกใช้แล้ว

หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 4: ตรวจสอบว่าการลดผลกระทบถูกใช้แล้ว”

แสดงรายการ mitigated domains ทั้งหมดและยืนยันว่าจำนวนตรงกับจำนวนโดเมนที่เพิ่งส่ง:

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)}'
การตรวจสอบที่คาดหวังสถานะ
จำนวน mitigated domains6 (ตรงกับจำนวน POST)PASS ถ้าจำนวนตรงกัน
POST ทั้งหมดในขั้นตอนที่ 3 คืน 200 หรือ 409แต่ละโดเมนได้รับการยอมรับPASS

หากจำนวนน้อยกว่าที่คาดไว้ ให้รันคำสั่ง POST สำหรับโดเมนที่หายไปจากขั้นตอนที่ 3 อีกครั้ง

รันการจำลองรวมเดิมทุกประการอีกครั้งเพื่อบันทึกภาพ “หลัง” สคริปต์การจำลองเหมือนกันทุกประการ — มีเพียงสถานะการลดผลกระทบของ CSD เท่านั้นที่เปลี่ยนแปลง การโหลดสคริปต์จากโดเมนที่ถูกลดผลกระทบจะถูกบล็อกโดย JavaScript ของ CSD (แอตทริบิวต์ src ของแท็ก &lt;script&gt; จะถูกล้างเป็นสตริงว่าง)

ผู้ช่วย AI ที่มีเครื่องมือ browser automation รันการจำลองการโจมตีอีกครั้งด้วยโปรแกรมโดยใช้ initScript ของเฟส 2 เดิมทุกประการ (โค้ดที่เหมือนกันทุกประการใน เฟส 2 — การรันอัตโนมัติด้วย AI) initScript บันทึก native fetch เพื่อหลีกเลี่ยงข้อผิดพลาด zone.js — ไม่ส่งผลต่อการลดผลกระทบ CSD เพราะ CSD ไม่สกัดกั้นการเรียก fetch()

  1. นำทางด้วย initScript — ใช้ new_page ด้วย isolatedContext สำหรับ browser context ที่สะอาด (หลีกเลี่ยง initScript เก่าจากขั้นตอนที่ 2) จากนั้นนำทางไปที่ about:blank แล้วไปที่หน้า login ด้วย initScript ของเฟส 2
  2. ปิด Welcome Bannerpress_key ด้วย Escape
  3. รอจนเสร็จ — รอ 10 วินาทีสำหรับ async callback ทั้งหมด
  4. บันทึกหลักฐานlist_console_messages เพื่อตรวจสอบ [CSD Demo] Simulation complete; list_network_requests กรองตามประเภท script และ fetch เพื่อสังเกตว่าการโหลดสคริปต์ CDN ไม่ปรากฏ (CSD ล้าง script src แล้ว) ในขณะที่การเรียก fetch ไปยังโดเมน exfil ยังคงเสร็จสิ้นตามปกติ

ผู้ปฏิบัติงานที่ไม่มีเครื่องมือ browser automation รันการจำลองแบบ manual อีกครั้งโดยใช้ขั้นตอนเดียวกับ เฟส 2 — ขั้นตอนที่ 8: การจำลองการโจมตี:

  1. นำทางไปที่ http://xF5XC_DOMAINNAMEx/#/login
  2. กรอก credentials จำลองในช่อง Email และ Password (อย่ากด submit)
  3. เปิด DevTools — กด F12 และสลับไปที่แท็บ Console
  4. วางและรัน Combined Detection Script จาก การตรวจจับทริกเกอร์
  5. สังเกต console และ network output — callback onload และ onerror ของสคริปต์ CDN ไม่ทำงานสำหรับโดเมนที่ถูกลดผลกระทบ (CSD ล้าง src ของสคริปต์เป็นสตริงว่าง ป้องกัน network request ได้อย่างสมบูรณ์) การเรียก fetch ไปยังโดเมน exfil (www.httpbin.org, jsonplaceholder.typicode.com) ยังคงเสร็จสิ้นด้วย 200/201 — การลดผลกระทบ CSD บล็อกการโหลดสคริปต์ ไม่ใช่การเรียก fetch/XHR
การตรวจสอบที่คาดหวัง (หลังการลดผลกระทบ)สถานะ
การโหลดสคริปต์ CDNถูกบล็อก — สคริปต์ไม่ปรากฏในแท็บ network (CSD ล้าง src เป็นสตริงว่าง)PASS
Callback สคริปต์ CDNทั้ง onload และ onerror ไม่ทำงานสำหรับโดเมนที่ถูกลดผลกระทบPASS
Exfil fetch ไปที่ www.httpbin.org200 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch)INFO
Exfil fetch ไปที่ jsonplaceholder.typicode.com201 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch)INFO
Console output[CSD Demo] Simulation completePASS

นี่คือผลตอบแทนของการสาธิต — หลักฐานเคียงข้างกันที่พิสูจน์ว่าการโจมตีเดิม บนหน้าเดิม ด้วยสคริปต์เดิม ตอนนี้ให้ผลลัพธ์ที่แตกต่างกันอย่างสิ้นเชิง

สัญญาณก่อนการลดผลกระทบ (ขั้นตอนที่ 2)หลังการลดผลกระทบ (ขั้นตอนที่ 5)
การโหลดสคริปต์ CDN200 — สคริปต์ CDN ทั้ง 4 โหลดได้ตามปกติถูกบล็อก — สคริปต์ไม่ปรากฏในแท็บ network (CSD ล้าง src เป็นสตริงว่าง)
Callback onload ของ CDNข้อความ [Supply Chain] Loaded from ปรากฏไม่มี callback ทำงาน (ไม่มี network request เกิดขึ้น)
Exfil ไปที่ www.httpbin.org200 — ข้อมูลถูกขโมย200 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch)
Exfil ไปที่ jsonplaceholder.typicode.com201 — ข้อมูลถูกขโมย201 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch)
CSD mitigated domains API0 ถูกลดผลกระทบ6 ถูกลดผลกระทบ

Query /detected_domains ทุก 60 วินาที สูงสุด 10 ครั้ง (10 นาที) ดำเนินการไปยังตารางการเปรียบเทียบเมื่อ query คืนค่า หรือหลังจากสูงสุด 10 นาที — การตรวจสอบเหล่านี้เป็นข้อมูลอ้างอิงและไม่ได้บล็อกเฟส 4

ตรวจสอบ Detected Domains หลังการลดผลกระทบ:

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}]}'

ตรวจสอบสคริปต์สำหรับสถานะ Mitigated:

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 mitigated domains ที่เริ่มต้นPASS / FAIL
ก่อน — การโจมตีสำเร็จ (ขั้นตอนที่ 2)สคริปต์โหลด, exfil คืน 200/201PASS / FAIL
การลดผลกระทบถูกใช้ (ขั้นตอนที่ 3)โดเมนทั้ง 6 ได้รับการยอมรับผ่าน POST (200 หรือ 409)PASS / FAIL
ยืนยันจำนวน mitigated (ขั้นตอนที่ 4)6 รายการในรายการPASS / FAIL
หลัง — การโหลดสคริปต์ถูกบล็อก (ขั้นตอนที่ 5)สคริปต์ CDN ไม่ปรากฏในแท็บ network, การเรียก fetch ยังคงเสร็จสิ้นPASS / FAIL
การเปรียบเทียบก่อนและหลัง (ขั้นตอนที่ 6)ความแตกต่างชัดเจนระหว่างหลักฐานขั้นตอนที่ 2 และขั้นตอนที่ 5PASS / FAIL

เฟส 3 เสร็จสมบูรณ์ ดำเนินการไปยัง เฟส 4 — การรื้อถอน เมื่อคุณพร้อมที่จะลบ object การ deploy ทั้งหมด