## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KERAATTIN-CVE-2026-35031
# CVE-2026-35031: Обход пути при загрузке субтитров в Jellyfin до удалённого выполнения кода
 -darkred?style=flat-square) -orange?style=flat-square)  
## TL;DR
Критическая уязвимость обхода пути в Jellyfin Media Server позволяет аутентифицированным пользователям с разрешением «Upload Subtitles» загружать файлы в произвольные места на диске. Используя непроверяемое поле Format в конечной точке загрузки субтитров, злоумышленники могут записывать файлы в чувствительные места, извлекать конфиденциальные данные, повышать привилегии и в конечном итоге выполнять произвольный код с правами root через внедрение LD_PRELOAD.
* **Оценка CVSS:** 9.9 (Критическая)
* **Затронутые версии:** Jellyfin < 10.11.7
* **Исправленная версия:** Jellyfin 10.11.7+
* **Требуется аутентификация:** Да (пользователь без прав администратора с разрешением на загрузку субтитров)
* **Удалённое выполнение кода:** Да, с правами root
* **Сложность эксплуатации:** Низкая
* * *
## Содержание
1. Краткие факты
2. Что такое Jellyfin?
3. Подробный разбор уязвимости
* Анализ первопричины
* Разбор цепочки атаки
* Эксплуатация LD_PRELOAD
4. Анализ влияния
5. Затронутые версии
6. Обнаружение
* Сканер на Python
* NSE-скрипт для Nmap
7. Индикаторы компрометации
8. Устранение
9. Ссылки
10. Автор
* * *
## Краткие факты
* * *
## Что такое Jellyfin?
Jellyfin — это бесплатный медиасервер с открытым исходным кодом, предназначенный для управления и потоковой передачи вашей личной медиаколлекции. Он предоставляет функциональность, аналогичную коммерческим медиасерверам, но с полной прозрачностью исходного кода и контролем сообщества.
### Ключевые возможности
* Потоковая передача медиа с собственного сервера (музыка, фильмы, телепередачи)
* Поддержка нескольких пользователей с детальным контролем разрешений
* Управление субтитрами и их синхронизация
* Веб-интерфейс, доступный через HTTP/HTTPS
* Кроссплатформенное развёртывание (Linux, Windows, macOS)
* Поддержка различных медиаформатов и потоковых протоколов
### Сетевая архитектура```
root@kitploit:~
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)
root@kitploit:~
---
## Глубокий анализ уязвимости
### Анализ первопричины
Уязвимость существует в конечной точке загрузки субтитров (`/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@kitploit:~
### Разбор цепочки атаки
Уязвимость связывает воедино несколько слабостей для достижения удалённого выполнения кода с правами 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)
root@kitploit:~
### Эксплуатация 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())
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
#### Почему LD_PRELOAD работает как повышение привилегий```
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
root@kitploit:~
---
## Анализ воздействия
### Конфиденциальность
**КРИТИЧЕСКИЙ** - Полное раскрытие информации
- Извлечение базы данных: учётные данные администратора, пароли пользователей, API-ключи
- Раскрытие файлов субтитров и метаданных медиа
- Доступ к конфигурационным файлам с чувствительными данными
- Сбор информации о системе для дальнейшей эксплуатации
### Целостность
**КРИТИЧЕСКИЙ** - Модификация файлов в масштабе всей системы
- Произвольная запись файлов в любое место на диске
- Модификация бинарных файлов приложения
- Внесение изменений в системную конфигурацию
- Повреждение или манипулирование базой данных
### Доступность
**КРИТИЧЕСКИЙ** - Нарушение обслуживания и отказ в работе
- Завершение работы или сбой системы через вредоносный .so в LD_PRELOAD
- Истощение дискового пространства через запись больших файлов
- Завершение процессов или истощение ресурсов
- Полная недоступность сервиса
### Затронутые компоненты
- Процесс Jellyfin Media Server (запускается от root в большинстве развёртываний)
- Ядро операционной системы и библиотеки
- Хранимые медиафайлы и метаданные
- Системы аутентификации пользователей
- Системные процессы, слинкованные с glibc
### Бизнес-влияние
- **Утечка данных:** Все сохранённые учётные данные и пользовательские данные скомпрометированы
- **Простой сервиса:** Jellyfin и, возможно, другие сервисы становятся недоступными
- **Боковое перемещение:** Скомпрометированная система становится точкой опоры для сетевых атак
- **Нарушение соответствия:** Нарушения GDPR, CCPA, HIPAA при раскрытии PII
- **Риск цепочки поставок:** Если Jellyfin обслуживает общий или корпоративный медиаконтент
---
## Затронутые версии
| Версия | Статус | Примечания |
|---------|--------|-------|
| < 10.8.0 | Уязвим | Присутствует исходная уязвимость |
| 10.8.0 - 10.11.6 | Уязвим | Возможны обход пути и RCE |
| 10.11.7+ | Исправлен | Поле Format корректно проверяется |
| 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
}
* * *
## Обнаружение
### Python-сканер
Скрипт `CVE-2026-35031_Jellyfin_RCE_detector.py` обеспечивает автоматическое обнаружение уязвимостей.
#### Установка и требования```bash
pip install requests urllib3
root@kitploit:~
#### Использование```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
root@kitploit:~
#### Пример вывода```
[*] 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
======================================================================
#### Логика обнаружения
Сканер выполняет следующие проверки:
1. **Обнаружение службы:** Подключается к целевому порту и проверяет HTTP-заголовки
2. **Проверка Jellyfin:** Запрашивает конечную точку `/System/Info/Public`
3. **Извлечение версии:** Извлекает поле `Version` из JSON-ответа
4. **Оценка уязвимости:** Сравнивает версию с патчем (10.11.7)
5. **Проверка конечной точки:** Подтверждает наличие конечной точки загрузки субтитров
6. **Расчёт риска:** Определяет уровень воздействия CVSS на основе версии
* * *
### NSE-скрипт Nmap
Скрипт `CVE-2026-35031_Jellyfin_RCE.nse` обеспечивает интеграцию с Nmap для сканирования уязвимостей.
#### Установка```bash
# Copy to Nmap scripts directory
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
# Update Nmap database
sudo nmap --script-updatedb
root@kitploit:~
#### Использование```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
root@kitploit:~
#### Параметры скрипта```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
root@kitploit:~
**Системные журналы** (`/var/log/syslog` or `/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
root@kitploit:~
**Подозрительные пути к файлам в каталоге субтитров**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
### Сетевые индикаторы
**Подозрительные HTTP-запросы** ``` POST /Videos/[0-9]+/Subtitles
* Format parameter contains: /.. or ..\ patterns
* Format parameter contains absolute paths starting with /
* Format parameter does not match known subtitle formats
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
root@kitploit:~
**Исходящие соединения от процесса 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
root@kitploit:~
### Индикаторы базы данных
**Изменения базы данных 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
* * *
## Устранение
### Немедленные действия (Приоритет: КРИТИЧЕСКИЙ)
1. **Немедленно обновите Jellyfin** ```bash
# Docker deployment
docker pull jellyfin/jellyfin:latest docker-compose down docker-compose up -d
# Package manager (Ubuntu/Debian)
sudo apt-get update sudo apt-get install --only-upgrade jellyfin
# Package manager (Fedora/RHEL)
sudo dnf upgrade jellyfin
root@kitploit:~
2. **Остановите службу Jellyfin** ```bash sudo systemctl stop jellyfin
root@kitploit:~
3. **Проверка эксплуатации** ```bash
# Check if ld.so.preload was modified
ls -la /etc/ld.so.preload cat /etc/ld.so.preload
# Check subtitle directory for suspicious files
find /var/lib/jellyfin/subtitles -type f -newer /proc -ls
# Check Jellyfin data directory
find /var/lib/jellyfin -type f -newermt "2026-04-14" -ls
root@kitploit:~
### Краткосрочные меры (Приоритет: ВЫСОКИЙ)
1. **Ограничить разрешение на загрузку субтитров** ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
root@kitploit:~
2. **Сегментация сети** ```
# Only allow trusted networks to access Jellyfin
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
root@kitploit:~
3. **Права файловой системы** ```bash
# Ensure Jellyfin runs with minimal privileges
sudo usermod -s /usr/sbin/nologin jellyfin
# Restrict ld.so.preload permissions
sudo chmod 644 /etc/ld.so.preload sudo chmod 644 /etc/ld.so.conf
# Set proper permissions on Jellyfin directory
sudo chown -R jellyfin:jellyfin /var/lib/jellyfin sudo chmod 750 /var/lib/jellyfin
root@kitploit:~
4. **Отслеживание попыток эксплуатации** ```bash
# Watch subtitle upload endpoint logs
### Долгосрочное укрепление (Приоритет: MEDIUM)
1. **Внедрите межсетевой экран веб-приложений (WAF)** ``` Block requests containing:
* Path traversal patterns: ../ ..\ ..\
* Suspicious file paths: /etc/ /root/ /proc/
* Encoded variations: %2e%2e%2f
root@kitploit:~
2. **Включите модуль безопасности** ```bash
# AppArmor (Ubuntu/Debian)
sudo aa-enforce /etc/apparmor.d/usr.bin.java
# SELinux (Fedora/RHEL)
sudo semanage fcontext -a -t jellyfin_home_t "/var/lib/jellyfin(/.*)?" sudo restorecon -R /var/lib/jellyfin
root@kitploit:~
3. **Запуск Jellyfin от имени не-root пользователя** ```bash
# Create dedicated user if not exists
sudo useradd -r -s /usr/sbin/nologin jellyfin
# Update systemd service
sudo sed -i 's/User=.*/User=jellyfin/' /etc/systemd/system/jellyfin.service sudo systemctl daemon-reload sudo systemctl restart jellyfin
root@kitploit:~
4. **Выполняйте регулярное резервное копирование** ```bash
# Automated daily backups
sudo crontab -e
# 0 2 * * * /usr/local/bin/jellyfin-backup.sh
### Этапы проверки```bash
# 1\. Verify Jellyfin version after upgrade
curl -s http://localhost:8096/System/Info/Public | jq .Version
# 2\. Confirm no unauthorized ld.so.preload entries
cat /etc/ld.so.preload | wc -l # Should be 0 or contain only legitimate entries
# 3\. Check Jellyfin process permissions
ps aux | grep jellyfin | grep -v grep
# 4\. Verify subnet connectivity restrictions
sudo ufw status
# 5\. Test subtitle upload with non-admin user (should work normally)
# Try uploading a legitimate .srt file and confirm it's stored correctly
root@kitploit:~
---
## Ссылки
### Официальные источники
- **Запись 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: Path Traversal - 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 по Path Traversal: 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 | **Статус:** ОПУБЛИКОВАНО