
Vulnerabilidade crítica de path traversal para RCE no Jellyfin Media Server (CVSS 9.9). Inclui exploit de prova de conceito, análise técnica e ferramentas de detecção.
Uma vulnerabilidade crítica de path traversal no Jellyfin Media Server permite que utilizadores autenticados com permissão "Upload de Legendas" carreguem ficheiros para localizações arbitrárias no disco. Ao explorar o campo Format não validado no endpoint de upload de legendas, atacantes podem escrever ficheiros em locais sensíveis, extrair dados confidenciais, escalar privilégios e, por fim, executar código arbitrário como root através de injeção LD_PRELOAD.
O Jellyfin é um servidor de multimédia gratuito e de código aberto concebido para ajudar a gerir e transmitir a sua coleção pessoal de multimédia. Fornece funcionalidades semelhantes a servidores de multimédia comerciais, mas com total transparência do código-fonte e controlo da comunidade.
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)
---
## Análise Aprofundada da Vulnerabilidade
### Análise da Causa Raiz
A vulnerabilidade existe no endpoint de upload de legendas (`/Videos/{itemId}/Subtitles`) que aceita uploads de arquivos e os armazena em disco. A falha crítica reside na validação insuficiente do parâmetro do campo Format.
#### Padrão de Código Vulnerável
O endpoint processa uploads de legendas sem validar ou sanitizar adequadamente o campo Format:```
POST /Videos/{itemId}/Subtitles HTTP/1.1
Content-Type: multipart/form-data
[Binary subtitle data]
Format: /../../../etc/ld.so.preload
Language: en
O parâmetro Format serve para especificar o formato da legenda (srt, vtt, ass, etc.), mas em vez disso é tratado como parte do caminho do arquivo:``` 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)
### Análise da Cadeia de Ataque
A vulnerabilidade combina múltiplas fraquezas para alcançar execução remota de código como 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)
### Exploração LD_PRELOAD
A técnica LD_PRELOAD é um poderoso método de escalada de privilégios e execução de código em sistemas 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
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
---
## Análise de Impacto
### Confidencialidade
**CRÍTICO** - Divulgação completa de informações
- Extração de banco de dados: credenciais de administrador, senhas de usuários, chaves de API
- Exposição de arquivos de legenda e metadados de mídia
- Acesso a arquivos de configuração com dados sensíveis
- Coleta de informações do sistema para exploração adicional
### Integridade
**CRÍTICO** - Modificação de arquivos em todo o sistema
- Escrita arbitrária de arquivos em qualquer local do disco
- Modificação de binários da aplicação
- Adulteração de configurações do sistema
- Corrupção ou manipulação de banco de dados
### Disponibilidade
**CRÍTICO** - Interrupção e negação de serviço
- Desligamento ou travamento do sistema via .so malicioso em LD_PRELOAD
- Exaustão de espaço em disco através de gravações de arquivos grandes
- Eliminação de processos ou falta de recursos
- Indisponibilidade completa do serviço
### Componentes Afetados
- Processo do Jellyfin Media Server (executando como root na maioria das implantações)
- Kernel e bibliotecas do sistema operacional
- Mídia e metadados armazenados
- Sistemas de autenticação de usuário
- Processos em todo o sistema vinculados à glibc
### Impacto nos Negócios
- **Violação de Dados:** Todas as credenciais armazenadas e dados de usuário comprometidos
- **Indisponibilidade de Serviço:** Jellyfin e potencialmente outros serviços ficam indisponíveis
- **Movimentação Lateral:** Sistema comprometido se torna ponto de pivô para ataques de rede
- **Violação de Conformidade:** Violações de GDPR, CCPA, HIPAA se dados pessoais forem expostos
- **Risco na Cadeia de Suprimentos:** Se o Jellyfin atender mídia compartilhada ou empresarial
---
## Versões Afetadas
| Versão | Status | Notas |
|--------|--------|-------|
| < 10.8.0 | Vulnerável | Vulnerabilidade original presente |
| 10.8.0 - 10.11.6 | Vulnerável | Path traversal e RCE possíveis |
| 10.11.7+ | Corrigido | Campo de formato validado corretamente |
| 10.12.0+ | Corrigido | Versão mais recente com correções de segurança |
### Detecção de Versão
A vulnerabilidade pode ser detectada verificando a string de versão a partir do endpoint `/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
}
O script CVE-2026-35031_Jellyfin_RCE_detector.py fornece detecção automatizada de vulnerabilidades.
pip install requests urllib3
#### Uso```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
#### Exemplo de Saída```
[*] 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
======================================================================
O scanner realiza as seguintes verificações:
/System/Info/PublicVersion da resposta JSONO script CVE-2026-35031_Jellyfin_RCE.nse oferece integração com o Nmap para varredura de vulnerabilidades.
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
#### Uso```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
#### Parâmetros do Script```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
Logs do Servidor 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
**Logs do Sistema** (`/var/log/syslog` ou `/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
Ficheiros do Sistema Modificados``` /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
**Caminhos de Arquivo Suspeitos no Diretório de Legendas**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
Requisições HTTP Suspeitas``` POST /Videos/[0-9]+/Subtitles
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
**Conexões de Saída do Processo 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
Anomalias no Processo 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
### Indicadores de Banco de Dados
**Alterações no Banco de Dados do 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
Atualize o Jellyfin Imediatamente ```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
Parar o Serviço do Jellyfin ```bash sudo systemctl stop jellyfin
Verificar Exploração ```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
Restringir Permissão de Upload de Legendas ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
Segmentação de Rede ```
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
Permissões do Sistema de Arquivos ```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
Monitorar tentativas de exploração ```bash
Implementar Firewall de Aplicação Web (WAF) ``` Block requests containing:
Ativar Módulo de Segurança ```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
Executar o Jellyfin como usuário não 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
Implementar backups regulares ```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
---
## Referências
### Fontes Oficiais
- **Entrada NVD:** https://nvd.nist.gov/vuln/detail/CVE-2026-35031
- **Aviso do GitHub:** https://github.com/jellyfin/jellyfin/security/advisories/GHSA-9p5f-5x8v-x65m
- **Lançamento Jellyfin v10.11.7:** https://github.com/jellyfin/jellyfin/releases/tag/v10.11.7
- **Documentação Jellyfin:** https://docs.jellyfin.org
### Vulnerabilidades e Pesquisas Relacionadas
- CWE-22: Travessia de Caminho - https://cwe.mitre.org/data/definitions/22.html
- Exploração de LD_PRELOAD: https://www.gnu.org/software/libc/manual/html_node/Dynamic-Linker.html
- Padrões de Escalonamento de Privilégios em Processos Java
- Especificações de Formatos de Arquivos de Legendas (padrões RFC)
### Ferramentas e Recursos de Segurança
- Nmap: https://nmap.org
- Metasploit Framework: https://www.metasploit.com
- Guia de Travessia de Caminho da OWASP: https://owasp.org/www-community/attacks/Path_Traversal
---
## Autor
**Vulnerabilidade Descoberta e Documentada Por:**
**Kerem Oruc** (@keraattin)
- GitHub: https://github.com/keraattin
- Twitter/X: https://twitter.com/keraattin
### Contribuição
Se você tiver melhorias para esta documentação ou ferramentas de detecção, por favor, envie um pull request ou abra uma issue.
---
**Aviso:** Este documento é apenas para fins educacionais e de testes de segurança autorizados. O acesso não autorizado a sistemas de computador é ilegal. Sempre obtenha a devida autorização antes de realizar avaliações de segurança.
**Última atualização:** 2026-04-15 | **Status:** PUBLISHED
| Propriedade | Valor |
|---|
| ID CVE | CVE-2026-35031 |
| Pontuação CVSS | 9.9 (Crítico) |
| CWE | CWE-22: Limitação Incorreta de um Nome de Caminho para um Diretório Restrito ('Path Traversal') |
| Produto Afetado | Jellyfin Media Server |
| Versões Afetadas | < 10.11.7 |
| Versão Corrigida | 10.11.7 e posteriores |
| Tipo de Vulnerabilidade | Path Traversal + Escrita Arbitrária de Ficheiros + RCE |
| Autenticação Necessária | Sim (utilizador não administrador) |
| Privilégios Necessários | Permissão "Upload de Legendas" |
| Porta Padrão | 8096/TCP |
| Aviso GitHub | GHSA-9p5f-5x8v-x65m |
| Estado do Patch | Disponível e lançado |
| Exploit Público | Sim |
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
Ativar Registro de Auditoria ```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