تخطَّ إلى المحتوى

المرحلة 3 — التخفيف

تُنشئ المرحلة 3 دليلاً قبل/بعد على تخفيف CSD. تُعيد تشغيل الهجوم بدون أي إجراءات تخفيف لإنشاء خط أساس، ثم تُطبّق إجراءات التخفيف، وتُعيد تشغيل نفس الهجوم للإثبات بأن CSD يحجب استدعاءات الشبكة. يجب أن تكون المرحلة 2 مكتملة — جميع فحوصات DET ناجحة (PASS) — قبل المتابعة.

الخطوة 1: التأكد من عدم وجود إجراءات تخفيف نشطة (خط الأساس)

Section titled “الخطوة 1: التأكد من عدم وجود إجراءات تخفيف نشطة (خط الأساس)”

قبل التقاط لقطة “قبل”، تحقق من نظافة البيئة — لا ينبغي أن تكون هناك أي إجراءات تخفيف نشطة. يضمن ذلك تشغيل هجوم خط الأساس دون أي حجب من CSD.

التحقق من عدد النطاقات المُخففة

Section titled “التحقق من عدد النطاقات المُخففة”
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
# 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”
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
وجود نطاقات التسريبwww.httpbin.org، jsonplaceholder.typicode.comPASS إذا ظهر واحد على الأقل

الخطوة 2: تشغيل الهجوم — قبل التخفيف

Section titled “الخطوة 2: تشغيل الهجوم — قبل التخفيف”

أعد تشغيل المحاكاة المجمعة مع عدم وجود إجراءات تخفيف نشطة لالتقاط خط أساس جديد. هذه هي لقطة “قبل” — دليل على أن الهجمات تنجح عندما لا يُطبَّق تخفيف CSD.

التنفيذ الآلي بالذكاء الاصطناعي

Section titled “التنفيذ الآلي بالذكاء الاصطناعي”

يُشغّل مساعدو الذكاء الاصطناعي الذين يمتلكون أدوات أتمتة المتصفح محاكاة الهجوم برمجياً باستخدام نفس initScript للمرحلة 2 (الذي يحفظ fetch الأصلية):

  1. التنقل مع initScript — انتقل أولاً إلى about:blank لضمان سياق مستند نظيف (لتجنب initScripts القديمة من عمليات التنقل السابقة)، ثم استخدم navigate_page للانتقال إلى http://$F5XC_DOMAINNAME/#/login مع initScript للمرحلة 2 (الكود الحرفي في المرحلة 2 — التنفيذ الآلي بالذكاء الاصطناعي). يحفظ هذا الـ initScript setInterval وclearInterval وfetch وconsole.log الأصلية — مرجع fetch الأصلي صحيح هنا لأنه لا توجد إجراءات تخفيف نشطة
  2. إغلاق لافتة الترحيب — استخدم press_key مع Escape لإغلاق لافتة الترحيب. في الزيارات اللاحقة قد لا تظهر اللافتة (ملفات تعريف الارتباط مُستمرة). يُغلق مربع حوار موافقة ملفات تعريف الارتباط تلقائياً بمفتاح Escape
  3. انتظار الاكتمال — انتظر 10 ثوانٍ لاكتمال جميع استدعاءات ردود CDN لتحميل/خطأ السكريبت وحلّ وعود fetch
  4. التقاط الدليل — استخدم list_console_messages للتحقق من [CSD Demo] Simulation complete ونتائج تحميل CDN؛ واستخدم list_network_requests مع تصفية حسب أنواع script وfetch للتحقق من رموز حالة HTTP (200/201 للنجاح)

يُشغّل المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح المحاكاة يدوياً باستخدام نفس الإجراء المتبع في المرحلة 2 — الخطوة 8: محاكاة الهجوم:

  1. انتقل إلى http://xF5XC_DOMAINNAMEx/#/login
  2. أدخل بيانات اعتماد وهمية في حقلَي البريد الإلكتروني وكلمة المرور (لا تُرسل)
  3. افتح DevTools — اضغط F12 وانتقل إلى تبويب Console
  4. الصق وشغّل Combined Detection Script من تشغيل الاكتشاف
  5. راقب مخرجات الكونسول — يجب أن تُحمَّل جميع سكريبتات CDN وأن تنجح استدعاءات التسريب بردود 200/201
