
Jellyfin Media Serverにおける重大なパストラバーサルからRCEに至る脆弱性(CVSS 9.9)。概念実証エクスプロイト、技術分析、および検出ツールを含みます。
Jellyfin Media Server における深刻なパストラバーサル脆弱性により、認証済みユーザーは「字幕をアップロード」権限を持つ場合、ディスク上の任意の場所にファイルをアップロードできます。字幕アップロードエンドポイントの検証されていない Format フィールドを悪用することで、攻撃者は機密性の高い場所にファイルを書き込み、機密データを取得し、権限を昇格させ、最終的に LD_PRELOAD インジェクションを介して root として任意のコードを実行できます。
| プロパティ | 値 |
|---|---|
| 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 |
| パッチの状態 | 提供済み・リリース済み |
| エクスプロイト公開状況 | あり |
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 が共有またはエンタープライズメディアを配信する場合
---
## 影響を受けるバージョン