乐于分享
好东西不私藏

阿里云盘下载文件可能覆盖你的系统配置:MoviePilot两个高危漏洞

阿里云盘下载文件可能覆盖你的系统配置:MoviePilot两个高危漏洞

🚨 紧急预警

2026年6月4日至5日,广受中国NAS玩家喜爱的MoviePilot(GitHub 1.1万星)连续曝出两个高危漏洞——CVE-2026-11416(路径穿越,CVSS 8.1)和CVE-2026-10107(SSRF服务端请求伪造,CVSS 7.7)。前者允许攻击者通过云盘文件名将下载内容写入系统任意目录,可能覆盖配置文件甚至触发远程代码执行;后者允许已认证用户通过图片代理接口扫描内部网络,枚举同一局域网内的Jellyfin、Emby、Plex等媒体服务。如果你在NAS上运行了MoviePilot并且使用阿里云盘、115网盘或Rclone进行文件下载,请立即升级到v2.13.5

🔍 2分钟快速自查

第一步:检查当前版本

登录MoviePilot的Web管理界面(通常是 http://你的NAS-IP:3000),在页面底部或「关于」页面查看版本号。

# Docker方式部署的检查方法:
docker inspect jxxghp/moviepilot:latest --format '{{.Config.Image}}'
docker inspect jxxghp/moviepilot:latest --format '{{.Created}}'
# 或直接在容器内查看版本:
docker exec moviepilot cat /app/version.py 2>/dev/null
docker logs moviepilot 2>&1 | grep -i "version" | head -3

版本低于 v2.13.5 → 受影响,需要立即升级。如果版本号显示 v2.13.4 或更早,说明两个漏洞都存在。v2.13.5 修复了路径穿越(CVE-2026-11416),v2.13.2 已修复SSRF(CVE-2026-10107)。


第二步:检查是否有异常文件

# 检查容器内是否有异常文件出现在下载目录之外
docker exec moviepilot find / -name "*.py" -newer /app/app.py -not -path "/app/*" -not -path "/tmp/*" 2>/dev/null
# 检查配置文件是否被修改
docker exec moviepilot stat /app/config/config.yaml
docker exec moviepilot stat /app/config/security.yaml

发现下载目录外出现未知文件 → 可能已被攻击。如果发现异常文件,建议立即隔离容器、导出日志分析,并更换所有API密钥和登录凭证。


第三步:检查网络访问日志

# 查看是否有来自img proxy端点的异常请求
docker logs moviepilot 2>&1 | grep -i "img" | grep -i "proxy" | tail -20
# 查看是否有内部IP地址的访问记录
docker logs moviepilot 2>&1 | grep -E "192\.168\.|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2[0-9]|3[01])\." | tail -20

发现大量内网IP请求 → SSRF可能已被利用。如果日志中出现对192.168.x.x、10.x.x.x等内网地址的代理请求,说明可能有人通过图片代理功能扫描了你的局域网。

⚠️ 风险确认表

已确认的风险

风险类型 影响范围
路径穿越文件写入(CVE-2026-11416) 攻击者可通过云盘文件名中的../序列,将下载的任意内容写入Docker容器内任意位置,覆盖配置文件、插件文件或应用代码
SSRF内网扫描(CVE-2026-10107) 已认证用户可通过图片代理接口请求任意URL,绕过域名白名单的IP地址检测不足,可枚举内网Jellyfin/Emby/Plex等服务
三套云存储后端全部受影响 阿里云盘(AliPan)、115网盘(U115)、Rclone三个下载器的路径穿越模式完全相同,无一幸免

无法排除的潜在风险

风险类型 影响分析
配置文件覆盖→远程代码执行 如果攻击者能覆盖MoviePilot的配置文件(如config.yaml或插件配置),可能注入恶意Python代码路径,在下次重启或插件加载时触发RCE
阿里云盘API Token泄露 通过路径穿越写入的恶意文件如果被MoviePilot处理(如自动整理、重命名),可能触发文件内容解析,导致Token等敏感信息泄露
Samba/SMB后端同样受影响 修复commit显示smb.py也使用了相同的路径拼接模式,但NVD公告未单独为其分配CVE编号,可能仍有残留风险

🛠️ 自救指南

第一步:立即升级MoviePilot

这是最关键的步骤。v2.13.5(2026年6月5日发布)已修复路径穿越漏洞,v2.13.2已修复SSRF漏洞。升级到最新版本即可同时覆盖两个漏洞

# 停止当前容器
docker stop moviepilot
# 拉取最新镜像
docker pull jxxghp/moviepilot:latest
# 用相同参数重新启动(替换为你原来的启动命令)
docker run -d --name moviepilot \
  -p 3000:3000 \
  -v /path/to/config:/config \
  -v /path/to/media:/media \
  -e PUID=1000 -e PGID=1000 \
  jxxghp/moviepilot:latest

第二步:检查下载目录外的异常文件

升级后,务必检查下载目录之外是否出现了不明文件。特别关注/config/(配置文件目录)和/app/(应用代码目录)中最近被修改的文件。

# 查找容器内7天内被修改的文件
docker exec moviepilot find /config -mtime -7 -type f 2>/dev/null
docker exec moviepilot find /app/plugins -mtime -7 -type f 2>/dev/null

第三步:更换阿里云盘Refresh Token

如果你的MoviePilot配置了阿里云盘账号,升级后建议在阿里云盘网页端撤销旧的授权Token并重新生成。虽然路径穿越漏洞本身不直接泄露Token,但如果攻击者通过覆盖配置文件获取了Token内容,旧Token可能已被窃取。

第四步:审查访问日志

检查MoviePilot的访问日志和Docker日志,查找是否存在可疑的图片代理请求(特别是访问内网IP地址的请求)以及异常的文件下载记录。

# 导出近期日志
docker logs moviepilot --since 72h 2>&1 > /tmp/moviepilot_audit.log
# 搜索可疑请求模式
grep -E "img.*proxy|127\.0\.|192\.168\.|10\." /tmp/moviepilot_audit.log

第五步:限制MoviePilot的网络访问

作为临时缓解措施(如果暂时无法升级),可以使用Docker网络策略限制MoviePilot容器的出站访问范围,阻止其对内网地址的SSRF请求:

# 创建隔离网络,仅允许访问外网和云盘API
docker network create --internal mp-isolated
docker network create mp-external
# 将MoviePilot连接到受控网络
docker network connect mp-external moviepilot

🔬 技术深度分析

CVE-2026-11416:路径穿越——云盘文件名直接拼接本地路径

漏洞的根因出奇地简单:三个云存储下载器(alipan.py、u115.py、rclone.py)在构建本地文件保存路径时,直接将云盘API返回的文件名拼接到下载目录路径上,没有进行任何清理或校验。

# 漏洞代码(alipan.py:744,u115.py:833,rclone.py:343 完全相同)
local_path = (path or settings.TEMP_PATH) / fileitem.name
#                                            ^^^^^^^^^^^^^
#  fileitem.name 来自云盘API的JSON响应,未经 basename() 处理
with open(local_path, "wb") as f:
    for chunk in r.iter_content(chunk_size=self.chunk_size):
        f.write(chunk)

fileitem.name的值来自云盘API的原始JSON响应(alipan.py:304处的fileinfo.get("name")),直接反映了远程文件在云盘上的文件名。Python的pathlib.Path对象在执行/操作时不会对路径组件进行安全检查,因此如果文件名包含../序列,最终路径就会跳出预期的下载目录。

例如,当文件名为"../../config/config.yaml"时:

# 预期行为:
local_path = Path("/downloads") / "movie.mkv"
# → /downloads/movie.mkv ✓
# 实际漏洞行为:
local_path = Path("/downloads") / "../../config/config.yaml"
# → /config/config.yaml ✗ (跳出下载目录!)
# open(local_path, "wb") 会直接覆盖配置文件

安全研究员AAtomical在GitHub Issue #5894中提供了完整的PoC脚本,通过模拟阿里云盘API的HTTP响应,在Docker容器中成功验证了文件写入跳出下载目录的行为。修复方案(commit a0b3800f)引入了一个_safe_download_name()静态方法,使用PurePosixPath提取文件名的基本名称(basename),并验证最终路径仍在预期目录内。

CVE-2026-10107:SSRF——图片代理绕过内网防护

MoviePilot提供了一个图片代理端点(/api/v1/system/img/proxy),用于在Web界面中代理加载外部图片。该端点的设计意图是防止浏览器直接加载外部资源时的跨域问题,但实现存在严重的安全缺陷。

漏洞的核心问题在于SecurityUtils.is_safe_url()函数只检查目标URL的域名是否在白名单列表中,但没有额外检查解析后的IP地址是否属于私有地址范围(如192.168.x.x10.x.x.x127.0.0.1)。这意味着攻击者可以通过以下方式绕过防护:

# 攻击场景:扫描内网的Jellyfin服务
# 1. 攻击者在自己的服务器上配置DNS:
#    internal.attacker.com → A记录指向 192.168.1.100
# 2. 构造请求(携带认证Cookie):
GET /api/v1/system/img/proxy?url=http://internal.attacker.com:8096/
Cookie: resource_token=xxx
# 3. MoviePilot检查域名:internal.attacker.com → 不在白名单
#    但如果白名单包含通配符或特定域名,攻击者可注册匹配域名
# 4. 更直接的方式:利用Cloudflare Worker等可自定义域名的代理
#    将 attacker.com 解析到127.0.0.1,绕过域名检查

这个漏洞的利用前提是需要已认证的MoviePilot用户(PR:L),但MoviePilot的默认配置通常不启用严格的访问控制,很多NAS玩家将服务暴露在内网甚至公网上。一旦攻击者获取了访问权限(例如通过弱密码或默认凭证),就可以利用SSRF功能扫描整个内网,发现同一网络中的Jellyfin、Emby、Plex媒体服务器、路由器管理界面甚至NAS管理界面。

攻击链还原:从路径穿越到NAS接管

第一阶段:信息收集。攻击者首先通过MoviePilot的默认端口(3000)确认目标是否运行MoviePilot。如果服务暴露在公网上,可以通过默认凭证或弱密码登录。许多NAS玩家的MoviePilot实例缺乏严格的访问控制——默认用户名和密码、无二次验证、内网直连互联网。

第二阶段:云盘投毒。攻击者在自己的阿里云盘账号中创建一个精心命名的文件。文件名不是普通的电影名,而是包含路径穿越序列的恶意路径,例如"../../config/custom_init.py"。文件内容是一段恶意的Python代码,设计在MoviePilot加载时执行。然后,攻击者通过某种方式(如共享链接、RSS订阅注入等)让MoviePilot的用户订阅到这个”资源”。

第三阶段:触发下载。当MoviePilot用户执行下载操作时(可能是手动触发,也可能是通过自动化的订阅下载功能),三个下载器中的任何一个都会处理这个恶意文件。路径穿越生效,恶意Python文件被写入/config/目录,覆盖或新增了一个初始化脚本。

第四阶段:代码执行与持久化。当MoviePilot重启或加载插件时,被覆盖的配置文件或新增的Python脚本被执行。恶意代码可以:窃取阿里云盘Token、115网盘Cookie等云端凭证;在NAS上建立反向Shell实现远程控制;篡改下载路径,将后续所有下载文件重定向到攻击者控制的服务器;安装持久化后门插件。由于MoviePilot在Docker容器内以root权限运行,攻击者获得的是容器内的完整root权限,可以通过Docker socket逃逸获取宿主机权限(如果Docker配置不当)。

修复方案分析:从’直接拼接’到’安全提取’

官方修复(commit a0b3800f,2026年6月5日)在storages/__init__.py中引入了_safe_download_name()方法,核心逻辑包括三步:

第一步,使用PurePosixPath(name).name提取纯文件名部分,自动剥离所有路径分隔符和../序列。这是Python标准库提供的安全操作,不会产生额外的安全风险。

第二步,验证提取后的文件名不以.开头(防止隐藏文件注入)且不含/\字符(双重确认无路径分隔符)。

第三步,在所有四个下载器(alipan.py、u115.py、rclone.py、smb.py)中将原来的直接路径拼接替换为self._build_download_path(fileitem, path)调用,该方法内部调用_safe_download_name()并进行最终的路径安全检查——确保生成的本地路径确实在预期的下载目录内。

值得注意的是,修复commit同时覆盖了smb.py(Samba/SMB网络共享下载器),虽然NVD公告没有为SMB后端单独分配CVE编号,但官方修复确认它存在相同的漏洞模式。这意味着如果你通过SMB协议挂载了网络共享并在MoviePilot中使用下载功能,同样需要升级。

🏠 中国用户影响分析

MoviePilot在中国NAS玩家群体中拥有极高的知名度。作为由中国开发者jxxghp主导开发的开源项目,MoviePilot集成了阿里云盘、115网盘、夸克网盘等中国主流云存储服务,是许多NAS用户构建“自动追剧+自动下载+自动整理”工作流的首选工具。项目在Telegram上拥有活跃的中文社区频道,GitHub仓库的Issue区和讨论区也以中文用户为主。

本次漏洞的影响之所以特别严重,与阿里云盘的生态地位密不可分。阿里云盘在中国个人云存储市场占据主导地位,大量NAS用户将阿里云盘作为媒体资源的主要来源。MoviePilot的阿里云盘下载器(AliPan)正是这些用户使用频率最高的功能模块,而它恰恰是路径穿越漏洞影响最直接的组件。当用户通过MoviePilot从阿里云盘下载电影时,一个被投毒的共享文件就能让攻击者在NAS上为所欲为。

此外,MoviePilot用户群体通常还部署了Jellyfin、Emby、Plex等媒体服务器——这些正是SSRF漏洞(CVE-2026-10107)的内网扫描目标。一个典型的家庭NAS网络拓扑中,MoviePilot、Jellyfin和NAS操作系统(群晖、TrueNAS、UNRAID等)通常在同一局域网内,MoviePilot的SSRF漏洞可以直接触达这些服务。如果Jellyfin使用了默认的8096端口且无认证保护,攻击者通过MoviePilot的图片代理就能获取完整的媒体库信息和服务器状态。

从部署环境来看,大部分MoviePilot实例运行在Docker容器中,很多用户为了便利使用了--network host--privileged模式启动容器,这在路径穿越漏洞被利用时进一步放大了风险——攻击者写入的恶意文件可以直接影响宿主机的文件系统或利用Docker socket进行容器逃逸。更重要的是,NAS设备的正常运行周期通常以年为单位,很多用户的MoviePilot实例可能已经连续运行了数月甚至数年从未重启,这意味着即使配置文件被覆盖、恶意代码被注入,用户也可能在很长时间内完全不知情——直到下次偶然重启时才发现服务行为异常。

🛡️ 家庭NAS安全纵深建议

  • 网络分段隔离:将NAS服务和媒体服务器放在独立的VLAN或Docker网络中,与家庭其他设备隔离。MoviePilot只需要访问外网(云盘API)和特定的本地共享目录,不应拥有对整个局域网的 unrestricted 访问权限。
  • 避免特权模式运行:Docker启动时不要使用--privileged参数,不要挂载/var/run/docker.sock。如果确实需要宿主机文件访问,使用精确的-v绑定挂载而非--network host
  • 启用访问控制:为MoviePilot的Web界面设置强密码,启用HTTPS,如果可能的话限制只允许内网IP访问。不要将管理端口(默认3000)直接暴露到公网。
  • 定期更新镜像:NAS用户的常见问题是一次配置好后很少更新。建议设置Docker镜像的自动更新(如使用Watchtower)或至少每周手动检查一次是否有新版本发布。
  • 监控异常文件系统活动:使用Docker的--log-level或第三方监控工具(如Portainer、Lazydocker)定期检查容器内的文件变更。重点关注配置目录和应用代码目录的新增或修改。

📋 解决方案与参考资料

官方修复版本:v2.13.5(2026年6月5日发布),同时覆盖CVE-2026-11416和CVE-2026-10107。升级命令:docker pull jxxghp/moviepilot:latest后重新创建容器。

漏洞披露时间线:

  • 2026-05-18 — CVE-2026-10107(SSRF)通过GitHub Issue #5823报告,v2.13.2修复
  • 2026-06-04 — CVE-2026-11416(路径穿越)通过GitHub Issue #5894报告,附完整PoC
  • 2026-06-05 — 官方发布v2.13.5修复路径穿越,commit a0b3800f

引用链接:

[1] GitHub Issue #5894 – Path Traversal: github.com/jxxghp/MoviePilot/issues/5894

[2] GitHub Issue #5823 – SSRF: github.com/jxxghp/MoviePilot/issues/5823

[3] 修复Commit a0b3800f: github.com/jxxghp/MoviePilot/commit/a0b3800f

[4] SSRF修复Commit 0b7854a: github.com/jxxghp/MoviePilot/commit/0b7854a0

[5] NVD CVE-2026-11416: nvd.nist.gov/vuln/detail/CVE-2026-11416

[6] NVD CVE-2026-10107: nvd.nist.gov/vuln/detail/CVE-2026-10107

[7] VulnCheck Advisory: vulncheck.com/advisories/moviepilot-v2-ssrf-via-api-v1-system-img-proxy-endpoint


龙虾池子 · AI 自动生成