
Vulnerabilità critica di path traversal che consente RCE in Jellyfin Media Server (CVSS 9.9). Include exploit proof-of-concept, analisi tecnica e strumenti di rilevamento.
Una vulnerabilità critica di path traversal in Jellyfin Media Server consente agli utenti autenticati con il permesso "Upload Subtitles" di caricare file in posizioni arbitrarie del disco. Sfruttando il campo Format non validato nell'endpoint di caricamento dei sottotitoli, gli attaccanti possono scrivere file in posizioni sensibili, estrarre dati sensibili, aumentare i propri privilegi e infine eseguire codice arbitrario come root tramite l'iniezione LD_PRELOAD.
Jellyfin è un server multimediale gratuito e open source progettato per aiutarti a gestire e riprodurre in streaming la tua collezione personale di contenuti multimediali. Offre funzionalità simili ai server multimediali commerciali, ma con piena trasparenza del codice sorgente e controllo da parte della community.
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)
---
## Analisi Approfondita della Vulnerabilità
### Analisi della Causa Radice
La vulnerabilità è presente nell'endpoint di caricamento dei sottotitoli (`/Videos/{itemId}/Subtitles`) che accetta il caricamento di file e li memorizza su disco. Il difetto critico risiede nella validazione insufficiente del parametro del campo Format.
#### Schema di Codice Vulnerabile
L'endpoint elabora i caricamenti di sottotitoli senza validare o sanificare adeguatamente il campo Format:```
POST /Videos/{itemId}/Subtitles HTTP/1.1
Content-Type: multipart/form-data
[Binary subtitle data]
Format: /../../../etc/ld.so.preload
Language: en
Il parametro Format è pensato per specificare il formato dei sottotitoli (srt, vtt, ass, ecc.) ma viene invece trattato come parte del percorso del file:``` 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)
### Analisi della catena di attacco
La vulnerabilità combina più debolezze per ottenere l'esecuzione remota di codice come 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)
### Sfruttamento di LD_PRELOAD
La tecnica LD_PRELOAD è un potente metodo di escalation dei privilegi ed esecuzione di codice sui sistemi 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
---
## Analisi dell'Impatto
### Riservatezza
**CRITICO** - Divulgazione completa delle informazioni
- Estrazione del database: credenziali di amministratore, password utente, chiavi API
- Esposizione di file di sottotitoli e metadati dei media
- Accesso ai file di configurazione con dati sensibili
- Raccolta di informazioni di sistema per ulteriori sfruttamenti
### Integrità
**CRITICO** - Modifica di file a livello di sistema
- Scrittura arbitraria di file in qualsiasi posizione del disco
- Modifica dei binari dell'applicazione
- Manomissione della configurazione di sistema
- Corruzione o manipolazione del database
### Disponibilità
**CRITICO** - Interruzione del servizio e denial of service
- Spegnimento o crash del sistema tramite .so dannoso in LD_PRELOAD
- Esaurimento dello spazio su disco tramite scritture di file di grandi dimensioni
- Terminazione dei processi o esaurimento delle risorse
- Indisponibilità completa del servizio
### Componenti Interessati
- Processo di Jellyfin Media Server (in esecuzione come root nella maggior parte degli ambienti)
- Kernel e librerie del sistema operativo
- Media e metadati archiviati
- Sistemi di autenticazione utente
- Processi a livello di sistema collegati a glibc
### Impatto Aziendale
- **Violazione dei dati:** Tutte le credenziali memorizzate e i dati utente compromessi
- **Interruzione del servizio:** Jellyfin e potenzialmente altri servizi diventano indisponibili
- **Movimento laterale:** Il sistema compromesso diventa punto di appoggio per attacchi alla rete
- **Violazione della conformità:** Violazioni di GDPR, CCPA, HIPAA se i dati personali (PII) vengono esposti
- **Rischio della supply chain:** Se Jellyfin serve media condivisi o aziendali
---
## Versioni Interessate
| Versione | Stato | Note |
|---------|--------|-------|
| < 10.8.0 | Vulnerabile | Vulnerabilità originale presente |
| 10.8.0 - 10.11.6 | Vulnerabile | Path traversal e RCE possibili |
| 10.11.7+ | Corretta | Campo format validato correttamente |
| 10.12.0+ | Corretta | Versione più recente con correzioni di sicurezza |
### Rilevamento della Versione
La vulnerabilità può essere rilevata controllando la stringa della versione dall'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
}
Lo script CVE-2026-35031_Jellyfin_RCE_detector.py fornisce il rilevamento automatizzato delle vulnerabilità.
pip install requests urllib3
#### Utilizzo```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
#### Output di esempio```
[*] 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
======================================================================
Lo scanner esegue i seguenti controlli:
/System/Info/PublicVersion dalla risposta JSONLo script CVE-2026-35031_Jellyfin_RCE.nse fornisce l'integrazione con Nmap per la scansione delle vulnerabilità.
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
#### Utilizzo```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
#### Parametri dello 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
Log di Jellyfin Server (/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
**Log di sistema** (`/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
File di sistema modificati``` /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
**Percorsi file sospetti nella directory dei sottotitoli**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
Richieste HTTP sospette``` POST /Videos/[0-9]+/Subtitles
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
**Connessioni in uscita dal 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
Anomalie del 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
### Indicatori del Database
**Modifiche al database di 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
Aggiorna Jellyfin Immediatamente ```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
Ferma il servizio Jellyfin ```bash sudo systemctl stop jellyfin
Verifica lo sfruttamento ```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
Limitare il permesso di caricamento dei sottotitoli ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
Segmentazione della rete ```
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
Permessi del file system ```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
Monitora i tentativi di sfruttamento ```bash
Implementare un Web Application Firewall (WAF) ``` Block requests containing:
Abilita il modulo di sicurezza ```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
Esegui Jellyfin come utente non-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
Implementare backup regolari ```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
---
## Riferimenti
### Fonti ufficiali
- **Voce NVD:** https://nvd.nist.gov/vuln/detail/CVE-2026-35031
- **Avviso GitHub:** https://github.com/jellyfin/jellyfin/security/advisories/GHSA-9p5f-5x8v-x65m
- **Rilascio Jellyfin v10.11.7:** https://github.com/jellyfin/jellyfin/releases/tag/v10.11.7
- **Documentazione Jellyfin:** https://docs.jellyfin.org
### Vulnerabilità e ricerche correlate
- CWE-22: Path Traversal - https://cwe.mitre.org/data/definitions/22.html
- Sfruttamento di LD_PRELOAD: https://www.gnu.org/software/libc/manual/html_node/Dynamic-Linker.html
- Pattern di escalation dei privilegi dei processi Java
- Specifiche dei formati dei file di sottotitoli (standard RFC)
### Strumenti e risorse di sicurezza
- Nmap: https://nmap.org
- Metasploit Framework: https://www.metasploit.com
- Guida OWASP al Path Traversal: https://owasp.org/www-community/attacks/Path_Traversal
---
## Autore
**Vulnerabilità scoperta e documentata da:**
**Kerem Oruc** (@keraattin)
- GitHub: https://github.com/keraattin
- Twitter/X: https://twitter.com/keraattin
### Contributo
Se hai miglioramenti per questa documentazione o per gli strumenti di rilevamento, invia una pull request o apri una issue.
---
**Dichiarazione di non responsabilità:** Questo documento è solo a scopo educativo e di test di sicurezza autorizzati. L'accesso non autorizzato a sistemi informatici è illegale. Ottieni sempre la dovuta autorizzazione prima di condurre valutazioni di sicurezza.
**Ultimo aggiornamento:** 2026-04-15 | **Stato:** PUBBLICATO
| Proprietà | Valore |
|---|
| ID CVE | CVE-2026-35031 |
| Punteggio CVSS | 9.9 (Critico) |
| CWE | CWE-22: Limitazione impropria del nome di un percorso a una directory ristretta ('Path Traversal') |
| Prodotto interessato | Jellyfin Media Server |
| Versioni interessate | < 10.11.7 |
| Versione corretta | 10.11.7 e successive |
| Tipo di vulnerabilità | Path Traversal + Scrittura arbitraria di file + RCE |
| Autenticazione richiesta | Sì (utente non amministratore) |
| Privilegi richiesti | Permesso "Upload Subtitles" |
| Porta predefinita | 8096/TCP |
| Advisory GitHub | GHSA-9p5f-5x8v-x65m |
| Stato della patch | Disponibile e rilasciata |
| Exploit pubblico | Sì |
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
Abilita la registrazione di controllo ```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