PostgreSQL 18.6 - عالي - عن بُعد - كتابة ملفات - pg_basebackup يتبع رابطًا رمزيًا مطلقًا في tar متبقٍ من CVE-2026-6475
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · postgres-basebackup-symlink
الفئة: كتابة ملفات الوصول: عن بُعد
PostgreSQL 18.6 (724edf9) - مجموعة تطوير PostgreSQL العالمية
أضاف CVE-2026-6475 الدالة path_is_safe_for_extraction لأسماء أعضاء ملف tar. لا تزال أهداف الروابط الرمزية المطلقة تتجاوز هذا الفحص حتى تعمل مساحات الجداول. بعد ذلك يقوم astreamer_file.c بإنشاء symlink() للهدف ثم يتبعه fopen(..., "wb") لاحقًا. الصيغة الافتراضية لـ pg_basebackup هي plain (-F p). يتحقق create_target_symlink في pg_rewind من المسار ولا ينشئ الرابط أبدًا.
يمكن لمصدر خبيث يتحدث BASE_BACKUP أن يزرع رابطًا رمزيًا مطلقًا ويكتب فوق أي ملف يستطيع UID النسخ الاحتياطي الكتابة فيه. نفس نموذج الضحية كما في 6475. هذا ليس إعادة تقديم لفحوصات أسماء الأعضاء.
| المعرّف | لا يوجد CVE بعد |
| الفئة | كتابة ملفات (بقايا رابط رمزي مطلق في tar من CVE-2026-6475) |
| الوصول | عن بُعد (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 فقط |
من يستطيع دفع مشغّل لتشغيل pg_basebackup -D مقابل PostgreSQL الخاص به (نفس نموذج UI:R كما في CVE-2026-6475) يمكنه الكتابة خارج -D.
| الصلاحية | الطريقة / نقطة الوصول | مُثبت مختبريًا أم مُستنتج |
|---|---|---|
السلامة: كتابة ملف خارج -D | tar خبيث في BASE_BACKUP: عضو typeflag '2' باسم نسبي آمن (pg_tblspc/16384) وهدف رابط مطلق، ثم عضو عادي تحت ذلك الاسم. extract_link ثم create_file_for_extract مع fopen(..., "wb") بدون O_NOFOLLOW | مُثبت مختبريًا. كُتب POSTGRES-BASEBACKUP-SYMLINK-WITNESS في /work/oracle/. الوجهة تحتفظ بالرابط الرمزي. tar التحكم (بدون رابط رمزي) ترك الـ oracle فارغًا وكتب PG_VERSION فقط داخل -D |
السلامة: الكتابة فوق shell rc أو authorized_keys أو وحدة systemd للمستخدم أو crontab | نفس نقطة الوصول، أي مسار يستطيع UID العميل الكتابة فيه | مُستنتج. هذا المختبر لا يلمس تلك الملفات |
| التوفر: تحطيم إعدادات العميل أو المفاتيح | نفس الكتابة | مُستنتج. لم يُثبت |
| استطلاع قرص العميل | الاستخراج كتابة وليس قراءة | مغلق |
تجاوز .. أو أسماء الأعضاء المطلقة | path_is_safe_for_extraction | مغلق. هذا هو CVE-2026-6475 |
| SQL غير متميز من جهة الخادم / بروتوكول بدون مصادقة | خادم 18.6 الافتراضي | مغلق. هذه البقايا في العميل |
| نسخ احتياطي بصيغة tar فقط | pg_basebackup -F t يخزّن الـ tar دون استخراج | مغلق |
تنفيذ كود عن بُعد داخل postgres | ليس نقطة الوصول هذه | مغلق |
لدى pg_rewind نفس بقايا create_target_symlink / open(). هذا المختبر يشغّل pg_basebackup فقط.
ثبّتُ postgres/postgres على REL_18_6 بعد موجة 18.6 (28 ثغرة CVE، بالإضافة إلى مجموعة 18.4/18.2 الموجودة أصلًا على هذه الشجرة). اثنتان وعشرون عملية بحث. الخادم الافتراضي، 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> ويضع محتويات مساحة الجداول في أرشيف منفصل. يمكن لمصدر خبيث يتحدث 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). Loopback 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 في rewind وكذلك على 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. مختبر loopback فقط. لا ضمان.