ktransformers:通过 ZeroMQ 上的 pickle 实现未认证 RCE(CVE-2026-26210)
ktransformers 推理引擎中的一个严重 RCE 在所有网络接口上暴露了一个 ZMQ 套接字,并对收到的任何数据执行 pickle 反序列化。这是「ShadowMQ」模式被复制到各 AI 推理栈中的最新案例。
这是什么?
CVE-2026-26210 是 ktransformers 中的一个严重的未认证远程代码执行(RCE)漏洞。ktransformers 是由 KVCache.AI 维护的高性能 LLM 推理引擎(GitHub 约 16,500 星,以在单节点上运行 DeepSeek-V3 而闻名)。该漏洞由 Valentin Lobstein(Chocapikk)在对 ML 推理框架中 pickle 反序列化的审计中披露,由 VulnCheck 分配编号,并于 2026 年 4 月 23 日公开。NVD 将其评为 CVSS 3.1 9.8(CVSS 4.0 为 9.3),归类为 CWE-502(不可信数据的反序列化),影响 ktransformers 0.5.3 及更早版本。
其根本原因并不新鲜——而这正是关键所在。它正是 Oligo Security 于 2025 年 11 月以 ShadowMQ 之名记录的那种不安全的 ZeroMQ 加 Python pickle 组合。该模式在很大程度上通过复制粘贴 serving 代码,扩散到了整个 AI 生态系统(Meta Llama Stack、vLLM、NVIDIA TensorRT-LLM、Modular Max、SGLang)。
工作原理
ktransformers 的 balance_serve 后端(其遗留的多并发模式,通过 --backend_type balance_serve 启用)会启动一个调度器,将一个 ZeroMQ ROUTER 套接字绑定到所有网络接口,然后将传入消息转发给工作线程。每个 worker 都会对收到的原始字节进行反序列化:
# 调度器 worker(简化)
self.frontend.bind(f"tcp://*:{sched_port}") # 在所有接口上监听
# ... ROUTER/DEALER 代理转发到工作线程 ...
message = worker.recv()
data = pickle.loads(message) # CWE-502:不可信输入
pickle.loads() 并不是一个安全的解析器:反序列化攻击者控制的对象可在 unpickling 过程中触发任意代码执行。由于该套接字不要求任何认证或校验,任何能够访问该端口的主机都能以 ktransformers 进程的权限执行代码。我们刻意省略可用的攻击载荷;其机制(一个归约为系统命令的恶意 pickle)属于经典的 CWE-502,此处描述仅为说明风险。
有两个细节使得生产环境中的利用变得现实。其一,官方 Docker 部署使用 --network=host 运行,这会移除容器的网络隔离,并将 ZMQ 端口暴露在宿主机上。其二,尽管端口是动态分配的,它会被打印在服务器日志中,而 ZMQ 套接字在网络上极易被识别——Oligo 报告称有数千个 ZMQ 套接字暴露在公共互联网上。CISA 的 SSVC 条目将其利用成熟度标记为「proof-of-concept」,并标记为可自动化。
为什么重要
推理服务器位于 AI 基础设施的深处:它们持有模型权重、提示词、API 密钥,且常运行在对内网有广泛访问权限的 GPU 集群上。单个节点上的 RCE 可能意味着在整个集群中执行代码、横向移动、窃取机密与模型,或进行 GPU 挖矿——与此前的 ShadowMQ 案例属于同一影响等级。
更宏观的教训关乎「模仿式」供应链。该漏洞并非通过共享依赖传播,而是通过共享的代码惯用法传播——recv_pyobj() 与「ZMQ 上的 pickle」模式在快速演进的项目之间被复制,有时头部注释甚至仍写着「Adapted from vLLM」。ktransformers 只是继承该模式的最新一个栈,这意味着下一个很可能已经在生产中。
防御
修复方法已被充分理解,上游补丁(PR #1944)也遵循了它:
- 升级到 0.5.3 之后的版本,或完全避免使用
balance_serve后端。现代的、与 SGLang 集成的部署路径不会启动这个易受攻击的 ZMQ 套接字。 - 绝不要对不可信数据使用
pickle.loads()。 RPC 应使用不可执行的格式(JSON 或 MessagePack);推理请求是结构化数据,无需 pickle。Meta、vLLM 和 Modular 正是这样修复其 ShadowMQ 变体的。 - 默认绑定到
127.0.0.1,而非tcp://*。在套接字监听可路由接口之前,要求显式启用。 - 对通道进行认证。 ZeroMQ 支持 CurveZMQ(以及 HMAC 方案);即使是共享密钥也能阻止随意的利用。
- 不要以
--network=host运行推理容器。 保留容器网络隔离,仅暴露预期的 HTTP API。 - 主动排查暴露面: 扫描自有地址段以寻找 ZMQ 握手字节,确认没有调度器/RPC 端口可从可信边界之外访问。
状态
| 项目 | 详情 |
|---|---|
| CVE | CVE-2026-26210(CWE-502) |
| 受影响 | ktransformers ≤ 0.5.3(balance_serve 后端) |
| 严重性 | CVSS 3.1 9.8 / CVSS 4.0 9.3(严重) |
| 披露 | 2026 年 2 月 11 日代码审计;2026 年 4 月 23 日公开 CVE |
| 修复 | 上游 PR #1944;建议采用与 SGLang 集成的部署 |
| 致谢 | Valentin Lobstein(Chocapikk),由 VulnCheck 分配 |
| 模式 | 「ShadowMQ」——ZMQ + pickle 在各 AI serving 栈中的复用(Oligo,2025 年 11 月) |
Sources
- → https://chocapikk.com/posts/2026/ktransformers-pickle-rce/
- → https://vulnerability.circl.lu/vuln/cve-2026-26210
- → https://www.vulncheck.com/advisories/ktransformers-unsafe-deserialization-rce-via-balance-serve
- → https://github.com/kvcache-ai/ktransformers/pull/1944
- → https://www.oligo.security/blog/shadowmq-how-code-reuse-spread-critical-vulnerabilities-across-the-ai-ecosystem