محاكاة وتحليل لإثبات المفهوم لثغرة CVE-2025-1094، وهي ثغرة حرجة في حقن SQL في PostgreSQL. تتضمن إعداد مختبر قائم على Docker، وسكربت استغلال، وتحليل السبب الجذري، وعرضًا توضيحيًا خطوة بخطوة لاختبار الأمان والأغراض التعليمية.
يستكشف هذا الفحص التفصيلي، الذي أُجري في 14 مارس 2025، ثغرة CVE-2025-1094، وهي ثغرة افتراضية عالية الخطورة من نوع حقن SQL في PostgreSQL، استناداً إلى إعداد المحاكاة المقدم وتنفيذ إثبات المفهوم (PoC). يغطي التحليل مقدمة الثغرة، والسبب الجذري، ومساهمات الملفات، وخطوات إثبات المفهوم، والإجراءات التخفيفية، مع تضمين جميع التفاصيل الدقيقة من عملية المحاكاة.
تُوصف CVE-2025-1094 بأنها ثغرة حرجة من نوع حقن SQL في PostgreSQL، تؤثر على الإصدارات السابقة لـ 17.3 و16.7 و15.11 و14.16 و13.19، بدرجة أساسية 8.1 وفق معيار CVSS 3.1، مما يشير إلى تأثيرات كبيرة على السرية والنزاهة والتوافر. وهي تمكن المهاجمين من الوصول إلى البيانات الحساسة أو تنفيذ كود عن بُعد (RCE)، وقد استُغلت في اختراقات حقيقية، مثل حادثة BeyondTrust التي أثرت على 17 عميلاً من المؤسسات، والتي نُقلت على BleepingComputer، واختراق وزارة الخزانة الأمريكية، المُفصَّل على The Register. استخدمت المحاكاة، التي أُجريت في 14 مارس 2025، إعداد Docker مع server_encoding=EUC_TW وclient_encoding=BIG5، وهو أمر حاسم لتفعيل الاستغلال. تضمن إثبات المفهوم حقن كتلة DO لإنشاء كائن كبير، وقراءة /etc/passwd عبر pg_read_file، وكتابته في الكائن الكبير باستخدام ، وتصديره إلى باستخدام ، مما يؤكد دور عدم تطابق الترميز في تمكين الوصول غير المصرح به إلى الملفات.
lo_put/tmp/payloadlo_exportيُصنَّف السبب الجذري تحت CWE-149: التحييد غير السليم لصيغة الاقتباس، ويتضمن معالجة غير سليمة في دوال libpq الخاصة بـ PostgreSQL — PQescapeLiteral() وPQescapeIdentifier() وPQescapeString() وPQescapeStringConn() — التي تفشل في تحييد صيغة الاقتباس عند استخدام النتائج لبناء مدخلات لأداة سطر الأوامر psql. تتفاقم هذه المشكلة عندما يتم تعيين client_encoding إلى BIG5 وserver_encoding إلى EUC_TW، كما هو موضح في إعدادنا، مما يسمح بحقن SQL. تطلبت المحاكاة EUC_TW وzh_TW.EUC_TW لإحداث عدم التطابق، مع حل مشكلات مثل عدم دعم psycopg2 لـ EUC_TW عبر الاتصال بـ UTF8 ثم التبديل إلى BIG5. اعتمد نجاح الاستغلال على تنفيذ SQL خام عبر subprocess.run(["psql", ...])، متجاوزاً المعالجة الآمنة للاستعلامات، كما هو مفصَّل في السجلات.
يلعب كل ملف في الإعداد دوراً حاسماً في محاكاة CVE-2025-1094. فيما يلي تفصيل دقيق في شكل جدول:
| الملف | ما الذي يفعله | المساهمة في إثبات المفهوم | لماذا هو مطلوب |
|---|---|---|---|
exploit.py | يرسل طلب POST مع كتلة DO لإنشاء كائن كبير وتصديره، مع قراءة /etc/passwd. | يفعّل حقن SQL، ويستغل عدم تطابق الترميز لتنفيذ أوامر SQL عشوائية. | يمكّن تنفيذ الاستغلال، وهو أمر حاسم لتأثير إثبات المفهوم. |
app.py | تطبيق Flask يعرض /vuln-endpoint، وينفذ SQL خام عبر psql. | يوفر نقطة نهاية قابلة للاستغلال للهجوم. | نقطة دخول للاستغلال، ضرورية لإظهار الثغرة. |
init.sql | ينشئ جدول اختبار مع id VARCHAR(255) لمدخلات النصوص. | يهيئ مخطط قاعدة البيانات للحقن، ويضمن تنفيذ الحمولة دون أخطاء أنواع. | إعداد قاعدة البيانات للاستغلال، أساسي لحقن SQL. |
Dockerfile | يبني حاوية تطبيق Flask مع الاعتماديات الضرورية. | ينشئ خدمة تطبيق معزولة لنشر نقطة النهاية. | ينشر التطبيق القابل للاستغلال، وهو أمر حاسم لإعادة إنتاج إثبات المفهوم. |
docker-compose.yml | يعرّف ويربط خدمتي db وapp مع تكوينات محددة. | ينسق الإعداد، ويضمن عدم تطابق الترميز وتبعيات الخدمات. | يربط الخدمات، وهو أساسي لإعداد البيئة وعزلها. |
Dockerfile.db | يبني حاوية PostgreSQL بترميز EUC_TW. | ينشئ قاعدة بيانات قابلة للاستغلال بالترميز المطلوب. | يهيئ قاعدة البيانات بالترميز المطلوب، وهو أمر حاسم لتفعيل الثغرة. |
يوضح إثبات المفهوم، الذي نُفذ في 14 مارس 2025، تأثير الاستغلال عبر الخطوات التالية، مع شرح مفصّل لكل خطوة:
sudo docker compose up --build
db وapp)، وينشئ الحاويات بصور محدّثة إذا لزم الأمر، ويربطها في شبكة postgre_default. يضمن إعداد البيئة القابلة للاستغلال، حيث تستخدم db ترميز EUC_TW وتعرض app نقطة النهاية /vuln-endpoint على المنفذ 5000، وهو أمر حاسم لعدم تطابق الترميز والوصول إلى نقطة النهاية في الاستغلال.curl -X POST http://localhost:5000/vuln-endpoint -d "input=test"
input=test، للتحقق من الاتصال والوظائف الأساسية، متوقعاً "Executed". يؤكد أن التطبيق يعمل ويمكنه الاتصال بقاعدة البيانات، مما يضمن جاهزية الإعداد للاستغلال.
python3 cve-2025-1094-exploit.py
/etc/passwd فيه، وتصديره إلى /tmp/payload، مع طباعة حالة التنفيذ. يفعّل حقن SQL، مستغلاً الثغرة لقراءة /etc/passwd، وهو أمر حاسم لإظهار تأثير CVE-2025-1094، كما يظهر في السجلات مع تصدير ناجح للملف.
sudo docker ps
postgre-app-1 وpostgre-db-1 تعملان. يؤكد الإعداد قبل تشغيل الاستغلال، ويضمن أن كلتا الخدمتين نشطتان، وهو أمر حاسم لموثوقية إثبات المفهوم. يوفر للمستخدم معرف الحاوية، اللازم للأوامر اللاحقة.sudo docker exec -it bash -c "LC_ALL=C ls -l /tmp/payload && LC_ALL=C cat /tmp/payload"
postgre-db-1، لعرض /tmp/payload مع مخرجات بالإنجليزية، والتحقق من نتيجة الاستغلال (يجب أن تُظهر /etc/passwd). يؤكد نجاح الاستغلال من خلال فحص الملف، ويضمن أن /tmp/payload يحتوي على بيانات حساسة، بما يتماشى مع التحقق من إثبات المفهوم، ويتجنب تشويش اللغة باستخدام LC_ALL=C.
sudo docker exec -it psql -U postgres -d postgres -c "SELECT * FROM test;"
test، والتحقق من أمر INSERT الناتج عن الاستغلال (يجب أن يُظهر "Exploit ran with loid ..."). يؤكد تعديل الاستغلال لقاعدة البيانات، ويضمن تنفيذ كتلة DO، بما يتماشى مع التحقق من إثبات المفهوم، ويتحقق من تسجيل loid.sudo docker compose down
فيديو توضيحي على Vimeo
انقر لعرض العرض التوضيحي لإثبات المفهوم على Vimeo.
للتخفيف من CVE-2025-1094، يُوصى بالتدابير التالية، استناداً إلى رؤى المحاكاة والإرشادات الصناعية:
psql على المستخدمين الموثوقين فقط، مما يقلل من سطح الهجوم.