PostgreSQL 18.6 - عالي - عن بُعد - كتابة ملفات - pg_basebackup يتبع رابطًا رمزيًا مطلقًا في tar متبقٍ من CVE-2026-6475
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 الدالة path_is_safe_for_extraction لأسماء أعضاء ملفات tar. لا تزال أهداف الروابط الرمزية المطلقة تتجاوز هذا الفحص حتى تعمل مساحات الجداول (tablespaces). بعد ذلك يقوم astreamer_file.c باستدعاء symlink() على الهدف، ثم يتبعه لاحقًا fopen(..., "wb"). الصيغة الافتراضية لـ pg_basebackup هي plain (-F p). تتحقق create_target_symlink في pg_rewind من المسار ولا تتحقق أبدًا من الرابط.
يمكن لمصدر خبيث يتحدث بروتوكول BASE_BACKUP أن يزرع رابطًا رمزيًا مطلقًا ويكتب فوق أي ملف يستطيع مستخدم النسخ الاحتياطي (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/. يحتفظ الوجهة (Dest) بالرابط الرمزي. tar التحكم (بدون رابط رمزي) ترك oracle فارغًا وكتب PG_VERSION فقط داخل -D |
السلامة: الكتابة فوق shell rc أو authorized_keys أو وحدة systemd للمستخدم أو crontab | نفس نقطة الوصول، أي مسار يستطيع مستخدم العميل الكتابة إليه | مُستنتج. لا يمس هذا المختبر تلك الملفات |
| الإتاحة: تحطيم إعدادات العميل أو مفاتيحه | نفس الكتابة | مُستنتج. لم يُثبت |
| استطلاع قرص العميل | الاستخراج كتابة وليس قراءة | مغلق |
تجاوز .. أو أسماء الأعضاء المطلقة | path_is_safe_for_extraction | مغلق. ذلك هو CVE-2026-6475 |
| SQL غير مميز على الخادم / بروتوكول بدون مصادقة | خادم 18.6 الافتراضي | مغلق. هذا المتبقي في العميل |
| نسخ احتياطي بصيغة tar فقط | pg_basebackup -F t يخزّن tar دون استخراج | مغلق |
تنفيذ أوامر عن بُعد (RCE) داخل 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> ويضع محتويات 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. مختبر loopback فقط. دون أي ضمان.