
ثغرة حرجة لاجتياز المسار (Path Traversal) تؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) في خادم الوسائط Jellyfin (CVSS 9.9). تتضمن استغلالًا لإثبات المفهوم (PoC)، وتحليلًا تقنيًا، وأدوات كشف.
ثغرة حرجة من نوع Path Traversal في Jellyfin Media Server تسمح للمستخدمين المصادق عليهم الذين يمتلكون صلاحية "Upload Subtitles" برفع ملفات إلى مواقع عشوائية على القرص. من خلال استغلال حقل Format غير المُتحقق منه في نقطة نهاية رفع الترجمات، يمكن للمهاجمين كتابة ملفات إلى مواقع حساسة، واستخراج بيانات حساسة، وتصعيد الامتيازات، وفي النهاية تنفيذ كود عشوائي بصلاحيات root عبر حقن LD_PRELOAD.
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)
4. Attacker Capabilities:
> Create reverse shell with full root privileges
> Extract sensitive data before application starts
> Modify Java application behavior
> Persist via cron jobs or systemd services
> Establish C2 communication
User Level Access > Path Traversal > Write /etc/ld.so.preload | v (Next process execution) | Kernel reads /etc/ld.so.preload > Loads attacker .so | v Malicious code executes in root context | v Full system compromise
---
## تحليل التأثير
### السرية
**حرجة** - إفشاء كامل للمعلومات
- استخراج قاعدة البيانات: بيانات اعتماد المدير، كلمات مرور المستخدمين، مفاتيح API
- كشف ملفات الترجمة وبيانات تعريف الوسائط
- الوصول إلى ملفات الإعدادات التي تحتوي على بيانات حساسة
- جمع معلومات النظام لاستغلالها بشكل إضافي
### السلامة
**حرجة** - تعديل ملفات على مستوى النظام بالكامل
- كتابة ملفات عشوائية إلى أي موقع على القرص
- تعديل الملفات التنفيذية للتطبيق
- العبث بإعدادات النظام
- تلف قاعدة البيانات أو التلاعب بها
### التوفر
**حرجة** - تعطيل الخدمة ومنعها
- إيقاف تشغيل النظام أو انهياره عبر مكتبة .so خبيثة في LD_PRELOAD
- استنزاف مساحة القرص من خلال كتابة ملفات كبيرة
- إنهاء العمليات أو تجويع الموارد
- عدم توفر الخدمة بشكل كامل
### المكونات المتأثرة
- عملية خادم الوسائط Jellyfin (تعمل بصلاحيات root في معظم عمليات النشر)
- نواة نظام التشغيل والمكتبات
- الوسائط المخزنة وبياناتها الوصفية
- أنظمة مصادقة المستخدمين
- عمليات النظام المرتبطة بـ glibc
### التأثير على الأعمال
- **اختراق البيانات:** جميع بيانات الاعتماد المخزنة وبيانات المستخدمين تم اختراقها
- **انقطاع الخدمة:** يصبح Jellyfin وربما خدمات أخرى غير متاحة
- **الحركة الجانبية:** يصبح النظام المخترق نقطة انطلاق للهجمات على الشبكة
- **انتهاك الامتثال:** انتهاكات GDPR وCCPA وHIPAA إذا تم كشف المعلومات الشخصية القابلة للتعريف (PII)
- **مخاطر سلسلة التوريد:** إذا كان Jellyfin يخدم وسائط مشتركة أو خاصة بالمؤسسات
---
## الإصدارات المتأثرة
| الإصدار | الحالة | ملاحظات |
|---------|--------|-------|
| < 10.8.0 | قابل للاستغلال | الثغرة الأصلية موجودة |
| 10.8.0 - 10.11.6 | قابل للاستغلال | إمكانية اجتياز المسارات وتنفيذ التعليمات البرمجية عن بُعد (RCE) |
| 10.11.7+ | مُصحح | تم التحقق من حقل التنسيق بشكل صحيح |
| 10.12.0+ | مُصحح | أحدث إصدار يتضمن إصلاحات أمنية |
### كشف الإصدار
يمكن كشف الثغرة من خلال التحقق من سلسلة الإصدار من نقطة النهاية `/System/Info/Public`:```
GET /System/Info/Public HTTP/1.1
Host: jellyfin-server:8096
Response:
{
"ServerName": "MyJellyfin",
"Version": "10.10.3", < Vulnerable
"ProductName": "Jellyfin",
"StartupWizardCompleted": true
}
يوفر سكربت CVE-2026-35031_Jellyfin_RCE_detector.py كشفًا آليًا للثغرات.
pip install requests urllib3
#### الاستخدام```bash
python CVE-2026-35031_Jellyfin_RCE_detector.py -t 10.0.0.5:8096
python CVE-2026-35031_Jellyfin_RCE_detector.py -t http://10.0.0.0/24
python CVE-2026-35031_Jellyfin_RCE_detector.py -t targets.txt -o results.json
-t, --target HOST[:PORT] or CIDR or FILE Single target, IP range, or file with targets -p, --port PORT Custom port (default: 8096) --timeout SECONDS Connection timeout (default: 10) -o, --output FILE Save results to JSON file -v, --verbose Enable verbose logging --no-ssl-verify Disable SSL certificate verification
#### مثال على الإخراج```
[*] CVE-2026-35031 Jellyfin RCE Detection Scanner
[*] Target: http://10.0.0.5:8096
[*] Scan Time: 2026-04-15T12:00:00Z
[*] Detection method: /System/Info/Public version check
[*] Vulnerable: Jellyfin < 10.11.7
======================================================================
Target: http://10.0.0.5:8096
Scan Time: 2026-04-15T12:00:00Z
Risk Level: CRITICAL
======================================================================
Is Jellyfin: YES
Jellyfin Version: 10.10.3
Server Name: MediaServer
Operating System: Linux
Subtitle Endpoint: Accessible
Vulnerable: YES
*** VULNERABLE: Path traversal in subtitle upload ***
*** Chains to arbitrary file write and RCE as root via ld.so.preload ***
*** Upgrade to Jellyfin 10.11.7 immediately ***
======================================================================
Summary:
Total Targets: 1
Vulnerable: 1
Patched: 0
Unknown: 0
======================================================================
يقوم الماسح الضوئي بالفحوصات التالية:
/System/Info/PublicVersion من استجابة JSONيوفر سكربت CVE-2026-35031_Jellyfin_RCE.nse التكامل مع Nmap لفحص الثغرات.
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
#### الاستخدام```bash
# Basic scan
nmap -p 8096 --script CVE-2026-35031_Jellyfin_RCE 10.0.0.5
# Comprehensive scan with service detection
nmap -sV -p 8096 --script CVE-2026-35031_Jellyfin_RCE 10.0.0.5
# Scan entire subnet
nmap -sV -p 8096 --script CVE-2026-35031_Jellyfin_RCE 10.0.0.0/24
# Aggressive scanning with timing
nmap -sV -p- --script CVE-2026-35031_Jellyfin_RCE -T4 10.0.0.5
# Export results to XML
nmap -sV -p 8096 --script CVE-2026-35031_Jellyfin_RCE -oX results.xml 10.0.0.5
PORT STATE SERVICE VERSION 8096/tcp open http Jellyfin Media Server 10.10.3 | CVE-2026-35031_Jellyfin_RCE: | VULNERABLE: | Jellyfin Subtitle Path Traversal to RCE (CVE-2026-35031) | State: VULNERABLE | Risk level: CRITICAL | CVSS Score: 9.9 | Jellyfin Version: 10.10.3 | Fixed Version: 10.11.7 | Description: | Jellyfin 10.10.3 is vulnerable to CVE-2026-35031. The subtitle | upload endpoint (/Videos/{itemId}/Subtitles) does not validate | the Format field, allowing path traversal and arbitrary file write. | This chains into remote code execution as root via LD_PRELOAD. | Vulnerability Chain: | 1. POST /Videos/{itemId}/Subtitles with Format=/../../../etc/ld.so.preload | 2. Arbitrary file write to /etc/ld.so.preload | 3. Database extraction via .strm files | 4. Admin privilege escalation | 5. RCE as root via LD_PRELOAD injection | Affected Endpoint: /Videos/{itemId}/Subtitles | Authentication Required: YES (non-admin user) | References: | https://nvd.nist.gov/vuln/detail/CVE-2026-35031 | https://github.com/jellyfin/jellyfin/security/advisories/GHSA-9p5f-5x8v-x65m |_ https://github.com/jellyfin/jellyfin/releases/tag/v10.11.7
#### معلمات السكربت```bash
# Custom timeout for slow networks
nmap --script CVE-2026-35031_Jellyfin_RCE --script-args timeout=30 10.0.0.5
# Debug mode for troubleshooting
nmap --script CVE-2026-35031_Jellyfin_RCE -d 10.0.0.5
# Aggressive version detection
nmap -sV --version-intensity 9 --script CVE-2026-35031_Jellyfin_RCE 10.0.0.5
سجلات خادم Jellyfin (/var/log/jellyfin/jellyfin.log)```
[ERR] Error processing subtitle upload: Invalid path characters detected
[ERR] Exception in subtitle handling: DirectoryNotFoundException
[ERR] Unauthorized file system access attempt
[WARN] Unusual subtitle format detected: /../../../
[ERR] Security violation: Path traversal attempt blocked
**سجلات النظام** (`/var/log/syslog` أو `/var/log/messages`)```
subtitle upload process: segmentation fault (core dumped)
kernel: [security] Attempted to load from LD_PRELOAD: /etc/ld.so.preload
ld.so.preload: permission denied or file corrupted
Java process crashed after LD_PRELOAD initialization
Unexpected behavior from root-level Java process
ملفات النظام المعدلة``` /etc/ld.so.preload - Should not contain any paths if not configured /lib/x86_64-linux-gnu/ - Look for suspicious .so files created recently /var/lib/jellyfin/subtitles - Check for files outside normal naming /etc/passwd - Verify no unauthorized access or modification /var/lib/jellyfin/db - Database timestamps may indicate extraction
**مسارات الملفات المشبوهة في دليل الترجمة**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
طلبات HTTP المشبوهة``` POST /Videos/[0-9]+/Subtitles
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
**الاتصالات الصادرة من عملية Jellyfin**```
Reverse shells to external IPs
Connections to known C2 infrastructure
DNS requests to anomalous domains
Sudden spike in network traffic after failed subtitle upload
حالات شاذة في عملية Jellyfin``` java process executing system commands java process spawning shell processes (/bin/bash, /bin/sh) java process opening connections to unusual ports java process reading system files like /etc/shadow Unusual CPU or memory usage spikes Child processes with different UID than parent
### مؤشرات قاعدة البيانات
**تغييرات قاعدة بيانات Jellyfin** (`jellyfin.db`)```
New admin user created outside normal workflow
Admin password changed without admin action
API keys/tokens created unexpectedly
Unusual activity in audit logs
قم بترقية Jellyfin فورًا ```bash
docker pull jellyfin/jellyfin:latest docker-compose down docker-compose up -d
sudo apt-get update sudo apt-get install --only-upgrade jellyfin
sudo dnf upgrade jellyfin
إيقاف خدمة Jellyfin ```bash sudo systemctl stop jellyfin
التحقق من الاستغلال ```bash
ls -la /etc/ld.so.preload cat /etc/ld.so.preload
find /var/lib/jellyfin/subtitles -type f -newer /proc -ls
find /var/lib/jellyfin -type f -newermt "2026-04-14" -ls
تقييد صلاحية رفع الترجمة ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
تقسيم الشبكة ```
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
أذونات نظام الملفات ```bash
sudo usermod -s /usr/sbin/nologin jellyfin
sudo chmod 644 /etc/ld.so.preload sudo chmod 644 /etc/ld.so.conf
sudo chown -R jellyfin:jellyfin /var/lib/jellyfin sudo chmod 750 /var/lib/jellyfin
راقب محاولات الاستغلال ```bash
تنفيذ جدار حماية تطبيقات الويب (WAF) ``` Block requests containing:
تفعيل وحدة الأمان ```bash
sudo aa-enforce /etc/apparmor.d/usr.bin.java
sudo semanage fcontext -a -t jellyfin_home_t "/var/lib/jellyfin(/.*)?" sudo restorecon -R /var/lib/jellyfin
تشغيل Jellyfin كمستخدم غير root ```bash
sudo useradd -r -s /usr/sbin/nologin jellyfin
sudo sed -i 's/User=.*/User=jellyfin/' /etc/systemd/system/jellyfin.service sudo systemctl daemon-reload sudo systemctl restart jellyfin
تنفيذ النسخ الاحتياطي المنتظم ```bash
sudo crontab -e
curl -s http://localhost:8096/System/Info/Public | jq .Version
cat /etc/ld.so.preload | wc -l # Should be 0 or contain only legitimate entries
ps aux | grep jellyfin | grep -v grep
sudo ufw status
---
## المراجع
### المصادر الرسمية
- **قيد NVD:** https://nvd.nist.gov/vuln/detail/CVE-2026-35031
- **استشارة GitHub:** https://github.com/jellyfin/jellyfin/security/advisories/GHSA-9p5f-5x8v-x65m
- **إصدار Jellyfin v10.11.7:** https://github.com/jellyfin/jellyfin/releases/tag/v10.11.7
- **توثيق Jellyfin:** https://docs.jellyfin.org
### الثغرات والأبحاث ذات الصلة
- CWE-22: اجتياز المسار - https://cwe.mitre.org/data/definitions/22.html
- استغلال LD_PRELOAD: https://www.gnu.org/software/libc/manual/html_node/Dynamic-Linker.html
- أنماط تصعيد الامتيازات في عمليات Java
- مواصفات تنسيق ملفات الترجمة (معايير RFC)
### الأدوات والموارد الأمنية
- Nmap: https://nmap.org
- Metasploit Framework: https://www.metasploit.com
- دليل OWASP لاجتياز المسار: https://owasp.org/www-community/attacks/Path_Traversal
---
## المؤلف
**اكتُشفت الثغرة ووُثّقت بواسطة:**
**Kerem Oruc** (@keraattin)
- GitHub: https://github.com/keraattin
- Twitter/X: https://twitter.com/keraattin
### المساهمة
إذا كانت لديك تحسينات على هذه الوثائق أو أدوات الكشف، فيرجى تقديم طلب سحب (pull request) أو فتح مشكلة (issue).
---
**إخلاء مسؤولية:** هذه الوثيقة مخصصة للأغراض التعليمية واختبار الأمان المصرح به فقط. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. احصل دائمًا على التصريح المناسب قبل إجراء التقييمات الأمنية.
**آخر تحديث:** 2026-04-15 | **الحالة:** منشور
---
| الخاصية | القيمة |
|---|
| 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 |
| حالة التصحيح | متاح وتم إصداره |
| الاستغلال العام | نعم |
tail -f /var/log/jellyfin/jellyfin.log | grep -i subtitle
auditctl -w /etc/ld.so.preload -p wa -k ld_preload_changes
tar -tzf /backup/jellyfin-$(date +%Y%m%d).tar.gz > /dev/null
تمكين تسجيل التدقيق ```bash
auditctl -w /etc/ld.so.preload -p wa -k ld_preload_audit auditctl -w /var/lib/jellyfin -p wa -k jellyfin_audit
auditctl -a always,exit -F exe=/usr/bin/java -F arch=b64 -S execve -k jellyfin_exec