
ثغرة حرجة لاجتياز المسار (Path Traversal) تؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) في خادم الوسائط Jellyfin (CVSS 9.9). تتضمن استغلالًا لإثبات المفهوم (PoC)، وتحليلًا تقنيًا، وأدوات كشف.
ثغرة حرجة من نوع Path Traversal في Jellyfin Media Server تسمح للمستخدمين المصادق عليهم الذين يمتلكون صلاحية "Upload Subtitles" برفع ملفات إلى مواقع عشوائية على القرص. من خلال استغلال حقل Format غير المُتحقق منه في نقطة نهاية رفع الترجمات، يمكن للمهاجمين كتابة ملفات إلى مواقع حساسة، واستخراج بيانات حساسة، وتصعيد الامتيازات، وفي النهاية تنفيذ كود عشوائي بصلاحيات root عبر حقن LD_PRELOAD.
| الخاصية | القيمة |
|---|---|
| CVE ID | CVE-2026-35031 |
| درجة CVSS | 9.9 (حرجة) |
| CWE | CWE-22: التقييد غير السليم لاسم المسار إلى دليل مقيد ('Path Traversal') |
| المنتج المتأثر | Jellyfin Media Server |
| الإصدارات المتأثرة | < 10.11.7 |
| الإصدار المُصحح | 10.11.7 والإصدارات الأحدث |
| نوع الثغرة | Path Traversal + كتابة ملفات عشوائية + RCE |
| المصادقة مطلوبة | نعم (مستخدم غير مسؤول) |
| الصلاحيات المطلوبة | صلاحية "Upload Subtitles" |
| المنفذ الافتراضي | 8096/TCP |
| استشارة GitHub | GHSA-9p5f-5x8v-x65m |
| حالة التصحيح | متاح وتم إصداره |
| الاستغلال العام | نعم |
Jellyfin هو خادم وسائط مجاني ومفتوح المصدر مصمم لمساعدتك في إدارة وبث مجموعتك الشخصية من الوسائط. يوفر وظائف مشابهة لخوادم الوسائط التجارية لكن مع شفافية كاملة في الكود المصدري وسيطرة مجتمعية.
Jellyfin Media Server (Port 8096)
/ | \
/ | \
Web UI REST API Media Streams
(Browser) (Authenticated) (Subtitle Upload)
|
/System/Info/Public (unauthenticated)
/Videos/{itemId}/Subtitles (vulnerable)
/Library/Collections (admin)
Client Devices > Network > Jellyfin Server > Database + Storage | /var/lib/jellyfin/ /etc/ld.so.preload (writable via vulnerability)
---
## تحليل متعمق للثغرة
### تحليل السبب الجذري
توجد الثغرة في نقطة نهاية رفع الترجمات (`/Videos/{itemId}/Subtitles`) التي تقبل تحميل الملفات وتخزنها على القرص. يكمن الخلل الحرج في عدم كفاية التحقق من معامل حقل Format.
#### نمط الكود المعرّض للخطر
تعالج نقطة النهاية عمليات رفع الترجمات دون التحقق بشكل صحيح من حقل Format أو تنظيفه:```
POST /Videos/{itemId}/Subtitles HTTP/1.1
Content-Type: multipart/form-data
[Binary subtitle data]
Format: /../../../etc/ld.so.preload
Language: en
معامل Format يُقصد به تحديد تنسيق الترجمة (srt، vtt، ass، إلخ) لكنه بدلاً من ذلك يُعامل كجزء من مسار الملف:```
Base Path: /var/lib/jellyfin/subtitles/
User Input: /../../../etc/ld.so.preload
Result: /var/lib/jellyfin/subtitles/../../../etc/ld.so.preload
Resolved: /etc/ld.so.preload (via path traversal)
### تفصيل سلسلة الهجوم
تجمع الثغرة الأمنية بين عدة نقاط ضعف معًا لتحقيق تنفيذ تعليمات برمجية عن بُعد بصلاحيات root:```
Step 1: Subtitle Upload with Path Traversal
POST /Videos/{itemId}/Subtitles
Format: /../../../etc/ld.so.preload
|
v
Step 2: Arbitrary File Write
Write attacker-controlled data to /etc/ld.so.preload
|
v
Step 3: File Read via .strm Files
Create .strm files pointing to sensitive paths
Extract database contents and credentials
|
v
Step 4: Database Extraction
Access /jellyfin/jellyfin.db via .strm
Extract admin user hashes
|
v
Step 5: Admin Privilege Escalation
Reset admin password or create new admin account
|
v
Step 6: RCE via LD_PRELOAD Injection
LD_PRELOAD=/path/to/malicious.so java
Arbitrary code execution as root
Input Validation Failure:
Format Field Validation: Expected: srt | vtt | ass | ssa | sub | subrip Actual: /../../../etc/ld.so.preload Result: NO VALIDATION > PATH TRAVERSAL ALLOWED
File Write Operation: String Concatenation: "/subtitles/" + user_format + ".srt" | NO CANONICALIZATION: Path component not resolved before write NO WHITELIST: Format values not restricted NO BOUNDS CHECK: ".." sequences not filtered | v Final Path: /etc/ld.so.preload (EXPLOITED)
### استغلال LD_PRELOAD
تقنية LD_PRELOAD هي طريقة قوية لتصعيد الامتيازات وتنفيذ التعليمات البرمجية على أنظمة لينكس:```
LD_PRELOAD Injection Flow:
1. Attacker writes malicious .so (shared object) to /etc/ld.so.preload
/etc/ld.so.preload contents:
/path/to/attacker.so
2. Java process starts (Jellyfin runs on Java):
kernel > execve("java", ...) > glibc initialization
|
v
Check /etc/ld.so.preload
|
v
Load attacker.so FIRST
|
v
Execute attacker code
(BEFORE Java main())
3. Code Execution Context:
Process Owner: root (Jellyfin typically runs as root)
Permissions: Full system access
Timing: Before application initialization
Detection: Minimal (malicious code runs early)