
استغلال رفض الخدمة الوظيفي لثغرة CVE-2021-32675 في Redis، يعتمد على رؤوس سلاسل ضخمة الحجم لتحفيز استنزاف الذاكرة. يتضمن تعليمات الاستخدام وبيئة اختبار قائمة على Docker.
يحتوي هذا المستودع على استغلال وظيفي لثغرة CVE-2021-32675، وهي ثغرة حجب خدمة (DoS) في Redis. يسمح العيب للمهاجمين عن بُعد غير المصادق عليهم بتفعيل عمليات تخصيص مسبق ضخمة للذاكرة على خادم Redis عن طريق إرسال رؤوس سلاسل كبيرة الحجم دون توفير بيانات الوسائط، مما يؤدي إلى استنزاف الذاكرة وتعطل الخدمة.
CVE-2021-32675 هي ثغرة في معالجة مخزن الاستعلامات المؤقت في Redis. عند تحليل الأوامر الواردة في بروتوكول RESP (بروتوكول تسلسل Redis)، يقرأ Redis الطول المُعلن لوسيطة سلسلة كبيرة ($<length>\r\n) ويقوم فورًا بتخصيص مخزن SDS (سلسلة ديناميكية بسيطة) في الذاكرة لاستقبال الحمولة قبل قراءة أي بايتات من الوسيطة.
نظرًا لأن هذا التخصيص المسبق يحدث قبل استلام حمولة الوسيطة، يمكن للعميل غير المصادق عليه إعلان الحد الأقصى المسموح به لحجم السلسلة الكبيرة (افتراضيًا، proto-max-bulk-len هو 512 ميجابايت) وإبقاء الاتصال مفتوحًا إلى أجل غير مسمى دون إرسال البيانات الفعلية. يحتفظ Redis بالذاكرة المخصصة مسبقًا لكل اتصال نشط، مما يُحدث نسبة تضخيم تبلغ حوالي 32,000,000× (~16 بايت من حركة مرور الشبكة تؤدي إلى حجز ذاكرة بحجم 512 ميجابايت).
فتح اتصالات متزامنة متعددة باستخدام هذه التقنية القائمة على الرؤوس فقط يستنزف بسرعة ذاكرة الخادم المتاحة، مما يسبب:
maxmemory نشطة.OOM command not allowed).تؤثر الثغرة على إصدارات Redis السابقة لما يلي:
حالات Redis التي تعمل بدون مصادقة (requirepass غير مُهيأ) أو بحد proto-max-bulk-len الافتراضي (512 ميجابايت) معرضة لهذا الاستغلال. تفرض الإصدارات المُصححة حدًا صارمًا لمخزن البروتوكول المؤقت يبلغ 16 كيلوبايت للعملاء غير المصادق عليهم قبل حدوث التخصيص المسبق.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Python 3.8+
مثيل Redis معرض للثغرة (إصدارات سابقة لـ 6.2.6 / 6.0.16 أو مثيلات بدون مصادقة)
python3 exploit.py --host <IP> --port <PORT> [options]
| الخيار | النوع | الافتراضي | الوصف |
|---|---|---|---|
--host | str | مطلوب | اسم مضيف Redis الهدف أو عنوان IP |
--port | int | 6379 | رقم المنفذ |
--connections | int | 10 | عدد الاتصالات الخبيثة المطلوب فتحها |
--size | int | 512 | حجم مخزن السلسلة الكبيرة المُعلن بالميجابايت |
--hold | int | 5 | ثوانٍ لإبقاء الاتصالات مفتوحة قبل التنظيف |
--password, --auth | str | None | كلمة مرور مصادقة Redis (إذا لزم الأمر) |
python3 exploit.py --host 127.0.0.1 --port 6379 --connections 10 --size 512 --hold 5
يمكنك تشغيل مختبر اختبار محلي باستخدام إعداد Docker Compose المرفق:
# تشغيل Redis المعرض للثغرة (المنفذ 6380) و Redis المُخفف (المنفذ 6381)
docker compose -f conf/docker-compose.yml up -d
# الاختبار ضد المثيل المعرض للثغرة
python3 exploit.py --host 127.0.0.1 --port 6380 --connections 10 --size 512
# الاختبار ضد المثيل المُخفف
python3 exploit.py --host 127.0.0.1 --port 6381 --password "L4bS3cur3!2024" --connections 10 --size 512
# إيقاف الحاويات
docker compose -f conf/docker-compose.yml down
يُقدَّم هذا الدليل الإثباتي (PoC) لأغراض تعليمية وبحثية والتحقق الأمني فقط. المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر أو اختبار غير مصرح به ضد أنظمة دون إذن صريح.