
PostgreSQL 18.6 - उच्च - रिमोट - फ़ाइल लेखन - pg_basebackup CVE-2026-6475 के शेष पूर्ण tar symlink का अनुसरण करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · postgres-basebackup-symlink
राइट-अप: https://abraxaslabs.tech/research/postgres-basebackup-symlink
वर्ग: फ़ाइल लेखन पहुँच: रिमोट
PostgreSQL 18.6 (724edf9) - PostgreSQL Global Development Group
CVE-2026-6475 ने tar सदस्य नामों के लिए path_is_safe_for_extraction जोड़ा। पूर्ण सिमलिंक लक्ष्य अभी भी उस जाँच को छोड़ देते हैं ताकि टेबलस्पेस काम कर सकें। इसके बाद astreamer_file.c लक्ष्य पर symlink() करता है और बाद में fopen(..., "wb") उसका अनुसरण करता है। डिफ़ॉल्ट pg_basebackup प्रारूप सादा (-F p) है। pg_rewind का create_target_symlink पथ की जाँच करता है और कभी लिंक नहीं करता।
एक शत्रुतापूर्ण स्रोत जो BASE_BACKUP बोलता है, एक पूर्ण सिमलिंक लगा सकता है और उस फ़ाइल को अधिलेखित कर सकता है जिसे बैकअप UID लिख सकता है। वही पीड़ित मॉडल जो 6475 का है। यह सदस्य-नाम जाँचों का पुनः-फाइलिंग नहीं है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | फ़ाइल लेखन (CVE-2026-6475 का पूर्ण tar सिमलिंक अवशेष) |
| पहुँच | रिमोट (UI:R क्लाइंट बनाम शत्रुतापूर्ण PostgreSQL) |
| CWE | CWE-59, CWE-22 |
| CVSS | उच्च: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| उत्पाद | PostgreSQL |
| प्रभावित | 18.6 टैग REL_18_6 (724edf9bde9d356724ad384a2e196edc3c9f80f7), इन-ट्री pg_basebackup / pg_rewind |
| प्रमाणीकरण | पीड़ित शत्रुतापूर्ण स्रोत के विरुद्ध डिफ़ॉल्ट pg_basebackup -D <dir> चलाता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
जो कोई भी किसी ऑपरेटर से अपने PostgreSQL के विरुद्ध pg_basebackup -D चलवा सकता है (CVE-2026-6475 के समान UI:R मॉडल), वह -D के बाहर लिख सकता है।
| विशेषाधिकार | विधि / सिंक | लैब-प्रमाणित या अनुमानित |
|---|---|---|
अखंडता: -D के बाहर एक फ़ाइल लिखना | शत्रुतापूर्ण BASE_BACKUP tar: typeflag '2' सदस्य जिसका सुरक्षित सापेक्ष नाम (pg_tblspc/16384) और एक पूर्ण लिंक लक्ष्य है, फिर उस नाम के अंतर्गत एक नियमित सदस्य। extract_link फिर create_file_for_extract fopen(..., "wb") बिना O_NOFOLLOW के | लैब-प्रमाणित। /work/oracle/ पर POSTGRES-BASEBACKUP-SYMLINK-WITNESS लिखा। Dest में सिमलिंक है। नियंत्रण tar (बिना सिमलिंक) ने oracle को खाली छोड़ा और केवल -D के अंदर PG_VERSION लिखा |
अखंडता: shell rc, authorized_keys, एक systemd उपयोगकर्ता यूनिट, या crontab को अधिलेखित करना | वही सिंक, कोई भी पथ जिसे क्लाइंट UID लिख सकता है | अनुमानित। यह लैब उन फ़ाइलों को नहीं छूता |
| उपलब्धता: क्लाइंट कॉन्फ़िग या कुंजियों को नष्ट करना | वही लेखन | अनुमानित। प्रदर्शित नहीं किया गया |
| क्लाइंट डिस्क की टोह | extract लेखन है, पठन नहीं | बंद |
.. या पूर्ण सदस्य नामों पर चलना | path_is_safe_for_extraction | बंद। वह CVE-2026-6475 है |
| सर्वर-साइड अनप्रिव SQL / अनॉथ प्रोटोकॉल | 18.6 डिफ़ॉल्ट सर्वर | बंद। यह अवशेष क्लाइंट है |
| केवल-tar बैकअप | pg_basebackup -F t tar को बिना निकाले संग्रहीत करता है | बंद |
postgres के अंदर RCE | यह सिंक नहीं | बंद |
pg_rewind में वही create_target_symlink / open() अवशेष है। यह लैब केवल pg_basebackup को चलाता है।
मैंने 18.6 लहर (28 CVE, साथ ही इस ट्री पर पहले से मौजूद 18.4/18.2 सेट) के बाद postgres/postgres REL_18_6 को पिन किया। बाईस खोजें। डिफ़ॉल्ट सर्वर, अनप्रिव SQL, अनॉथ प्रोटोकॉल: इस बार पर कोई नहीं। CVE-2026-6475 पुनः-पठन के लिए सहोदर था।
सदस्य नामों की जाँच होती है। पूर्ण सिमलिंक लक्ष्यों की नहीं:
if (!is_absolute_path(linktarget) &&
!path_is_safe_for_extraction(member->linktarget))
{
pg_fatal("link target has unsafe path name: \"%s\"",
member->linktarget);
}
extract_link(mystreamer->filename, linktarget);
create_file_for_extract अभी भी fopen(filename, "wb") है। astreamer_file.c:351-356 पर टिप्पणी कहती है कि मैपिंग लिंक के pg_tblspc के अंदर होने की जाँच किए बिना लागू की जाती है।
पहले से दर्ज गलत रास्ते: 6475 को बंद मानकर आगे बढ़ जाना; -D को किसी लाइव डेटा डायरेक्टरी पर इंगित करना; दिखावे के लिए shell rc को ओवरराइट करना। एक ईमानदार 18.6 सर्वर केवल pg_tblspc/<oid> सिमलिंक उत्सर्जित करता है और tablespace की सामग्री को एक अलग आर्काइव में रखता है। एक दुर्भावनापूर्ण स्रोत जो BASE_BACKUP बोलता है, अनुवर्ती नियमित सदस्य को उसी tar में रख सकता है। यही बचा हुआ हिस्सा है।
python3 postgres-basebackup-symlink-Abraxas-Labs.py
या
cd lab
./run.sh
postgres:18.6 को स्रोत इमेज के रूप में, एक BASE_BACKUP स्पीकर चलाते हुए। क्लाइंट उसी टैग से इन-ट्री pg_basebackup है (pg_basebackup (PostgreSQL) 18.6)। लूपबैक 127.0.0.1:19370। Compose प्रोजेक्ट postgres-basebackup-symlink। -D को किसी लाइव डेटा डायरेक्टरी पर न लक्षित करें।
SUCCESS postgres-basebackup-symlink control-inside=yes oracle-outside=yes dest-is-symlink=yes image=postgres:18.6 how=pg_basebackup POSTGRES-BASEBACKUP-SYMLINK-WITNESS
पूर्ण सिमलिंक लक्ष्यों को असुरक्षित मानें जब तक कि उन्हें --tablespace-mapping द्वारा पुनः लिखा न गया हो। एक्सट्रैक्ट फ़ाइलों को O_NOFOLLOW / lstat के साथ खोलें ताकि किसी रखे गए लिंक का अनुसरण न किया जा सके। path_is_safe_for_extraction को link के साथ-साथ path पर भी लागू करें। ऐसे नियमित सदस्य को अस्वीकार करें जिसका पथ -D से बाहर गए सिमलिंक से होकर जाता है।
724edf9bde9d356724ad384a2e196edc3c9f80f7)src/fe_utils/astreamer_file.c · src/fe_utils/astreamer_tar.csrc/bin/pg_rewind/file_ops.cGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।