
Kritische Path-Traversal-zu-RCE-Sicherheitslücke in Jellyfin Media Server (CVSS 9.9). Enthält Proof-of-Concept-Exploit, technische Analyse und Erkennungstools.
Eine kritische Path-Traversal-Schwachstelle im Jellyfin Media Server ermöglicht es authentifizierten Benutzern mit der Berechtigung „Untertitel hochladen“, Dateien an beliebige Speicherorte auf der Festplatte hochzuladen. Durch die Ausnutzung des nicht validierten Format-Feldes im Untertitel-Upload-Endpunkt können Angreifer Dateien an sensible Speicherorte schreiben, vertrauliche Daten extrahieren, ihre Privilegien ausweiten und letztendlich beliebigen Code als root mittels LD_PRELOAD-Injection ausführen.
Jellyfin ist ein freier und quelloffener Medienserver, der entwickelt wurde, um Ihnen beim Verwalten und Streamen Ihrer persönlichen Mediensammlung zu helfen. Es bietet ähnliche Funktionalitäten wie kommerzielle Medienserver, jedoch mit vollständiger Quellcode-Transparenz und Community-Kontrolle.
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)
---
## Sicherheitslücke im Detail
### Ursachenanalyse
Die Sicherheitslücke existiert im Untertitel-Upload-Endpunkt (`/Videos/{itemId}/Subtitles`), der Datei-Uploads akzeptiert und auf der Festplatte speichert. Der kritische Fehler liegt in der unzureichenden Validierung des Format-Feldparameters.
#### Verwundbares Codemuster
Der Endpunkt verarbeitet Untertitel-Uploads, ohne das Format-Feld ordnungsgemäß zu validieren oder zu bereinigen:```
POST /Videos/{itemId}/Subtitles HTTP/1.1
Content-Type: multipart/form-data
[Binary subtitle data]
Format: /../../../etc/ld.so.preload
Language: en
Der Format-Parameter soll das Untertitelformat (srt, vtt, ass usw.) angeben, wird aber stattdessen als Teil des Dateipfads behandelt:``` 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)
### Angriffsketten-Aufschlüsselung
Die Sicherheitslücke verknüpft mehrere Schwachstellen, um eine Remote-Code-Ausführung als Root zu erreichen:```
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-Ausnutzung
Die LD_PRELOAD-Technik ist eine leistungsstarke Methode zur Privilegieneskalation und Codeausführung auf Linux-Systemen:```
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
---
## Auswirkungsanalyse
### Vertraulichkeit
**KRITISCH** - Vollständige Offenlegung von Informationen
- Datenbankextraktion: Admin-Anmeldedaten, Benutzerpasswörter, API-Schlüssel
- Offenlegung von Untertiteldateien und Metadaten von Medien
- Zugriff auf Konfigurationsdateien mit sensiblen Daten
- Systeminformationen für weitere Ausnutzung sammeln
### Integrität
**KRITISCH** - Systemweite Dateimodifikation
- Beliebiges Dateischreiben an jede Stelle auf der Festplatte
- Modifikation von Anwendungsbinärdateien
- Manipulation von Systemkonfigurationen
- Datenbankkorruption oder -manipulation
### Verfügbarkeit
**KRITISCH** - Dienstunterbrechung und -verweigerung
- Systemabschaltung oder -absturz durch bösartige .so in LD_PRELOAD
- Festplattenüberlastung durch große Dateischreibvorgänge
- Prozessabbrüche oder Ressourcenauszehrung
- Vollständige Dienstunverfügbarkeit
### Betroffene Komponenten
- Jellyfin Media Server-Prozess (läuft in den meisten Bereitstellungen als root)
- Betriebssystemkernel und -bibliotheken
- Gespeicherte Medien und Metadaten
- Benutzerauthentifizierungssysteme
- Systemweite Prozesse, die gegen glibc gelinkt sind
### Geschäftsauswirkungen
- **Datenverletzung:** Alle gespeicherten Anmeldedaten und Benutzerdaten sind kompromittiert
- **Dienstausfall:** Jellyfin und potenziell andere Dienste werden unverfügbar
- **Seitwärtsbewegung:** Das kompromittierte System wird zum Angriffspunkt für Netzwerkangriffe
- **Compliance-Verstoß:** Verstöße gegen DSGVO, CCPA, HIPAA, wenn personenbezogene Daten offengelegt werden
- **Lieferkettenrisiko:** Wenn Jellyfin gemeinsam genutzte oder Unternehmensmedien bereitstellt
---
## Betroffene Versionen
| Version | Status | Anmerkungen |
|---------|--------|-------------|
| < 10.8.0 | Anfällig | Ursprüngliche Schwachstelle vorhanden |
| 10.8.0 - 10.11.6 | Anfällig | Pfadnavigation und RCE möglich |
| 10.11.7+ | Gepatched | Formatfeld ordnungsgemäß validiert |
| 10.12.0+ | Gepatched | Neueste Version mit Sicherheitskorrekturen |
### Versionserkennung
Die Schwachstelle kann durch Überprüfung des Versionsstrings vom Endpunkt `/System/Info/Public` erkannt werden:```
GET /System/Info/Public HTTP/1.1
Host: jellyfin-server:8096
Response:
{
"ServerName": "MyJellyfin",
"Version": "10.10.3", < Vulnerable
"ProductName": "Jellyfin",
"StartupWizardCompleted": true
}
Das Skript CVE-2026-35031_Jellyfin_RCE_detector.py bietet eine automatisierte Schwachstellenerkennung.
pip install requests urllib3
#### Verwendung```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
#### Beispielausgabe```
[*] 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
======================================================================
Der Scanner führt die folgenden Prüfungen durch:
/System/Info/Public abVersion-Feld aus der JSON-AntwortDas Skript CVE-2026-35031_Jellyfin_RCE.nse bietet eine Integration mit Nmap für das Scannen von Schwachstellen.
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
#### Verwendung```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
#### Skriptparameter```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-Serverprotokolle (/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
**Systemprotokolle** (`/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
Geänderte Systemdateien``` /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
**Verdächtige Dateipfade im Untertitelverzeichnis**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
Verdächtige HTTP-Anfragen``` POST /Videos/[0-9]+/Subtitles
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
**Ausgehende Verbindungen vom Jellyfin-Prozess**```
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-Prozessanomalien``` 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
### Datenbankindikatoren
**Jellyfin-Datenbankänderungen** (`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
Jellyfin sofort aktualisieren ```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
Jellyfin-Dienst stoppen ```bash sudo systemctl stop jellyfin
Auf Ausnutzung prüfen ```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
Berechtigung zum Hochladen von Untertiteln einschränken ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
Netzwerksegmentierung ```
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
Dateisystemberechtigungen ```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
Überwachung auf Ausnutzungsversuche ```bash
Web Application Firewall (WAF) implementieren ``` Block requests containing:
Sicherheitsmodul aktivieren ```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
Jellyfin als Nicht-Root-Benutzer ausführen ```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
Regelmäßige Backups implementieren ```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
---
## Referenzen
### Offizielle Quellen
- **NVD-Eintrag:** https://nvd.nist.gov/vuln/detail/CVE-2026-35031
- **GitHub-Sicherheitshinweis:** https://github.com/jellyfin/jellyfin/security/advisories/GHSA-9p5f-5x8v-x65m
- **Jellyfin-Release v10.11.7:** https://github.com/jellyfin/jellyfin/releases/tag/v10.11.7
- **Jellyfin-Dokumentation:** https://docs.jellyfin.org
### Verwandte Schwachstellen und Forschung
- CWE-22: Path Traversal - https://cwe.mitre.org/data/definitions/22.html
- LD_PRELOAD-Ausnutzung: https://www.gnu.org/software/libc/manual/html_node/Dynamic-Linker.html
- Muster zur Privilegienausweitung von Java-Prozessen
- Spezifikationen für Untertitel-Dateiformate (RFC-Standards)
### Sicherheitswerkzeuge und Ressourcen
- Nmap: https://nmap.org
- Metasploit Framework: https://www.metasploit.com
- OWASP Path Traversal Guide: https://owasp.org/www-community/attacks/Path_Traversal
---
## Autor
**Schwachstelle entdeckt und dokumentiert von:**
**Kerem Oruc** (@keraattin)
- GitHub: https://github.com/keraattin
- Twitter/X: https://twitter.com/keraattin
### Beitrag
Wenn Sie Verbesserungen an dieser Dokumentation oder an den Erkennungswerkzeugen haben, reichen Sie bitte einen Pull-Request ein oder eröffnen Sie ein Issue.
---
**Haftungsausschluss:** Dieses Dokument dient nur zu Bildungszwecken und autorisierten Sicherheitstests. Unautorisierter Zugriff auf Computersysteme ist illegal. Holen Sie immer die entsprechende Genehmigung ein, bevor Sie Sicherheitsbewertungen durchführen.
**Zuletzt aktualisiert:** 2026-04-15 | **Status:** PUBLISHED
| Eigenschaft | Wert |
|---|
| CVE-ID | CVE-2026-35031 |
| CVSS-Score | 9.9 (Kritisch) |
| CWE | CWE-22: Unzureichende Einschränkung eines Pfadnamens zu einem eingeschränkten Verzeichnis ('Path Traversal') |
| Betroffenes Produkt | Jellyfin Media Server |
| Betroffene Versionen | < 10.11.7 |
| Behobene Version | 10.11.7 und später |
| Schwachstellentyp | Path Traversal + Beliebiges Dateischreiben + RCE |
| Authentifizierung erforderlich | Ja (Nicht-Admin-Benutzer) |
| Erforderliche Berechtigungen | „Untertitel hochladen“ |
| Standardport | 8096/TCP |
| GitHub Advisory | GHSA-9p5f-5x8v-x65m |
| Patch-Status | Verfügbar und veröffentlicht |
| Exploit öffentlich | Ja |
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
Audit-Logging aktivieren ```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