一、漏洞背景与影响范围
Jellyfin作为开源媒体服务器解决方案,其路径遍历漏洞曾引发广泛关注。该漏洞主要涉及两个CVE编号:CVE-2021-21402(CNNVD-202103-1234)与CVE-2022-30626(CNVD-2023-32759),分别影响不同版本范围的服务器实例。
CVE-2021-21402于2021年3月23日由CNNVD首次披露,影响Jellyfin 10.7.1之前的所有版本(包括10.6.4及更低版本)。该漏洞允许攻击者通过构造包含路径分隔符(如%5C或../)的恶意请求,绕过服务器端的路径有效性检查,进而读取文件系统中的任意文件。此问题在Windows主机上尤为突出,因Windows文件系统对路径分隔符的处理机制与Unix/Linux存在差异,导致攻击成功率显著提升。
CVE-2022-30626则于2023年4月28日公开,被标记为高危漏洞,影响10.8.0至10.8.10之前的版本。其攻击原理与CVE-2021-21402类似,但利用场景更广泛,尤其在公共互联网暴露的服务器上风险更高。根据NVD评估,CVE-2021-21402的CVSS 3.1基础评分为6.5(中危),而CVE-2022-30626因利用复杂度更低且影响范围更广,被评定为高危漏洞。
二、漏洞技术原理剖析
1. 路径遍历攻击本质
路径遍历(Directory Traversal)是一种常见的Web应用安全漏洞,攻击者通过操纵文件路径参数,试图访问应用程序预期之外的文件系统资源。例如,若应用程序未对用户输入的filename参数进行严格过滤,攻击者可构造如下请求:
GET /api/files?filename=../../etc/passwd HTTP/1.1
若服务器未对../进行规范化处理,则可能返回系统敏感文件内容。
2. Jellyfin漏洞具体成因
在Jellyfin的案例中,漏洞主要源于ClientLogController等组件在处理目录请求时未执行充分的路径验证。具体表现为:
- 输入过滤缺失:未对用户提供的路径参数进行规范化处理,未剥离或转义特殊字符(如
../、%5C)。 - 权限校验不足:未验证请求路径是否位于应用程序允许的目录范围内(如仅允许访问
/var/jellyfin/logs)。 - 操作系统差异:Windows文件系统同时支持
\和/作为路径分隔符,而部分代码未统一处理,导致攻击者可混合使用分隔符绕过过滤。
以CVE-2021-21402为例,攻击者可构造如下请求读取系统文件:
GET /api/logs?path=C:\Windows\System32\drivers\etc\hosts HTTP/1.1
若服务器未对C:\进行校验,则可能返回Windows主机文件内容。
三、漏洞影响与风险评估
1. 影响版本范围
- CVE-2021-21402:Jellyfin ≤ 10.7.0
- CVE-2022-30626:10.8.0 ≤ Jellyfin < 10.8.10
2. 潜在攻击场景
- 敏感信息泄露:攻击者可读取配置文件(如
config.json)、数据库凭证、SSL私钥等。 - 系统命令执行:若结合其他漏洞(如文件上传),可能实现远程代码执行。
- 内网渗透:通过读取内部网络配置文件,进一步横向移动至其他系统。
3. 风险等级判定
根据CVSS 3.1评分标准,CVE-2022-30626的评分构成如下:
- 攻击向量(AV):Network(远程利用)
- 攻击复杂度(AC):Low(无需特殊条件)
- 权限要求(PR):None(无需认证)
- 用户交互(UI):None
- 影响范围(S):Unchanged
- 机密性(C):High(可读取敏感文件)
- 完整性(I):None
- 可用性(A):None
最终得分为9.8(Critical),表明其危害性极高。
四、修复方案与防御措施
1. 官方修复版本
- CVE-2021-21402:升级至Jellyfin 10.7.1或更高版本。
- CVE-2022-30626:升级至Jellyfin 10.8.10或更高版本。
官方修复的核心逻辑包括:
- 引入路径规范化库(如
.NET的Path.GetFullPath)对用户输入进行标准化处理。 - 实现白名单机制,仅允许访问预定义的目录路径。
- 统一跨平台路径分隔符处理,避免操作系统差异导致的绕过。
2. 临时缓解措施
若无法立即升级,可采取以下措施降低风险:
- 网络层防护:通过Web应用防火墙(WAF)规则拦截包含
../或%5C的请求。 - 文件系统权限:限制Jellyfin进程对敏感目录的读取权限(如
/etc、C:\Windows)。 - 日志监控:实时监测异常文件访问请求,及时响应潜在攻击。
3. 代码级防御建议
对于自研媒体服务器或二次开发场景,建议:
- 输入验证:使用正则表达式严格匹配允许的路径字符(如
^[a-zA-Z0-9_\-/]+$)。 - 路径限制:通过
Directory.Exists或类似API验证路径是否位于基目录下。// 示例:C#路径限制验证string basePath = "/var/jellyfin/media";string userPath = Path.GetFullPath(Path.Combine(basePath, inputPath));if (!userPath.StartsWith(basePath)) {throw new SecurityException("Invalid path access attempt");}
- 最小权限原则:以低权限用户运行媒体服务器进程,限制文件系统访问范围。
五、总结与行业启示
Jellyfin路径遍历漏洞再次凸显了输入验证与权限控制的重要性。对于开发者而言,需遵循以下原则:
- 防御性编程:假设所有用户输入均为恶意,执行严格的过滤与校验。
- 跨平台兼容性:充分考虑不同操作系统的特性差异,避免因实现细节导致安全漏洞。
- 及时更新:订阅安全公告,第一时间应用官方补丁。
对于企业用户,建议建立常态化的漏洞管理流程,结合自动化扫描工具(如OWASP ZAP)与人工渗透测试,持续评估媒体服务器等关键组件的安全性。通过技术防护与管理措施的双重保障,最大限度降低路径遍历等安全风险。