الفحصالمتوقع (قبل التخفيف)الحالة
سكريبتات CDN المُحقونةتُحمَّل جميع علامات السكريبت الـ 4 — تظهر رسائل [Supply Chain] Loaded from، يُظهر تبويب الشبكة 200PASS
طلب fetch للتسريب إلى www.httpbin.orgيُظهر تبويب الشبكة 200 — البيانات أُرسلتPASS
طلب fetch للتسريب إلى jsonplaceholder.typicode.comيُظهر تبويب الشبكة 201 — البيانات أُرسلتPASS
مخرجات الكونسول[CSD Demo] Simulation completePASS

الخطوة 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نقطة نهاية تسريب البيانات

تخفيف نطاق (شغّل مرة واحدة لكل نطاق):

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 — 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.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 تُعيد كائن النطاق المُخفَّف المُنشأ. استجابة 409 تعني أن النطاق موجود بالفعل في قائمة النطاقات المُخففة — وهذا يُعدّ حالة نجاح.

الخطوة 4: التحقق من تطبيق إجراءات التخفيف

Section titled “الخطوة 4: التحقق من تطبيق إجراءات التخفيف”

أدرج جميع النطاقات المُخففة وتأكد من أن العدد يتطابق مع عدد النطاقات المُقدَّمة للتو:

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)}'
الفحصالمتوقعالحالة
عدد النطاقات المُخففة6 (يتطابق مع عدد POST)PASS إذا تطابق العدد
جميع طلبات POST في الخطوة 3 أعادت 200 أو 409كل نطاق مقبولPASS

إذا كان العدد أقل من المتوقع، أعد تشغيل أمر POST للنطاق المفقود من الخطوة 3.

الخطوة 5: تشغيل الهجوم — بعد التخفيف

Section titled “الخطوة 5: تشغيل الهجوم — بعد التخفيف”

أعد تشغيل نفس المحاكاة المجمعة بالضبط لالتقاط لقطة “ما بعد”. سكريبت المحاكاة متطابق — ما تغيّر فقط هو حالة التخفيف في CSD. تُحجب عمليات تحميل السكريبت من النطاقات المُخففة الآن بواسطة JavaScript الخاص بـ CSD (يُمسح مصدر علامة &lt;script&gt; إلى سلسلة فارغة).

التنفيذ الآلي بالذكاء الاصطناعي

Section titled “التنفيذ الآلي بالذكاء الاصطناعي”

يُعيد مساعدو الذكاء الاصطناعي الذين يمتلكون أدوات أتمتة المتصفح تشغيل محاكاة الهجوم برمجياً باستخدام نفس initScript للمرحلة 2 (الكود الحرفي في المرحلة 2 — التنفيذ الآلي بالذكاء الاصطناعي). يحفظ initScript fetch الأصلية لتجنب أخطاء zone.js — وهذا لا يؤثر على تخفيف CSD لأن CSD لا يعترض استدعاءات fetch().

  1. التنقل مع initScript — استخدم new_page مع isolatedContext للحصول على سياق متصفح نظيف (لتجنب initScripts القديمة من الخطوة 2)، ثم انتقل إلى about:blank، ثم إلى صفحة تسجيل الدخول مع initScript للمرحلة 2
  2. إغلاق لافتة الترحيب — استخدم press_key مع Escape
  3. انتظار الاكتمال — انتظر 10 ثوانٍ لاكتمال جميع الاستدعاءات غير المتزامنة
  4. التقاط الدليل — استخدم list_console_messages للتحقق من [CSD Demo] Simulation complete؛ واستخدم list_network_requests مع تصفية حسب أنواع script وfetch للملاحظة بأن تحميلات سكريبت CDN غائبة (مسح CSD مصدر السكريبت) بينما تُكمَل استدعاءات fetch إلى نطاقات التسريب بشكل طبيعي

