
CVE-2026-6471 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो PostgreSQL में लॉजिकल डिकोडिंग dlopen के माध्यम से विशेषाधिकार वृद्धि प्रदर्शित करता है ताकि मनमाना कोड निष्पादन और सुपरयूज़र बैकडोर प्राप्त किया जा सके।
PostgreSQL लॉजिकल डिकोडिंग एक गैर-सुपरयूज़र भूमिका को, जिसके पास REPLICATION विशेषाधिकार है, एक लॉजिकल रेप्लिकेशन स्लॉट बनाने और आउटपुट प्लगइन चुनने की अनुमति देता है। प्रभावित संस्करणों पर उस चयन पर कोई प्राधिकरण जांच नहीं होती, इसलिए सर्वर dlopen() करता है जो भी प्लगइन नाम इंगित करता है। एक लाइब्रेरी पथ का नामकरण उस लाइब्रेरी के कोड को postgres बैकएंड के अंदर चलाता है, उस ऑपरेटिंग सिस्टम खाते के रूप में जो सर्वर चलाता है। यह डेटाबेस सर्वर के OS उपयोगकर्ता के रूप में मनमाना कोड निष्पादन है, जो एप्लिकेशन डेटा रखने वाले डेटाबेस के लिए प्रभावी रूप से सर्वर अधिग्रहण है।
PostgreSQL 18.6, 17.11, 16.15, 15.19, और 14.24 में output_plugin_libraries अनुमतिसूची (डिफ़ॉल्ट pgoutput, test_decoding) द्वारा ठीक किया गया। उस सूची में नहीं होने वाली कोई भी चीज़ अब किसी भी dlopen से पहले library "X" may not be used as an output plugin त्रुटि देती है।
दोनों बिल्ड के खिलाफ समान चरण चलाएं और केवल PostgreSQL संस्करण बदलता है। एक निम्न-विशेषाधिकार खाता (LOGIN + REPLICATION, सुपरयूज़र नहीं, कोई OS पहुंच नहीं) वही करता है जो एक सामान्य लॉजिकल डिकोडिंग सब्सक्राइबर करता है, फिर सर्वर से आउटपुट प्लगइन के रूप में एक मनमाना लाइब्रेरी लोड करने को कहता है। कमजोर बिल्ड पर वह लाइब्रेरी postgres OS उपयोगकर्ता के रूप में चलती है और एक स्थायी सुपरयूज़र बैकडोर भूमिका स्थापित करती है, इसलिए एक केवल-रेप्लिकेशन खाता एक कार्यशील सुपरयूज़र लॉगिन के साथ रन समाप्त करता है।
cve-2026-6471-postgres-logical-decoding-dlopen.txt एक Exploitmatic समाधान (.txt) है: डेटा प्लस एसर्ट्स, कोई कोड नहीं। रनटाइम इसे बॉक्स के खिलाफ रीप्ले करता है। समाधान रनटाइम पर pwn.so वितरित करता है (फ़ाइल में base64), निम्न-विशेषाधिकार रेप्लिकेशन भूमिका के रूप में SQL चलाता है, फिर सुपरयूज़र बैकडोर भूमिका के रूप में लॉगिन करता है जिसे पेलोड ने स्थापित किया।pwn.c पेलोड लाइब्रेरी स्रोत है और pwn.so इसका बिल्ड है: एक एकल ELF कंस्ट्रक्टर जो postgres OS उपयोगकर्ता के रूप में चलता है, स्थानीय सॉकेट पर डेटाबेस सुपरयूज़र के रूप में कनेक्ट होता है (peer/trust), और स्थायी भूमिका cve6471_backdoor LOGIN SUPERUSER PASSWORD 'BackdoorPass1' बनाता है। यह केवल तभी चलता है जब सर्वर वास्तव में लाइब्रेरी लोड करता है, यानी केवल कमजोर बिल्ड पर। सर्वर इमेज से मेल खाते Linux libc पर gcc -Os -shared -fPIC -o pwn.so pwn.c के साथ बिल्ड करें।पूर्वापेक्षाएँ: आपके पास docker पहुंच है।
lab/ फ़ोल्डर में इस PoC को सत्यापित करने के लिए उपयोग की गई सटीक प्रतिकृति है। दोनों बॉक्स बिल्ड और चलाएं (कमजोर = postgres 16.14, पैच किया गया = postgres 16.15):
docker build -t pg-6471-vuln -f lab/Dockerfile.vuln lab
docker build -t pg-6471-fixed -f lab/Dockerfile.fixed lab
docker run -d --name pg-6471-vuln -p 15432:5432 -e POSTGRES_PASSWORD=lab-super-pw pg-6471-vuln
docker run -d --name pg-6471-fixed -p 15433:5432 -e POSTGRES_PASSWORD=lab-super-pw pg-6471-fixed
दोनों बॉक्स wal_level=logical के साथ स्टॉक आधिकारिक postgres इमेज चलाते हैं। इनिशियलाइज़ेशन स्क्रिप्ट lab/01-repro.sh समाधान द्वारा उपयोग की जाने वाली निम्न-विशेषाधिकार भूमिका बनाती है, repro_rep LOGIN REPLICATION PASSWORD 'repropass', जो सुपरयूज़र नहीं है।
फिर समाधान रीप्ले करें:
exploitmatic run cve-2026-6471-postgres-logical-decoding-dlopen.txt 127.0.0.1
वेरिएबल ओवरराइड के साथ पैच किए गए बॉक्स को इंगित करें, कोई फ़ाइल संपादन नहीं:
exploitmatic run cve-2026-6471-postgres-logical-decoding-dlopen.txt 127.0.0.1 \
--var ctr=pg-6471-fixed
ctr docker कंटेनर है, pw रेप्लिकेशन भूमिका का पासवर्ड है।
| लक्ष्य | परिणाम |
|---|---|
| postgres 16.14 (कमजोर), wal_level=logical | 4/4 सत्यापित, सुपरयूज़र बैकडोर लॉगिन काम करता है |
| postgres 16.15 (पैच किया गया), wal_level=logical | 3/4 सत्यापित नहीं, कोई बैकडोर नहीं |
केवल अधिकृत परीक्षण और शोध के लिए, उन सिस्टमों पर जिनके आप मालिक हैं या परीक्षण करने की अनुमति है। यह PoC एक पोस्ट-प्रमाणीकरण विशेषाधिकार वृद्धि प्रदर्शित करता है: इसे REPLICATION विशेषता के साथ एक मौजूदा निम्न-विशेषाधिकार डेटाबेस खाते की आवश्यकता होती है, साथ ही हमलावर-नियंत्रित कोड रखने का एक तरीका जहां postgres OS उपयोगकर्ता इसे लोड कर सकता है। यह एक दूरस्थ अप्रमाणित हमला नहीं है। लोड किया गया कोड डेटाबेस सुपरयूज़र तक पहुंचता है क्योंकि सर्वर का मालिक OS खाता स्थानीय सॉकेट पर सुपरयूज़र के रूप में कनेक्ट हो सकता है (peer/trust), जो मानक PostgreSQL तैनाती अभ्यास है।
| चरण | कमजोर 16.14 | पैच किया गया 16.15 |
|---|
| recon (भूमिका रेप्लिकेशन है, सुपरयूज़र नहीं) | पास | पास |
| baseline (अंतर्निहित pgoutput के साथ लॉजिकल स्लॉट) | पास | पास |
| trigger (स्लॉट प्लगइन = हमलावर लाइब्रेरी पथ) | सर्वर इसे लोड करता है | लोड से पहले अस्वीकृत |
| takeover (स्थापित सुपरयूज़र बैकडोर के रूप में लॉगिन) | सुपरयूज़र | ऐसी कोई भूमिका नहीं |