Jellyfin 媒体服务器中存在一个严重的路径遍历漏洞,允许具有“上传字幕”权限的经过身份验证的用户将文件上传到磁盘上的任意位置。通过利用字幕上传端点中未经验证的 Format 字段,攻击者可以写入敏感位置的文件、窃取敏感数据、提升权限,并最终通过 LD_PRELOAD 注入以 root 身份执行任意代码。
| 属性 | 值 |
|---|---|
| CVE ID | CVE-2026-35031 |
| CVSS 评分 | 9.9(严重) |
| CWE | CWE-22:对受限目录的路径名限制不当('路径遍历') |
| 受影响产品 | Jellyfin 媒体服务器 |
| 受影响版本 | < 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
Format 参数本用于指定字幕格式(srt、vtt、ass 等),但反而会被当作文件路径的一部分:``` 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 媒体服务器进程(大多数部署中以 root 身份运行)
- 操作系统内核和库
- 存储的媒体和元数据
- 用户认证系统
- 链接到 glibc 的系统级进程
### 业务影响
- **数据泄露:** 所有存储的凭据和用户数据遭到泄露
- **服务中断:** Jellyfin 及其他潜在服务变得不可用
- **横向移动:** 受感染系统成为网络攻击的跳板
- **合规违规:** 如果个人身份信息(PII)泄露,可能违反 GDPR、CCPA、HIPAA
- **供应链风险:** 如果 Jellyfin 用于提供共享或企业媒体服务
---
## 受影响版本
| 版本 | 状态 | 备注 |
|---------|--------|-------|
| < 10.8.0 | 易受影响 | 存在原始漏洞 |
| 10.8.0 - 10.11.6 | 易受影响 | 可能存在路径遍历和 RCE |
| 10.11.7+ | 已修补 | 格式字段已正确验证 |
| 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 脚本提供自动化漏洞检测。