
Критическая уязвимость обхода пути, приводящая к удалённому выполнению кода (RCE) в Jellyfin Media Server (CVSS 9.9). Включает PoC-эксплойт, технический анализ и инструменты обнаружения.
Критическая уязвимость обхода пути в 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 — это мощный метод повышения привилегий и выполнения кода в Linux-системах:```
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())