Sploitus

Exploit for CVE-2026-35031

kitploit · 2026-09-04

Exploit Code

MARKDOWN649 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-KERAATTIN-CVE-2026-35031
# CVE-2026-35031: Обход пути при загрузке субтитров в Jellyfin до удалённого выполнения кода

![CVE-ID](https://img.shields.io/badge/CVE-2026--35031-red?style=flat-square) ![CVSS Score](https://img.shields.io/badge/CVSS-9.9%20\(Critical\)-darkred?style=flat-square) ![CWE](https://img.shields.io/badge/CWE-CWE--22%20\(Path%20Traversal\)-orange?style=flat-square) ![Affected Product](https://img.shields.io/badge/Product-Jellyfin%20Media%20Server-blue?style=flat-square) ![Status](https://img.shields.io/badge/Status-FIXED-brightgreen?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 | **Статус:** ОПУБЛИКОВАНО