- الرئيسية
- الدفاع من جهة العميل
- Demo
- المرحلة 3 — التخفيف
المرحلة 3 — التخفيف
تُنشئ المرحلة 3 دليلاً قبل/بعد على تخفيف CSD. تُعيد تشغيل الهجوم بدون أي إجراءات تخفيف لإنشاء خط أساس، ثم تُطبّق إجراءات التخفيف، وتُعيد تشغيل نفس الهجوم للإثبات بأن CSD يحجب استدعاءات الشبكة. يجب أن تكون المرحلة 2 مكتملة — جميع فحوصات DET ناجحة (PASS) — قبل المتابعة.
الخطوة 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، فإن إجراءات التخفيف لا تزال باقية من تشغيل سابق. احذف كل منها قبل المتابعة:
# Delete a mitigated domain (repeat for each domain name)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 — فقد تكون بعض عمليات التشغيل السابقة قد استخدمت هذا كاسم للبيانات الوصفية.
التأكد من وجود اكتشافات المرحلة 2
Section titled “التأكد من وجود اكتشافات المرحلة 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}]}'الدليل
Section titled “الدليل”| الفحص | المتوقع | الحالة |
|---|---|---|
| عدد النطاقات المُخففة | 0 (خط أساس نظيف) | PASS إذا كان 0، يتطلب تنظيفاً إذا كان > 0 |
| عدد النطاقات المكتشفة | > 0 (اكتشافات المرحلة 2 موجودة) | PASS إذا كان > 0 |
| وجود نطاقات التسريب | www.httpbin.org، jsonplaceholder.typicode.com | PASS إذا ظهر واحد على الأقل |
الخطوة 2: تشغيل الهجوم — قبل التخفيف
Section titled “الخطوة 2: تشغيل الهجوم — قبل التخفيف”أعد تشغيل المحاكاة المجمعة مع عدم وجود إجراءات تخفيف نشطة لالتقاط خط أساس جديد. هذه هي لقطة “قبل” — دليل على أن الهجمات تنجح عندما لا يُطبَّق تخفيف CSD.
التنفيذ الآلي بالذكاء الاصطناعي
Section titled “التنفيذ الآلي بالذكاء الاصطناعي”يُشغّل مساعدو الذكاء الاصطناعي الذين يمتلكون أدوات أتمتة المتصفح محاكاة الهجوم برمجياً باستخدام نفس initScript للمرحلة 2 (الذي يحفظ fetch الأصلية):
- التنقل مع initScript — انتقل أولاً إلى
about:blankلضمان سياق مستند نظيف (لتجنب initScripts القديمة من عمليات التنقل السابقة)، ثم استخدمnavigate_pageللانتقال إلىhttp://$F5XC_DOMAINNAME/#/loginمع initScript للمرحلة 2 (الكود الحرفي في المرحلة 2 — التنفيذ الآلي بالذكاء الاصطناعي). يحفظ هذا الـ initScriptsetIntervalوclearIntervalوfetchوconsole.logالأصلية — مرجعfetchالأصلي صحيح هنا لأنه لا توجد إجراءات تخفيف نشطة - إغلاق لافتة الترحيب — استخدم
press_keyمعEscapeلإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (ملفات تعريف الارتباط مُستمرة). يُغلق مربع حوار موافقة ملفات تعريف الارتباط تلقائياً بمفتاح Escape - انتظار الاكتمال — انتظر 10 ثوانٍ لاكتمال جميع استدعاءات ردود CDN لتحميل/خطأ السكريبت وحلّ وعود fetch
- التقاط الدليل — استخدم
list_console_messagesللتحقق من[CSD Demo] Simulation completeونتائج تحميل CDN؛ واستخدمlist_network_requestsمع تصفية حسب أنواعscriptوfetchللتحقق من رموز حالة HTTP (200/201للنجاح)
التنفيذ اليدوي
Section titled “التنفيذ اليدوي”يُشغّل المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح المحاكاة يدوياً باستخدام نفس الإجراء المتبع في المرحلة 2 — الخطوة 8: محاكاة الهجوم:
- انتقل إلى
http://xF5XC_DOMAINNAMEx/#/login - أدخل بيانات اعتماد وهمية في حقلَي البريد الإلكتروني وكلمة المرور (لا تُرسل)
- افتح DevTools — اضغط F12 وانتقل إلى تبويب Console
- الصق وشغّل Combined Detection Script من تشغيل الاكتشاف
- راقب مخرجات الكونسول — يجب أن تُحمَّل جميع سكريبتات 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 إلى نقطة نهاية النطاقات المُخففة. الأهداف الرئيسية من محاكاة المرحلة 2 هي نطاقات حقن CDN الـ 4 وأي نطاقات تسريب بيانات مكتشفة.
أهداف التخفيف الرئيسية (من سكريبت المحاكاة المجمعة):
| النطاق | الدور |
|---|---|
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 — use www.httpbin.org as mitigated_domain (see note below)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)}'الدليل
Section titled “الدليل”| الفحص | المتوقع | الحالة |
|---|---|---|
| عدد النطاقات المُخففة | 6 (يتطابق مع عدد POST) | PASS إذا تطابق العدد |
جميع طلبات POST في الخطوة 3 أعادت 200 أو 409 | كل نطاق مقبول | PASS |
إذا كان العدد أقل من المتوقع، أعد تشغيل أمر POST للنطاق المفقود من الخطوة 3.
الخطوة 5: تشغيل الهجوم — بعد التخفيف
Section titled “الخطوة 5: تشغيل الهجوم — بعد التخفيف”أعد تشغيل نفس المحاكاة المجمعة بالضبط لالتقاط لقطة “ما بعد”. سكريبت المحاكاة متطابق — ما تغيّر فقط هو حالة التخفيف في CSD. تُحجب عمليات تحميل السكريبت من النطاقات المُخففة الآن بواسطة JavaScript الخاص بـ CSD (يُمسح مصدر علامة <script> إلى سلسلة فارغة).
التنفيذ الآلي بالذكاء الاصطناعي
Section titled “التنفيذ الآلي بالذكاء الاصطناعي”يُعيد مساعدو الذكاء الاصطناعي الذين يمتلكون أدوات أتمتة المتصفح تشغيل محاكاة الهجوم برمجياً باستخدام نفس initScript للمرحلة 2 (الكود الحرفي في المرحلة 2 — التنفيذ الآلي بالذكاء الاصطناعي). يحفظ initScript fetch الأصلية لتجنب أخطاء zone.js — وهذا لا يؤثر على تخفيف CSD لأن CSD لا يعترض استدعاءات fetch().
- التنقل مع initScript — استخدم
new_pageمعisolatedContextللحصول على سياق متصفح نظيف (لتجنب initScripts القديمة من الخطوة 2)، ثم انتقل إلىabout:blank، ثم إلى صفحة تسجيل الدخول مع initScript للمرحلة 2 - إغلاق لافتة الترحيب — استخدم
press_keyمعEscape - انتظار الاكتمال — انتظر 10 ثوانٍ لاكتمال جميع الاستدعاءات غير المتزامنة
- التقاط الدليل — استخدم
list_console_messagesللتحقق من[CSD Demo] Simulation complete؛ واستخدمlist_network_requestsمع تصفية حسب أنواعscriptوfetchللملاحظة بأن تحميلات سكريبت CDN غائبة (مسح CSD مصدر السكريبت) بينما تُكمَل استدعاءات fetch إلى نطاقات التسريب بشكل طبيعي
التنفيذ اليدوي
Section titled “التنفيذ اليدوي”يُعيد المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح تشغيل المحاكاة يدوياً باستخدام نفس الإجراء المتبع في المرحلة 2 — الخطوة 8: محاكاة الهجوم:
- انتقل إلى
http://xF5XC_DOMAINNAMEx/#/login - أدخل بيانات اعتماد وهمية في حقلَي البريد الإلكتروني وكلمة المرور (لا تُرسل)
- افتح DevTools — اضغط F12 وانتقل إلى تبويب Console
- الصق وشغّل Combined Detection Script من تشغيل الاكتشاف
- راقب مخرجات الكونسول والشبكة — لا تنشط استدعاءات
onloadوonerrorالخاصة بسكريبت CDN للنطاقات المُخففة (مسح CSD مصدر السكريبتsrcإلى سلسلة فارغة، مما يمنع طلب الشبكة كلياً). تُكمَل استدعاءات fetch إلى نطاقات التسريب (www.httpbin.org, jsonplaceholder.typicode.com) بشكل طبيعي مع ردود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: مقارنة ما قبل وما بعد”هذا هو المحصّلة النهائية للعرض التوضيحي — دليل جنباً إلى جنب يُثبت أن نفس الهجوم، على نفس الصفحة، بنفس السكريبت، يُنتج الآن نتيجةً مختلفةً تماماً.
جدول المقارنة
Section titled “جدول المقارنة”| الإشارة | قبل التخفيف (الخطوة 2) | بعد التخفيف (الخطوة 5) |
|---|---|---|
| تحميلات سكريبت CDN | 200 — تُحمَّل جميع سكريبتات CDN الـ 4 بشكل طبيعي | محجوبة — السكريبتات غائبة من تبويب الشبكة (مسح CSD src إلى سلسلة فارغة) |
استدعاءات onload لـ CDN | تظهر رسائل [Supply Chain] Loaded from | لا تنشط أي استدعاءات رد فعل (لم يُرسَل أي طلب شبكة) |
التسريب إلى www.httpbin.org | 200 — البيانات مسرَّبة | 200 — تُكمَل عملية fetch (لا يعترض CSD fetch) |
| التسريب إلى jsonplaceholder.typicode.com | 201 — البيانات مسرَّبة | 201 — تُكمَل عملية fetch (لا يعترض CSD fetch) |
| API النطاقات المُخففة في CSD | 0 مُخفَّف | 6 مُخففة |
التحقق من التخفيف في بيانات الواجهة الخلفية
Section titled “التحقق من التخفيف في بيانات الواجهة الخلفية”استعلم عن /detected_domains كل 60 ثانية لما يصل إلى 10 تكرارات (10 دقائق). تابع إلى جدول المقارنة بمجرد إعادة الاستعلام، أو بعد الحد الأقصى البالغ 10 دقائق — هذه الفحوصات إعلامية ولا تحجب المرحلة 4.
التحقق من النطاقات المكتشفة بعد التخفيف:
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}]}'ملخص أدلة المرحلة 3
Section titled “ملخص أدلة المرحلة 3”| الفحص | المتوقع | الحالة |
|---|---|---|
| نظافة خط الأساس (الخطوة 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 |
اكتملت المرحلة 3. تابع إلى المرحلة 4 — التفكيك عندما تكون مستعداً لإزالة جميع كائنات النشر.