
Jellyfin Media Serverにおける重大なパストラバーサルからRCEに至る脆弱性(CVSS 9.9)。概念実証エクスプロイト、技術分析、および検出ツールを含みます。
Jellyfin Media Server における深刻なパストラバーサル脆弱性により、認証済みユーザーは「字幕をアップロード」権限を持つ場合、ディスク上の任意の場所にファイルをアップロードできます。字幕アップロードエンドポイントの検証されていない Format フィールドを悪用することで、攻撃者は機密性の高い場所にファイルを書き込み、機密データを取得し、権限を昇格させ、最終的に LD_PRELOAD インジェクションを介して root として任意のコードを実行できます。
Jellyfin は、個人のメディアコレクションを管理およびストリーミングするためのフリーかつオープンソースのメディアサーバーです。商用メディアサーバーと同様の機能を提供しますが、ソースコードが完全に公開され、コミュニティによって管理されています。
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)
---
## 脆弱性の深掘り
### 根本原因分析
この脆弱性は、字幕アップロードエンドポイント(`/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
The Format parameter is intended to specify subtitle format (srt, vtt, ass, etc.) but instead gets treated as part of the file path:``` 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としてのリモートコード実行を達成します:```
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 の悪用
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
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
---
## 影響分析
### 機密性
**重大** - 完全な情報漏えい
- データベースの抽出:管理者資格情報、ユーザーパスワード、APIキー
- 字幕ファイルとメディアメタデータの露出
- 機密データを含む設定ファイルへのアクセス
- さらなる悪用のためのシステム情報収集
### 完全性
**重大** - システム全体のファイル改ざん
- ディスク上の任意の場所への任意のファイル書き込み
- アプリケーションバイナリの改変
- システム設定の改ざん
- データベースの破損または操作
### 可用性
**重大** - サービスの中断と拒否
- LD_PRELOAD 内の悪意のある .so によるシステムシャットダウンまたはクラッシュ
- 大規模なファイル書き込みによるディスク容量の枯渇
- プロセスの強制終了またはリソースの枯渇
- 完全なサービス利用不可
### 影響を受けるコンポーネント
- Jellyfin Media Server プロセス(ほとんどのデプロイメントで root として実行)
- OS カーネルとライブラリ
- 保存されたメディアとメタデータ
- ユーザー認証システム
- glibc にリンクされたシステム全体のプロセス
### ビジネスへの影響
- **データ侵害:** 保存されているすべての資格情報とユーザーデータが侵害される
- **サービス停止:** Jellyfin および他のサービスが利用できなくなる可能性がある
- **横展開:** 侵害されたシステムがネットワーク攻撃の踏み台になる
- **コンプライアンス違反:** PII が露出した場合、GDPR、CCPA、HIPAA 違反
- **サプライチェーンリスク:** Jellyfin が共有またはエンタープライズメディアを配信する場合
---
## 影響を受けるバージョン
| Version | Status | Notes |
|---------|--------|-------|
| < 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
}
CVE-2026-35031_Jellyfin_RCE_detector.py スクリプトは、自動化された脆弱性検出を提供します。
pip install requests urllib3
#### 使用方法```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
#### 出力例```
[*] 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
======================================================================
スキャナーは以下のチェックを実行します:
/System/Info/Public エンドポイントを照会しますVersion フィールドを解析しますCVE-2026-35031_Jellyfin_RCE.nse スクリプトは、脆弱性スキャンのためにNmapとの統合を提供します。
sudo cp CVE-2026-35031_Jellyfin_RCE.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
#### 使用方法```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
#### スクリプトパラメータ```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
**システムログ** (`/var/log/syslog` または `/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
**字幕ディレクトリ内の不審なファイルパス**```
/../../../etc/ld.so.preload
/../../../root/.ssh/authorized_keys
/../../../var/lib/jellyfin/jellyfin.db
../../../proc/self/environ
不審なHTTPリクエスト``` POST /Videos/[0-9]+/Subtitles
Encoded Payloads: %2e%2e%2f (URL encoded ../) ..%252f (Double encoded ../) ....// (Bypass patterns)
**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
### データベースインジケーター
**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
Jellyfin を直ちにアップグレード ```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 サービスを停止する ```bash sudo systemctl stop jellyfin
悪用の確認 ```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
字幕アップロード権限の制限 ``` Jellyfin Web UI > Settings > Users Disable "Upload Subtitles" for all non-admin users Review all users with this permission
ネットワーク分離 ```
sudo ufw allow from 192.168.1.0/24 to any port 8096 sudo ufw deny from any to any port 8096
ファイルシステムの権限 ```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
エクスプロイト試行を監視する ```bash
tail -f /var/log/jellyfin/jellyfin.log | grep -i subtitle
Web Application Firewall (WAF) を実装する ``` Block requests containing:
セキュリティモジュールを有効にする ```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 を非 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
定期的なバックアップを実施する ```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
---
## 参考文献
### 公式情報源
- **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: パストラバーサル - 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 パストラバーサルガイド: https://owasp.org/www-community/attacks/Path_Traversal
---
## 著者
**脆弱性の発見および文書化:**
**Kerem Oruc** (@keraattin)
- GitHub: https://github.com/keraattin
- Twitter/X: https://twitter.com/keraattin
### 貢献
このドキュメントや検出ツールへの改善提案がある場合は、プルリクエストを送信するか、イシューを開いてください。
---
**免責事項:** 本書は教育および正規に認可されたセキュリティテストの目的のみで提供されます。コンピュータシステムへの不正アクセスは違法です。セキュリティ評価を実施する前に、必ず適切な許可を取得してください。
**最終更新:** 2026-04-15 | **ステータス:** 公開済み
| プロパティ | 値 |
|---|
| CVE ID | CVE-2026-35031 |
| CVSS スコア | 9.9(Critical) |
| CWE | CWE-22: 制限付きディレクトリへのパス名の制限の不備('Path Traversal') |
| 影響を受ける製品 | Jellyfin Media Server |
| 影響を受けるバージョン | < 10.11.7 |
| 修正バージョン | 10.11.7 以降 |
| 脆弱性の種類 | パストラバーサル + 任意ファイル書き込み + RCE |
| 認証の必要性 | あり(非管理者ユーザー) |
| 必要な権限 | 「字幕のアップロード」権限 |
| デフォルトポート | 8096/TCP |
| GitHub アドバイザリ | GHSA-9p5f-5x8v-x65m |
| パッチの状態 | 提供済み・リリース済み |
| エクスプロイト公開状況 | あり |
auditctl -w /etc/ld.so.preload -p wa -k ld_preload_changes
tar -tzf /backup/jellyfin-$(date +%Y%m%d).tar.gz > /dev/null
監査ログを有効にする ```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