Nouvelle réglementation de cybersécurité 2026 en vigueur au Maroc. Obtenir un audit de conformité gratuit →
← Retour au blog
OWASP 2025-11-20 ⏱️ 11 min

خداع ذاكرة التخزين المؤقت للويب في 2025: التباس المسارات وقواعد التخزين وحدود Deception Armor

خداع ذاكرة التخزين المؤقت للويب في 2025: التباس المسارات وقواعد التخزين وحدود Deception Armor

خداع ذاكرة التخزين المؤقت للويب (WCD) هجوم أنيق. لا يحتاج المهاجم إلى سرقة ملف تعريف جلسة أو كسر كلمة مرور أو استغلال فساد ذاكرة. يكفيه أن يجعل ذاكرة مشتركة تخزّن استجابة خاصة مصادَقًا عليها تحت عنوان يمكنه طلبه لاحقًا دون مصادقة. يزور الضحية رابطًا مُعدًّا، فتحفظ الذاكرة الصفحة، ثم يقرأها المهاجم. شاع هذا الأسلوب بفضل Omer Gil عام 2017 ودُرس على نطاق واسع في ورقة USENIX Security 2020 «Cached and Confused». ويبقى وثيق الصلة لأن الخلاف الجوهري — ما يعتبره الأصل صفحة ديناميكية وما تعتبره الذاكرة ملفًا ثابتًا — لم يُحل بالكامل.


1. الآلية الأساسية

افترض تطبيقًا يقدّم صفحة حساب خاصة على:

GET /account HTTP/1.1
Host: example.com
Cookie: session=victim-session

يعيد الأصل HTML يحتوي بريد الضحية أو رصيده أو مفتاح API، مع Cache-Control: private. والذاكرة الصحيحة لا تخزّنه. والآن فكّر في طلب بجزء مسار إضافي وامتداد يبدو ثابتًا:

GET /account/avatar.css HTTP/1.1
Host: example.com
Cookie: session=victim-session

توجّه أطر كثيرة هذا إلى وحدة التحكم نفسها لأن الموجّه يتجاهل الأجزاء الأخيرة أو يعاملها كمعاملات. ويظل الأصل يعيد HTML الخاص. لكن الذاكرة ترى مسار .css فتطبّق قاعدة أصول ثابتة: تخزين عام، غالبًا لساعات. ثم يطلب المهاجم /account/avatar.css دون ملف تعريف ويحصل على صفحة الضحية.

الثغرة ليست في الذاكرة وحدها ولا في التطبيق وحده، بل في التباين بين قواعد التقنين والتوجيه لديهما.


2. متغيرات ما زالت تعمل

2.1 التباس الامتداد

إضافة .css أو .js أو .png أو .ico أو .woff2 إلى مسار ديناميكي هي الصورة الكلاسيكية. وتعمل عندما يتجاهل الأصل اللاحقة بينما تطابقها قاعدة ذاكرة CDN.

2.2 فروق تقنين المسار

تقنّن الذاكرات والأصول .. و. والشرطات المزدوجة والفواصل المنقوطة والشرطات المشفرة (%2f) والشرطات العكسية بطرق مختلفة. طلب مثل /account/..%2fstatic/app.css قد يوجّهه الأصل إلى /account بينما تعامله الذاكرة كملف ثابت. وقد أظهر بحث James Kettle عام 2024 حول التباس المسارات بقاء هذه الفروق في CDN كبرى.

2.3 حيل الفواصل والمعاملات

تعامل بعض الأصول ; أو ? أو # كفواصل توجيه، بينما لا تفعل الذاكرات ذلك. عنوان مثل /account;.css قد يفسّره التطبيق كـ/account والذاكرة كملف CSS. وبالمثل قد تتجاهل الذاكرة سلسلة الاستعلام في مفتاحها بينما يستخدمها الأصل لاختيار المحتوى.

2.4 التباس الترويسة والطريقة

إذا فهرست الذاكرة حسب الطريقة بينما يعامل الأصل HEAD كـGET، فقد يملأ طلب HEAD مدخلًا يُقدَّم لاحقًا لـGET. كما تخلق معالجة Vary فجوات: إذا لم تُدرج الذاكرة Cookie في المفتاح (وهو طبيعي للمحتوى العام)، فتُقدَّم استجابة مصادَق عليها مخزّنة وفق قاعدة ثابتة للجميع.


3. لماذا لا يكفي «Cache Deception Armor»

