
PostgreSQL 18.6 - उच्च - रिमोट - फ़ाइल लेखन - pg_basebackup CVE-2026-6475 के शेष पूर्ण tar symlink का अनुसरण करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · postgres-basebackup-symlink
Class: File write Reach: Remote
PostgreSQL 18.6 (724edf9) - PostgreSQL Global Development Group
CVE-2026-6475 ने tar member names के लिए path_is_safe_for_extraction जोड़ा। Absolute symlink targets अभी भी उस जाँच को छोड़ देते हैं ताकि tablespaces काम करें। astreamer_file.c फिर target को symlink() करता है और बाद में fopen(..., "wb") उसका अनुसरण करता है। डिफ़ॉल्ट pg_basebackup प्रारूप plain (-F p) है। pg_rewind create_target_symlink path की जाँच करता है और कभी link नहीं करता।
BASE_BACKUP बोलने वाला एक शत्रुतापूर्ण source एक absolute symlink लगा सकता है और backup UID जो भी फ़ाइल लिख सकता है उसे overwrite कर सकता है। वही victim model जो 6475 का है। यह member-name जाँचों का पुनः-दाखिला नहीं है।
| ID | अभी तक कोई CVE नहीं |
| Class | File write (CVE-2026-6475 का absolute tar symlink अवशेष) |
| Reach | Remote (UI:R client बनाम शत्रुतापूर्ण PostgreSQL) |
| CWE | CWE-59, CWE-22 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Product | PostgreSQL |
| Affected | 18.6 tag REL_18_6 (724edf9bde9d356724ad384a2e196edc3c9f80f7), in-tree pg_basebackup / pg_rewind |
| Auth | victim डिफ़ॉल्ट pg_basebackup -D <dir> को attacker source के विरुद्ध चलाता है |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
जो कोई किसी operator से अपने PostgreSQL के विरुद्ध pg_basebackup -D चलवा सकता है (CVE-2026-6475 का वही UI:R model) वह -D के बाहर लिख सकता है।
| Privilege | Method / sink | Lab-proven या inferred |
|---|---|---|
Integrity: -D के बाहर फ़ाइल लिखना | शत्रुतापूर्ण BASE_BACKUP tar: typeflag '2' member एक सुरक्षित relative नाम (pg_tblspc/16384) और एक absolute link target के साथ, फिर उस नाम के अंतर्गत एक regular member। extract_link फिर create_file_for_extract fopen(..., "wb") बिना O_NOFOLLOW के | Lab-proven। /work/oracle/ पर POSTGRES-BASEBACKUP-SYMLINK-WITNESS लिखा। Dest में symlink है। Control tar (symlink रहित) ने oracle को खाली छोड़ा और केवल -D के अंदर PG_VERSION लिखा |
Integrity: shell rc, authorized_keys, systemd user unit, या crontab को overwrite करना | वही sink, कोई भी path जिसे client UID लिख सकता है | Inferred। यह lab उन फ़ाइलों को नहीं छूता |
| Availability: client config या keys को नष्ट करना | वही write | Inferred। प्रदर्शित नहीं |
| Client disk की recon | extract write है, read नहीं | Closed |
.. या absolute member names पर चलना | path_is_safe_for_extraction | Closed। वह CVE-2026-6475 है |
| Server-side unpriv SQL / unauth protocol | 18.6 डिफ़ॉल्ट server | Closed। यह अवशेष client है |
| Tar-only backup | pg_basebackup -F t tar को बिना extract किए संग्रहीत करता है | Closed |
postgres के अंदर RCE | यह sink नहीं | Closed |
pg_rewind में वही create_target_symlink / open() अवशेष है। यह lab केवल pg_basebackup को चलाता है।
मैंने 18.6 लहर के बाद postgres/postgres REL_18_6 को pin किया (28 CVEs, साथ ही इस tree पर पहले से मौजूद 18.4/18.2 सेट)। बाईस hunts। डिफ़ॉल्ट server, unpriv SQL, unauth protocol: इस बार पर कोई नहीं। CVE-2026-6475 फिर से पढ़ने योग्य sibling था।
Member names की जाँच होती है। Absolute symlink targets की नहीं:
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 पर टिप्पणी कहती है कि mapping बिना यह जाँचे लागू की जाती है कि link pg_tblspc के अंदर है।
पहले से दर्ज गलत मोड़: 6475 को closed मानकर चले जाना; -D को live data directory पर इंगित करना; theatre के लिए shell rc overwrite करना। एक ईमानदार 18.6 server केवल pg_tblspc/<oid> symlinks उत्सर्जित करता है और tablespace सामग्री को एक अलग archive में रखता है। BASE_BACKUP बोलने वाला एक दुर्भावनापूर्ण source follow-up regular member को उसी tar में रख सकता है। वही अवशेष है।
python3 postgres-basebackup-symlink-Abraxas-Labs.py
या
cd lab
./run.sh
source image के रूप में postgres:18.6, एक BASE_BACKUP speaker चला रहा है। Client उसी tag से in-tree pg_basebackup है (pg_basebackup (PostgreSQL) 18.6)। Loopback 127.0.0.1:19370। Compose project postgres-basebackup-symlink। -D को live data directory पर इंगित न करें।
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
Absolute symlink targets को unsafe मानें जब तक कि उन्हें --tablespace-mapping द्वारा पुनः लिखा न जाए। extract फ़ाइलों को O_NOFOLLOW / lstat के साथ खोलें ताकि लगाए गए link का अनुसरण न किया जा सके। path_is_safe_for_extraction को rewind link के साथ-साथ path पर भी लागू करें। ऐसे regular member को अस्वीकार करें जिसका path -D से बाहर गए symlink से होकर जाता है।
724edf9bde9d356724ad384a2e196edc3c9f80f7)src/fe_utils/astreamer_file.c · src/fe_utils/astreamer_tar.csrc/bin/pg_rewind/file_ops.cGNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई warranty नहीं।