
استغلال إثبات المفهوم للثغرة CVE-2026-14669، وهي تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow) في اختصار المنطقة الزمنية لدالة to_char() في PostgreSQL، مما يتيح تنفيذ التعليمات البرمجية عن بُعد (RCE) عبر تسريب المعلومات وسلسلة ROP؛ يتضمن مختبر Docker وإثبات مفهوم آلي.
توجد ثغرة تجاوز سعة المخزن المؤقت في الكومة (Heap Buffer Overflow) في دالة to_char() الخاصة بـ PostgreSQL عند معالجة تنسيق المنطقة الزمنية. يمكن للمهاجم، عبر تعيين اختصار منطقة زمنية طويلة جدًا بصيغة POSIX، إحداث كتابة خارج الحدود في مخزن مؤقت ثابت بحجم 25 بايت، وبالدمج مع تسريب المعلومات وسلسلة ROP يمكن تحقيق تنفيذ تعليمات برمجية عن بُعد.
to_char(timestamptz) في PostgreSQL| سلسلة PostgreSQL | النطاق المتأثر |
|---|
| 18.x | 18.0 – 18.5 |
| 17.x | 17.0 – 17.10 |
| 16.x | 16.0 – 16.14 |
| 15.x | 15.0 – 15.18 |
| 14.x | 14.0 – 14.23 |
يستخدم مسار المعالجة DCH_TZ / DCH_tz في formatting.c مخزنًا مؤقتًا ثابتًا على المكدس بحجم 25 بايت لتخزين اختصار المنطقة الزمنية، دون أي فحص لطول الإدخال. عندما يتجاوز اختصار المنطقة الزمنية 24 بايت، تقوم دالة strcpy() بكتابة خارج الحدود في ذاكرة الكومة.
مسار الاستغلال:
SET TIME ZONE '<超长缩写>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← 堆溢出
يتكوّن PoC الصادر عن V12 Security من ثلاث مراحل:
يؤدي تجاوز سعة الكومة إلى إتلاف كائنات الكومة المجاورة، مما يسرّب العنوان الأساسي لـ PIE ومؤشرات الكومة لكسر آلية ASLR.
يتم ترتيب سلسلة أدوات ROP (gadgets) في الكومة باستخدام الكائنات الكبيرة (Large Objects) أو حقول bytea.
تستغل عملية التجاوز الثانية مؤشرات الدوال في الكومة للقفز إلى سلسلة ROP وتنفيذ أوامر عشوائية (بصلاحية مستخدم postgres).
poc.py - سكربت استغلال كامل (210 سطرًا، يستهدف PostgreSQL 19beta1)requirements.txt - تبعيات Python (psycopg, pwntools)docker-compose.yml - بيئة اختبار الثغرةdocker-compose up -d
انتظر اكتمال تشغيل الحاوية (نجاح فحص الصحة):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
الاتصال الافتراضي يكون بـ 127.0.0.1:55432، واسم المستخدم postgres، وكلمة المرور postgres.
بعد نجاح الاستغلال، يمكن رؤية مخرجات تنفيذ الأوامر في سجلات الحاوية:
docker logs pg-tzlab | grep PWNED
عدّل الثوابت في poc.py:
HOST, PORT - عنوان الهدفDEFAULT_COMMAND - الأمر المراد تنفيذه⚠️ مهم: يقوم هذا الـ PoC بترميز عناوين الإزاحة لبناء معيّن (صورة Docker postgres:19beta1، sha256:a6bdd01...). تتطلب الإصدارات الأخرى إعادة تحديد مواقع الـ gadgets.
SET TIME ZONE الطويلة جدًا (أكثر من 50 حرفًا)⚠️ هذا الـ PoC مخصص فقط لأغراض البحث الأمني والتحقق من الثغرات والاختبارات الدفاعية.
استخدام هذا الـ PoC يعني موافقتك على الالتزام بالقوانين واللوائح المحلية وحدود التصريح الخاصة بالنظام المستهدف.