
PoC لـ CVE-2026-2005
استغلال (PoC) لتجاوز سعة مخزن مؤقت قائم على الكومة (heap-based buffer overflow) في تحليل مفتاح جلسة PGP داخل امتداد pgcrypto الخاص بـ PostgreSQL، مما يؤدي إلى قراءة/كتابة عشوائية في الذاكرة وتصعيد امتيازات إلى صلاحيات المستخدم الخارق (superuser).
للحصول على التفاصيل التقنية الكاملة، راجع التنبيه الأمني الصادر عن Zeroday Cloud.

استنسخ PostgreSQL وقم بتجميعه من الالتزام (commit) القابل للاستغلال بحيث تتطابق إزاحات رموز الملف الثنائي تمامًا. يحل الاستغلال قاعدة ASLR بمطابقة المؤشرات المسرَّبة مع إزاحات رموز ELF - البنيات أو الإصدارات المختلفة ستكون لها إزاحات مختلفة وستفشل.
git clone https://github.com/postgres/postgres.git
cd postgres
git checkout 4b324845ba5d24682b9b3708a769f00d160afbd7
./configure \
--prefix="$HOME/projects/pg/pgsql" \
--with-libxml \
--with-libxslt \
--enable-debug \
--with-ssl=openssl
make -j$(nproc)
make install-world-bin
pip install -r requirements.txt
python poc.py \
--binary "$HOME/projects/pg/pgsql/bin/postgres" \
--dbname test-db \
--host 127.0.0.1 \
--port 5432 \
--user test-user \
--password secret \
--cmd id
ينفّذ الاستغلال عمليته على 7 مراحل:
تسريب مؤشر الكومة - رسالة PGP مُعدَّة بعناية تُتلف ترويسة كتلة malloc الخاصة بمخزن mdst المؤقت. عندما يستدعي PostgreSQL الدالة pfree() على الكتلة التالفة، يُصدر المُخصِّص (allocator) خطأً يحتوي عنوان المؤشر، مسرّبًا موقع mdst->data في الكومة.
قراءة عشوائية - تجاوز ثانٍ يكتب فوق mdst->data ليجعله يشير إلى (leaked_ptr - 0x10000). بعد فك التشفير، تُرجع mbuf_steal_data() محتويات ذلك العنوان كمخرجات مفكوكة التشفير، مفرّغةً ذاكرة الكومة التي قد تحتوي مؤشرات كود قديمة (stale).
فحص المؤشرات - يُفحص التفريغ السداسي العشري (hex dump) بحثًا عن قيم 8 بايتات بالترتيب الصغير (little-endian) تبدو كعناوين كود (>= 0x500000000000) ولكنها ليست في منطقة الكومة. هذه هي مؤشرات PIE (الملف التنفيذي المستقل عن العنوان - Position Independent Executable) المرشحة.
التصويت على قاعدة PIE - يُختبر كل عنوان مرشح مقابل إزاحات رموز ELF من الملف الثنائي postgres. لكل زوج (addr - sym_offset) يتطابق فيه إزاحة الصفحة (page offset)، يُحتسب صوت. تُحتفظ بالمرشحين الحاصلين على 10+ أصوات؛ القاعدة الأصغر (نظرًا لأن PIE هو مقطع ELF المُعيَّن في أقل عنوان) مرتبةً حسب الأصوات هي المرشح الأعلى.
التحقق من قاعدة PIE - باستخدام بدائية القراءة العشوائية، يقرأ الاستغلال CurrentUserId عند ويقارنه مع OID المعروف للجلسة. أي تطابق يؤكد قاعدة PIE.
pip install -r requirements.txt)pgcryptoإثبات المفهوم (PoC) هذا مخصص لأغراض البحث التعليمي والدفاعي فقط. استخدمه فقط ضد أنظمة تملكها أو لديك إذن صريح باختبارها.
| الوسيط | الافتراضي | الوصف |
|---|
--binary | (الملف الثنائي postgres) | مسار الملف الثنائي postgres لاستخراج الرموز |
--dbname | postgres | اسم قاعدة البيانات المستهدفة |
--host | localhost | مضيف PostgreSQL |
--port | 5432 | منفذ PostgreSQL |
--user | postgres | مستخدم قاعدة البيانات |
--password | (فارغ) | كلمة مرور قاعدة البيانات |
--cmd | whoami | أمر نظام التشغيل الذي سيُنفَّذ بعد تصعيد الامتيازات |
--gdb | (علامة) | إرفاق GDB عبر tmux عند نقطة التجاوز |
(candidate_base + current_user_offset)كتابة عشوائية - يُتلف التجاوز ترويسَتي MBuf لكل من msrc وmdst. تشير msrc->data/read_pos المُزيَّفة إلى حزمة مدمجة مشفَّرة بمفتاح متماثل (sym-encrypted) تحتوي OID المستخدم الخارق (10) بصيغة مشفَّرة. وتشير mdst->data المُزيَّفة إلى CurrentUserId - 4 (الـ -4 يراعي أن SET_VARSIZE في pgp-pgsql.c:533 يكتب طول المخرجات في أول 4 بايتات).
تصعيد الامتيازات - مع استبدال CurrentUserId بالقيمة 10 (المستخدم الخارق الأساسي - bootstrap)، ينفّذ COPY FROM PROGRAM أمر نظام التشغيل المحدد بصفة مستخدم النظام postgres.