
CVE-2021-32675 के लिए Redis में कार्यात्मक DoS शोषण, जो मेमोरी समाप्ति को ट्रिगर करने के लिए अत्यधिक बड़े बल्क स्ट्रिंग हेडर का लाभ उठाता है। उपयोग निर्देश और Docker-आधारित परीक्षण वातावरण शामिल है।
इस रिपॉजिटरी में CVE-2021-32675 के लिए एक कार्यशील एक्सप्लॉइट शामिल है, जो Redis में एक डिनायल-ऑफ-सर्विस (DoS) भेद्यता है। यह दोष बिना प्रमाणीकरण वाले दूरस्थ हमलावरों को तर्क डेटा प्रदान किए बिना अत्यधिक बड़े बल्क स्ट्रिंग हेडर भेजकर Redis सर्वर पर बड़े पैमाने पर मेमोरी प्री-आवंटन ट्रिगर करने की अनुमति देता है, जिससे मेमोरी समाप्त हो जाती है और सेवा क्रैश हो जाती है।
CVE-2021-32675 Redis क्वेरी बफर हैंडलिंग में एक भेद्यता है। RESP (REdis Serialization Protocol) प्रोटोकॉल में आने वाले कमांड को पार्स करते समय, Redis बल्क स्ट्रिंग तर्क ($<length>\r\n) की घोषित लंबाई पढ़ता है और कोई भी तर्क बाइट पढ़ने से पहले पेलोड प्राप्त करने के लिए मेमोरी में तुरंत एक SDS (Simple Dynamic String) बफर प्री-आवंटित करता है।
क्योंकि यह प्री-आवंटन तर्क पेलोड प्राप्त करने से पहले होता है, एक बिना प्रमाणीकरण वाला क्लाइंट अधिकतम अनुमत बल्क स्ट्रिंग आकार (डिफ़ॉल्ट रूप से, proto-max-bulk-len 512 MB है) घोषित कर सकता है और वास्तविक डेटा संचारित किए बिना कनेक्शन को अनिश्चित काल तक खुला रख सकता है। Redis प्रत्येक सक्रिय कनेक्शन के लिए प्री-आवंटित मेमोरी बनाए रखता है, जिससे लगभग 32,000,000× का एम्प्लीफिकेशन अनुपात बनता है (~16 बाइट्स नेटवर्क ट्रैफ़िक के परिणामस्वरूप 512 MB मेमोरी आरक्षण होता है)।
इस हेडर-ओनली तकनीक का उपयोग करके कई समवर्ती कनेक्शन खोलने से सर्वर की उपलब्ध मेमोरी जल्दी समाप्त हो जाती है, जिससे निम्नलिखित होता है:
maxmemory नीति सक्रिय है तो जबरन की एविक्शन।OOM command not allowedयह भेद्यता Redis के निम्नलिखित संस्करणों से पहले के संस्करणों को प्रभावित करती है:
बिना प्रमाणीकरण के चलने वाले (requirepass कॉन्फ़िगर नहीं) या डिफ़ॉल्ट proto-max-bulk-len (512 MB) वाले Redis इंस्टेंस इस एक्सप्लॉइट के प्रति संवेदनशील हैं। पैच किए गए संस्करण प्री-आवंटन होने से पहले बिना प्रमाणीकरण वाले क्लाइंट्स के लिए सख्त 16 KB प्रोटोकॉल बफर सीमा लागू करते हैं।
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 | घोषित बल्क स्ट्रिंग बफर आकार MB में |
--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
यह प्रूफ ऑफ कॉन्सेप्ट केवल शैक्षिक, अनुसंधान और सुरक्षा सत्यापन उद्देश्यों के लिए प्रदान किया गया है। लेखक स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध किसी भी दुरुपयोग, क्षति या अनधिकृत परीक्षण के लिए जिम्मेदार नहीं है।