在 2026 年 8 月 27 日至 9 月 9 日期间,Cloudflare 的 Workers AI 服务经历了一次罕见且严重的跨租户数据泄露。其托管的模型 GLM-5.3 在处理超过 681,280 token 的超长上下文请求时,因推理引擎 SGLang 的配置漏洞,错误地将前序用户的 KV 缓存片段输出给了后续请求。虽然 Cloudflare 确认受影响的仅有 155 条响应,且无恶意利用痕迹,但这一事件暴露了分布式推理架构下,底层内存逻辑隔离在极端边界情况下的脆性。


分布式推理的架构代价

Cloudflare 的 Workers AI 采用的是一种高性能的“解耦预填充/解码”(Disaggregated Prefill/Decode)架构。简单来说,它将大模型任务拆解为两步:由预填充(Prefill)节点处理 prompt 并生成 KV 缓存,通过 Mooncake 协议传输给解码(Decode)节点生成回答。

分布计算集群中,负责跨节点数据传输的物理光纤接口
分布计算集群中,负责跨节点数据传输的物理光纤接口

KV 缓存本质上是一组固定大小的内存页,为了追求极致的吞吐量,推理引擎通常不会在请求完成后立刻清零内存,而是通过逻辑标记实现“覆盖式复用”。这要求引擎必须极其精准地追踪每一个内存页的归属。然而,GLM-5.3 这次事故证明,当配置逻辑出现偏差时,这种复用机制会直接演变为数据污染。

分布式推理架构:预填充与解码解耦 预填充节点 生成KV缓存 Mooncake传输 RDMA协议 解码节点 生成响应

为什么是 681,280 这个数字?

问题的核心在于 Cloudflare 的配置与引擎实现之间的脱节。GLM-5.3 本身的上下文窗口配置为 1,048,576 token,但物理 GPU 的 KV 缓存池容量仅能容纳 681,280 token。

内存页分配出现逻辑错位,导致残留的上下文数据被错误读入(剖面示意)
内存页分配出现逻辑错位,导致残留的上下文数据被错误读入(剖面示意)

在正常流程下,若请求超出容量,引擎应返回错误。但 SGLang 存在一个调度逻辑漏洞:当请求被拒绝(Rejected)时,它错误地将该请求的 KV 缓存传输给了解码节点。解码节点由于无法区分“已处理的有效数据”与“被拒绝请求产生的残留占位符”,直接读取了内存页中残留的上一位用户的历史状态。

  • 风险.在复杂的分布式集群中,如果准入控制逻辑(Admission Queue)仅校验请求是否“存活”而非校验请求是否“合法/完成”,跨节点的数据泄露几乎是必然的。

如何堵上这个技术债

Cloudflare 的修复措施包含两层逻辑:首先是物理上的配置对齐,将 KV 池扩容至 204 万 token,彻底避开了触发拒绝机制的风险;其次是在 SGLang 层面引入强制校验补丁(如 PR #36988 和 #38935),要求解码节点严格校验传输的 token 数量是否与预留空间匹配。

物理扩容后的服务器机柜,硬件标签明确标识了新的内存容量
物理扩容后的服务器机柜,硬件标签明确标识了新的内存容量

这一事件也提醒了开发者,在追求推理性能的过程中,往往会引入难以察觉的系统级脆弱点。

修复路径:从配置对齐到引擎加固 2.04M KV缓存池扩容 #38935 引擎拒绝路径补丁 强制校验 节点状态隔离校验
  • 结论.对于依赖 disaggregated 架构的推理引擎维护者而言,将租户隔离逻辑前置到准入调度层,已成为确保大规模高并发推理安全性不可避开的共识。