يُعيد المشغّلون الذين لا يمتلكون أدوات أتمتة المتصفح تشغيل المحاكاة يدوياً باستخدام نفس الإجراء المتبع في المرحلة 2 — الخطوة 8: محاكاة الهجوم:

  1. انتقل إلى http://xF5XC_DOMAINNAMEx/#/login
  2. أدخل بيانات اعتماد وهمية في حقلَي البريد الإلكتروني وكلمة المرور (لا تُرسل)
  3. افتح DevTools — اضغط F12 وانتقل إلى تبويب Console
  4. الصق وشغّل Combined Detection Script من تشغيل الاكتشاف
  5. راقب مخرجات الكونسول والشبكة — لا تنشط استدعاءات onload وonerror الخاصة بسكريبت CDN للنطاقات المُخففة (مسح CSD مصدر السكريبت src إلى سلسلة فارغة، مما يمنع طلب الشبكة كلياً). تُكمَل استدعاءات fetch إلى نطاقات التسريب (www.httpbin.org, jsonplaceholder.typicode.com) بشكل طبيعي مع ردود 200/201 — إذ يحجب تخفيف CSD تحميل السكريبت، وليس استدعاءات fetch/XHR
الفحصالمتوقع (بعد التخفيف)الحالة
تحميلات سكريبت CDNمحجوبة — لا تظهر السكريبتات في تبويب الشبكة (مسح CSD src إلى سلسلة فارغة)PASS
استدعاءات رد فعل سكريبت CDNلا ينشط onload ولا onerror للنطاقات المُخففةPASS
طلب fetch للتسريب إلى www.httpbin.org200 — تُكمَل عملية fetch (لا يعترض CSD fetch)INFO
طلب fetch للتسريب إلى jsonplaceholder.typicode.com201 — تُكمَل عملية fetch (لا يعترض CSD fetch)INFO
مخرجات الكونسول[CSD Demo] Simulation completePASS

الخطوة 6: مقارنة ما قبل وما بعد

Section titled “الخطوة 6: مقارنة ما قبل وما بعد”

هذا هو المحصّلة النهائية للعرض التوضيحي — دليل جنباً إلى جنب يُثبت أن نفس الهجوم، على نفس الصفحة، بنفس السكريبت، يُنتج الآن نتيجةً مختلفةً تماماً.

الإشارةقبل التخفيف (الخطوة 2)بعد التخفيف (الخطوة 5)
تحميلات سكريبت CDN200 — تُحمَّل جميع سكريبتات CDN الـ 4 بشكل طبيعيمحجوبة — السكريبتات غائبة من تبويب الشبكة (مسح CSD src إلى سلسلة فارغة)
استدعاءات onload لـ CDNتظهر رسائل [Supply Chain] Loaded fromلا تنشط أي استدعاءات رد فعل (لم يُرسَل أي طلب شبكة)
التسريب إلى www.httpbin.org200 — البيانات مسرَّبة200 — تُكمَل عملية fetch (لا يعترض CSD fetch)
التسريب إلى jsonplaceholder.typicode.com201 — البيانات مسرَّبة201 — تُكمَل عملية fetch (لا يعترض CSD fetch)
API النطاقات المُخففة في CSD0 مُخفَّف6 مُخففة

التحقق من التخفيف في بيانات الواجهة الخلفية

Section titled “التحقق من التخفيف في بيانات الواجهة الخلفية”

استعلم عن /detected_domains كل 60 ثانية لما يصل إلى 10 تكرارات (10 دقائق). تابع إلى جدول المقارنة بمجرد إعادة الاستعلام، أو بعد الحد الأقصى البالغ 10 دقائق — هذه الفحوصات إعلامية ولا تحجب المرحلة 4.

التحقق من النطاقات المكتشفة بعد التخفيف:

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

التحقق من السكريبتات لحالة التخفيف:

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 نطاقات مُخففة عند البدءPASS / FAIL
قبل — نجاح الهجوم (الخطوة 2)تُحمَّل السكريبتات، يُعيد التسريب 200/201PASS / FAIL
تطبيق إجراءات التخفيف (الخطوة 3)جميع النطاقات الـ 6 مقبولة عبر POST (200 أو 409)PASS / FAIL
تأكيد العدد المُخفَّف (الخطوة 4)6 عناصر في القائمةPASS / FAIL
بعد — حجب تحميلات السكريبت (الخطوة 5)سكريبتات CDN غائبة من تبويب الشبكة، تُكمَل استدعاءات fetchPASS / FAIL
مقارنة ما قبل وما بعد (الخطوة 6)فارق واضح بين أدلة الخطوة 2 والخطوة 5PASS / FAIL

اكتملت المرحلة 3. تابع إلى المرحلة 4 — التفكيك عندما تكون مستعداً لإزالة جميع كائنات النشر.