- หน้าแรก
- การป้องกันฝั่งไคลเอนต์
- Demo
- เฟส 3 — ลดผลกระทบ
เฟส 3 — ลดผลกระทบ
เฟส 3 สร้าง หลักฐานก่อน/หลัง ของการลดผลกระทบ CSD คุณรันการโจมตีอีกครั้งโดยไม่มีการลดผลกระทบเพื่อสร้างเส้นฐาน จากนั้นใช้การลดผลกระทบ แล้วรันการโจมตีเดิมอีกครั้งเพื่อพิสูจน์ว่า CSD บล็อกการเรียก network ได้ เฟส 2 ต้องเสร็จสิ้นก่อน — การตรวจสอบ DET ทั้งหมดต้องผ่าน (PASS) — จึงจะดำเนินการต่อได้
ขั้นตอนที่ 1: ยืนยันว่าไม่มีการลดผลกระทบที่ใช้งานอยู่ (เส้นฐาน)
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 1: ยืนยันว่าไม่มีการลดผลกระทบที่ใช้งานอยู่ (เส้นฐาน)”ก่อนบันทึกภาพ “ก่อน” ให้ตรวจสอบว่าสภาพแวดล้อมสะอาด — ไม่ควรมีการลดผลกระทบที่ใช้งานอยู่ เพื่อให้มั่นใจว่าการโจมตีเส้นฐานรันโดยไม่มีการบล็อกของ CSD
ตรวจสอบจำนวนโดเมนที่ถูกลดผลกระทบ
หัวข้อที่มีชื่อว่า “ตรวจสอบจำนวนโดเมนที่ถูกลดผลกระทบ”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 ยังเหลือรายการค้างอยู่ ให้ลอง delete www.httpbin.org ด้วย — การรันก่อนหน้าบางครั้งอาจใช้ชื่อนั้นเป็น metadata name
ยืนยันว่าการตรวจจับจากเฟส 2 มีอยู่
หัวข้อที่มีชื่อว่า “ยืนยันว่าการตรวจจับจากเฟส 2 มีอยู่”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 |
| มีโดเมน Exfil | www.httpbin.org, jsonplaceholder.typicode.com | PASS ถ้าปรากฏอย่างน้อยหนึ่งรายการ |
ขั้นตอนที่ 2: รันการโจมตี — ก่อนการลดผลกระทบ
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 2: รันการโจมตี — ก่อนการลดผลกระทบ”รันการจำลองรวมอีกครั้งโดยไม่มีการลดผลกระทบที่ใช้งานอยู่ เพื่อบันทึกเส้นฐานใหม่ นี่คือภาพ “ก่อน” — หลักฐานที่พิสูจน์ว่าการโจมตีประสบความสำเร็จเมื่อไม่ได้ใช้การลดผลกระทบ CSD
การรันอัตโนมัติด้วย AI
หัวข้อที่มีชื่อว่า “การรันอัตโนมัติด้วย AI”ผู้ช่วย AI ที่มีเครื่องมือ browser automation รันการจำลองการโจมตีด้วยโปรแกรมโดยใช้ initScript เดียวกับเฟส 2 (ซึ่งบันทึก native fetch):
- นำทางด้วย initScript — นำทางไปที่
about:blankก่อนเพื่อให้มั่นใจว่า document context สะอาด (หลีกเลี่ยง initScript เก่าจากการนำทางก่อนหน้า) จากนั้นnavigate_pageไปที่http://$F5XC_DOMAINNAME/#/loginด้วย initScript ของเฟส 2 (โค้ดที่เหมือนกันทุกประการใน เฟส 2 — การรันอัตโนมัติด้วย AI) initScript นี้บันทึก nativesetInterval,clearInterval,fetchและconsole.log— การอ้างอิง nativefetchถูกต้องที่นี่เพราะยังไม่มีการลดผลกระทบที่ใช้งานอยู่ - ปิด Welcome Banner —
press_keyด้วยEscapeเพื่อปิด Welcome Banner ในการเยี่ยมชมครั้งต่อๆ ไป banner อาจไม่ปรากฏ (cookies ถูกเก็บไว้) dialog ขอความยินยอม cookie จะถูกปิดโดยอัตโนมัติด้วยปุ่ม Escape - รอจนเสร็จ — รอ 10 วินาทีให้ callback การโหลด/error ของสคริปต์ CDN และการ resolve promise ของ fetch เสร็จสิ้นทั้งหมด
- บันทึกหลักฐาน —
list_console_messagesเพื่อตรวจสอบ[CSD Demo] Simulation completeและผลลัพธ์การโหลด CDN;list_network_requestsกรองตามประเภทscriptและfetchเพื่อตรวจสอบ HTTP status codes (200/201สำหรับความสำเร็จ)
การรันแบบ Manual
หัวข้อที่มีชื่อว่า “การรันแบบ Manual”ผู้ปฏิบัติงานที่ไม่มีเครื่องมือ browser automation รันการจำลองแบบ manual โดยใช้ขั้นตอนเดียวกับ เฟส 2 — ขั้นตอนที่ 8: การจำลองการโจมตี:
- นำทางไปที่
http://xF5XC_DOMAINNAMEx/#/login - กรอก credentials จำลองในช่อง Email และ Password (อย่ากด submit)
- เปิด DevTools — กด F12 และสลับไปที่แท็บ Console
- วางและรัน Combined Detection Script จาก การตรวจจับทริกเกอร์
- สังเกต console output — สคริปต์ CDN ทั้งหมดควรโหลดได้และการเรียก exfil ควรสำเร็จด้วยการตอบสนอง
200/201
หลักฐาน — ก่อนการลดผลกระทบ
หัวข้อที่มีชื่อว่า “หลักฐาน — ก่อนการลดผลกระทบ”| การตรวจสอบ | ที่คาดหวัง (ก่อนการลดผลกระทบ) | สถานะ |
|---|---|---|
| สคริปต์ CDN ถูก inject | แท็กสคริปต์ทั้ง 4 โหลด — ข้อความ [Supply Chain] Loaded from ปรากฏ, แท็บ network แสดง 200 | PASS |
Exfil fetch ไปที่ www.httpbin.org | แท็บ network แสดง 200 — ส่งข้อมูลแล้ว | PASS |
| Exfil fetch ไปที่ jsonplaceholder.typicode.com | แท็บ network แสดง 201 — ส่งข้อมูลแล้ว | PASS |
| Console output | [CSD Demo] Simulation complete | PASS |
ขั้นตอนที่ 3: ใช้การลดผลกระทบ
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 3: ใช้การลดผลกระทบ”สำหรับแต่ละโดเมนที่ตรวจพบ ให้ POST ไปที่ mitigated domains endpoint เป้าหมายหลักจากการจำลองในเฟส 2 คือโดเมน CDN injection 4 โดเมนและโดเมน data exfiltration ที่ตรวจพบ
เป้าหมายการลดผลกระทบหลัก (จากสคริปต์การจำลองรวม):
| โดเมน | บทบาท |
|---|---|
cdn.jsdelivr.net | CDN script injection |
esm.sh | CDN script injection |
unpkg.com | CDN script injection |
ga.jspm.io | CDN script injection |
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 จะคืน object ของ mitigated domain ที่สร้างขึ้น การตอบสนอง 409 หมายความว่าโดเมนอยู่ในรายการ mitigated แล้ว — นี่คือเงื่อนไขความสำเร็จ
ขั้นตอนที่ 4: ตรวจสอบว่าการลดผลกระทบถูกใช้แล้ว
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 4: ตรวจสอบว่าการลดผลกระทบถูกใช้แล้ว”แสดงรายการ mitigated domains ทั้งหมดและยืนยันว่าจำนวนตรงกับจำนวนโดเมนที่เพิ่งส่ง:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'หลักฐาน
หัวข้อที่มีชื่อว่า “หลักฐาน”| การตรวจสอบ | ที่คาดหวัง | สถานะ |
|---|---|---|
| จำนวน mitigated domains | 6 (ตรงกับจำนวน POST) | PASS ถ้าจำนวนตรงกัน |
POST ทั้งหมดในขั้นตอนที่ 3 คืน 200 หรือ 409 | แต่ละโดเมนได้รับการยอมรับ | PASS |
หากจำนวนน้อยกว่าที่คาดไว้ ให้รันคำสั่ง POST สำหรับโดเมนที่หายไปจากขั้นตอนที่ 3 อีกครั้ง
ขั้นตอนที่ 5: รันการโจมตี — หลังการลดผลกระทบ
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 5: รันการโจมตี — หลังการลดผลกระทบ”รันการจำลองรวมเดิมทุกประการอีกครั้งเพื่อบันทึกภาพ “หลัง” สคริปต์การจำลองเหมือนกันทุกประการ — มีเพียงสถานะการลดผลกระทบของ CSD เท่านั้นที่เปลี่ยนแปลง การโหลดสคริปต์จากโดเมนที่ถูกลดผลกระทบจะถูกบล็อกโดย JavaScript ของ CSD (แอตทริบิวต์ src ของแท็ก <script> จะถูกล้างเป็นสตริงว่าง)
การรันอัตโนมัติด้วย AI
หัวข้อที่มีชื่อว่า “การรันอัตโนมัติด้วย AI”ผู้ช่วย AI ที่มีเครื่องมือ browser automation รันการจำลองการโจมตีอีกครั้งด้วยโปรแกรมโดยใช้ initScript ของเฟส 2 เดิมทุกประการ (โค้ดที่เหมือนกันทุกประการใน เฟส 2 — การรันอัตโนมัติด้วย AI) initScript บันทึก native fetch เพื่อหลีกเลี่ยงข้อผิดพลาด zone.js — ไม่ส่งผลต่อการลดผลกระทบ CSD เพราะ CSD ไม่สกัดกั้นการเรียก fetch()
- นำทางด้วย initScript — ใช้
new_pageด้วยisolatedContextสำหรับ browser context ที่สะอาด (หลีกเลี่ยง initScript เก่าจากขั้นตอนที่ 2) จากนั้นนำทางไปที่about:blankแล้วไปที่หน้า login ด้วย initScript ของเฟส 2 - ปิด Welcome Banner —
press_keyด้วยEscape - รอจนเสร็จ — รอ 10 วินาทีสำหรับ async callback ทั้งหมด
- บันทึกหลักฐาน —
list_console_messagesเพื่อตรวจสอบ[CSD Demo] Simulation complete;list_network_requestsกรองตามประเภทscriptและfetchเพื่อสังเกตว่าการโหลดสคริปต์ CDN ไม่ปรากฏ (CSD ล้าง script src แล้ว) ในขณะที่การเรียก fetch ไปยังโดเมน exfil ยังคงเสร็จสิ้นตามปกติ
การรันแบบ Manual
หัวข้อที่มีชื่อว่า “การรันแบบ Manual”ผู้ปฏิบัติงานที่ไม่มีเครื่องมือ browser automation รันการจำลองแบบ manual อีกครั้งโดยใช้ขั้นตอนเดียวกับ เฟส 2 — ขั้นตอนที่ 8: การจำลองการโจมตี:
- นำทางไปที่
http://xF5XC_DOMAINNAMEx/#/login - กรอก credentials จำลองในช่อง Email และ Password (อย่ากด submit)
- เปิด DevTools — กด F12 และสลับไปที่แท็บ Console
- วางและรัน Combined Detection Script จาก การตรวจจับทริกเกอร์
- สังเกต 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.org | 200 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch) | INFO |
| Exfil fetch ไปที่ jsonplaceholder.typicode.com | 201 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch) | INFO |
| Console output | [CSD Demo] Simulation complete | PASS |
ขั้นตอนที่ 6: การเปรียบเทียบก่อนและหลัง
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 6: การเปรียบเทียบก่อนและหลัง”นี่คือผลตอบแทนของการสาธิต — หลักฐานเคียงข้างกันที่พิสูจน์ว่าการโจมตีเดิม บนหน้าเดิม ด้วยสคริปต์เดิม ตอนนี้ให้ผลลัพธ์ที่แตกต่างกันอย่างสิ้นเชิง
ตารางการเปรียบเทียบ
หัวข้อที่มีชื่อว่า “ตารางการเปรียบเทียบ”| สัญญาณ | ก่อนการลดผลกระทบ (ขั้นตอนที่ 2) | หลังการลดผลกระทบ (ขั้นตอนที่ 5) |
|---|---|---|
| การโหลดสคริปต์ CDN | 200 — สคริปต์ CDN ทั้ง 4 โหลดได้ตามปกติ | ถูกบล็อก — สคริปต์ไม่ปรากฏในแท็บ network (CSD ล้าง src เป็นสตริงว่าง) |
Callback onload ของ CDN | ข้อความ [Supply Chain] Loaded from ปรากฏ | ไม่มี callback ทำงาน (ไม่มี network request เกิดขึ้น) |
Exfil ไปที่ www.httpbin.org | 200 — ข้อมูลถูกขโมย | 200 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch) |
| Exfil ไปที่ jsonplaceholder.typicode.com | 201 — ข้อมูลถูกขโมย | 201 — fetch ยังคงเสร็จสิ้น (CSD ไม่สกัดกั้น fetch) |
| CSD mitigated domains API | 0 ถูกลดผลกระทบ | 6 ถูกลดผลกระทบ |
ตรวจสอบการลดผลกระทบในข้อมูล Backend
หัวข้อที่มีชื่อว่า “ตรวจสอบการลดผลกระทบในข้อมูล Backend”Query /detected_domains ทุก 60 วินาที สูงสุด 10 ครั้ง (10 นาที) ดำเนินการไปยังตารางการเปรียบเทียบเมื่อ query คืนค่า หรือหลังจากสูงสุด 10 นาที — การตรวจสอบเหล่านี้เป็นข้อมูลอ้างอิงและไม่ได้บล็อกเฟส 4
ตรวจสอบ Detected Domains หลังการลดผลกระทบ:
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:
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}]}'สรุปหลักฐานเฟส 3
หัวข้อที่มีชื่อว่า “สรุปหลักฐานเฟส 3”| การตรวจสอบ | ที่คาดหวัง | สถานะ |
|---|---|---|
| เส้นฐานสะอาด (ขั้นตอนที่ 1) | 0 mitigated domains ที่เริ่มต้น | PASS / FAIL |
| ก่อน — การโจมตีสำเร็จ (ขั้นตอนที่ 2) | สคริปต์โหลด, exfil คืน 200/201 | PASS / FAIL |
| การลดผลกระทบถูกใช้ (ขั้นตอนที่ 3) | โดเมนทั้ง 6 ได้รับการยอมรับผ่าน POST (200 หรือ 409) | PASS / FAIL |
| ยืนยันจำนวน mitigated (ขั้นตอนที่ 4) | 6 รายการในรายการ | PASS / FAIL |
| หลัง — การโหลดสคริปต์ถูกบล็อก (ขั้นตอนที่ 5) | สคริปต์ CDN ไม่ปรากฏในแท็บ network, การเรียก fetch ยังคงเสร็จสิ้น | PASS / FAIL |
| การเปรียบเทียบก่อนและหลัง (ขั้นตอนที่ 6) | ความแตกต่างชัดเจนระหว่างหลักฐานขั้นตอนที่ 2 และขั้นตอนที่ 5 | PASS / FAIL |
เฟส 3 เสร็จสมบูรณ์ ดำเนินการไปยัง เฟส 4 — การรื้อถอน เมื่อคุณพร้อมที่จะลบ object การ deploy ทั้งหมด