系统:运行中
← 返回所有攻击
SUPPLY CHAIN CRITICAL NEW

ktransformers:通过 ZeroMQ 上的 pickle 实现未认证 RCE(CVE-2026-26210)

ktransformers 推理引擎中的一个严重 RCE 在所有网络接口上暴露了一个 ZMQ 套接字,并对收到的任何数据执行 pickle 反序列化。这是「ShadowMQ」模式被复制到各 AI 推理栈中的最新案例。

2026-06-15 // 5 min affects: ktransformers, vllm, sglang, nvidia-tensorrt-llm, meta-llama-stack

这是什么?

CVE-2026-26210ktransformers 中的一个严重的未认证远程代码执行(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 端口可从可信边界之外访问。

状态

项目详情
CVECVE-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