يقارن Cache Deception Armor (CDA) من Cloudflare نوع محتوى الاستجابة Content-Type بامتداد الطلب. فإذا انتهى الطلب بـ.css وأعاد الأصل text/html، يرفض CDA التخزين. هذا ضابط مفيد لكنه استكشافي:

  • يعتمد على ترويسات أصل صحيحة. إذا حذف الأصل Content-Type أو أخطأ في تسميته، يفشل المقارنة بشكل غير متوقع.
  • لا يغطي كل الامتدادات. قد لا تُخطَّط القواعد الثابتة المخصصة وأنواع MIME النادرة.
  • قد يهزم التباس المسار فحص الامتداد. إذا قنّنت الذاكرة المسار بشكل مختلف عن الأصل، فقد لا يكون الامتداد الذي يراه CDA هو امتداد التوجيه.
  • لا يصلح الأصل. تظل الاستجابة الخاصة تُولَّد وتُعاد بدلالة قابلة للتخزين؛ وقد تخزّنها طبقة أخرى أو وكيل مُعدّ خطأً.

يقلّل CDA سطح الهجوم، لكنه لا يغني عن ترويسات Cache-Control الصحيحة والتوجيه الصارم.


4. منهجية الاختبار

اختبر فقط أنظمة مصرّحًا لك بها. استخدم حسابين: ضحية ومهاجم. الهدف إثبات أن المهاجم يسترجع بيانات الضحية الخاصة عبر الذاكرة.

  1. حدّد الصفحات الخاصة. إعدادات الحساب ولوحات المعلومات والفواتير ومفاتيح API ولوحات الإدارة.
  2. أنشئ خط أساس. اطلب الصفحة كضحية وسجّل الترويسات: Cache-Control وVary وAge وX-Cache وCF-Cache-Status وAkamai-Cache-Status.
  3. أضف لواحق ثابتة. جرّب /account.css و/account.js و/account.png و/account/foo.css و/account%2ffoo.css.
  4. افحص حالة الذاكرة. استجابة تتحول من BYPASS إلى HIT أو MISS مع ترويسة تخزين عام مبشّرة.
  5. اطلب دون مصادقة. من جلسة نظيفة اطلب العنوان نفسه. إذا ظهرت بيانات الضحية فقد خزّنت الذاكرة استجابة خاصة.
  6. أكّد بإجراء ثانٍ. غيّر قيمة في حساب الضحية وكرّر لإظهار أن الصفحة المخزّنة تسرّب القيمة الجديدة.
# خط الأساس كضحية
curl -s -D - -o /dev/null -b 'session=VICTIM' https://example.com/account

# فحص بلاحقة ثابتة
curl -s -D - -o /dev/null -b 'session=VICTIM' https://example.com/account/x.css

# استرجاع المهاجم دون ملفات تعريف
curl -s -D - https://example.com/account/x.css | head -40

5. تصميم دفاعي

  • وسم الاستجابات المصادَق عليها صراحةً. أرسل Cache-Control: private, no-store على كل استجابة تحتوي بيانات مستخدم. لا تعتمد على غياب ترويسة عامة.
  • لا تدع القواعد الثابتة تتجاوز دلالة الأصل. اضبط CDN لتخزين مسارات ثابتة معروفة فقط، لا «كل ما ينتهي بـ.css». فضّل القوائم الصريحة.
  • قنّن باتساق. اضمن اتفاق الحافة والأصل على فك ترميز المسار ومعالجة الشرطات وإزالة مقاطع النقاط وتحليل الفواصل. وارفض المسارات الملتبسة عند الحافة.
  • افصل الأصول الثابتة عن الديناميكية. تقديم محتوى المستخدم من app.example.com والأصول من static.example.com يزيل معظم الالتباس. ويجب حصر ملفات تعريف الارتباط بمضيف التطبيق.
  • أدرج الأبعاد الصحيحة في مفتاح الذاكرة. إذا اختلفت الاستجابة حسب ملف تعريف أو ترويسة Authorization أو المستأجر، فأدرجها في المفتاح أو لا تخزّن.
  • اختبر بعد كل تغيير في قواعد CDN. سلوك الذاكرة إعداد، والإعداد ينحرف. أضف فحوص WCD إلى مجموعة الاختبارات الارتدادية.

6. الخاتمة

يستغل خداع ذاكرة التخزين التباسًا لا تشفيرًا مكسورًا. يطلب المهاجم شيئًا من الأصل وشيئًا آخر من الذاكرة، وتصبح الفجوة بين الإجابتين تسريبًا للبيانات. ترفع فحوص الامتداد وdeception armor الكلفة، لكن الإصلاح الدائم هو جعل دلالة خصوصية الأصل صريحة وضمان ألا تخزّن الحافة استجابة لا تفهمها بالكامل. إذا احتاجت صفحة إلى جلسة، فيجب أن تقول استجابتها ذلك في Cache-Control — ويجب ضبط CDN ليصدّقها.

Besoin d'un audit de sécurité ?

Contactez Cayvora pour une consultation gratuite et protégez votre entreprise contre les cybermenaces.

✉️ Contact via Email

Articles connexes