一次「安静」的跨租户泄漏

10 月 26 日,Cloudflare 披露了一起发生在其 Workers AI 平台上的跨租户数据暴露:在 8 月 27 日至 9 月 9 日期间,部署在平台上的 GLM-5.3 模型因底层推理引擎 SGLang 的预填充/解码不匹配,导致部分响应中混入了其他客户近期请求的片段。受影响的是 155 条超长上下文(提示超过 681,280 词元)的响应。Cloudflare 称未找到主动利用的证据,但暴露面本身已经构成一起值得记录的多租户隔离事故。

这类事故的特殊之处在于:它不是某家小厂的偶发 bug,而是出现在头部边缘与云厂商的共享推理基础设施上,影响的也是「长上下文」这种正被越来越多企业采用的能力。

SGLang 预填充/解码不匹配如何击穿隔离上下文窗口(标称)1,048,576 词元预填充 KV 缓存池仅 681,280 词元超长提示越过池子拒绝路径未清零 → 旧 KV 页被复用结果:155 条超长响应的生成中混入其他客户请求片段Cloudflare 已将池扩容至约 2.04M 词元并修补拒绝路径未点名受影响账户;未发现主动利用证据
GLM-5.3 跨租户泄漏的故障链:缓存池比上下文窗口小

故障链:池子比窗口小,拒绝路径留了缝

技术细节值得拆开看。GLM-5.3 标称上下文窗口为 1,048,576 词元,但预填充 GPU 上的 KV 缓存池只容纳 681,280 词元。工程师原本相信超长提示会干净地报错,而短路径上的长上下文测试也一直通过,于是这个 mismatch 长期处于潜伏状态。

当某条提示超过缓存池时,SGLang 在分离式预填充/解码模式下把请求标记为拒绝、替换成一个单词元占位符,却仍把部分 KV 状态传给了解码节点;解码端假定预填充已覆写缓存页,于是上一轮会话遗留的缓存页在生成时仍可被读取。换言之,漏洞需要极长提示才触发,但一旦触发,就存在真实的机密性风险。

影响面与处置

Cloudflare 的处置分容量与逻辑两层:把缓存池扩容到约 2.04 百万词元(约为标称上下文的两倍),确保合法提示总能落进池子而不走拒绝路径;同时加固拒绝路径,让被中止的预填充不再留下可被活的解码会话复用的陈旧 KV 页。SGLang 维护方也发布了协同指引,建议运营方升级到 v0.5.22 或更高版本,并把分离式模式下的池子尺寸变化视为敏感项。

平台侧还披露,除 GLM-5.3 外没有其他 Workers AI 模型受影响,公司也未发现 deliberate 利用的证据。但法律风险并不因此消失——当提示中可能含有源码、患者摘要或未公开财务模型时,跨租户泄漏即便「低概率」也可能触发 GDPR 等框架下的 breach 评估义务。

为什么这件事值得写

它揭示了一个被长期低估的真相:在共享推理基础设施上,KV 缓存的尺寸与复用策略不只是性能旋钮,更是安全边界。任何对量化、张量并行或 CUDA 图的改动,都可能悄悄缩小有效池子尺寸;而多数团队的持续集成只测happy-path 延迟,不测「提示单调增长到拒绝」时的缓存清零。

对自托管 SGLang 的工程师,可操作的清单很具体:用对抗式测试把提示长度递增到拒绝点,验证拒绝是否真正清零或隔离缓存行;把 token 计数与模型 ID 记入日志;对接近百万词元的文档摘要类工作流,评估是否应放到带合同隔离保证的单租户专用集群。

给采购与治理的启示

对采购方,这起事件强化了「公共 API 看似便宜,但隔离失败虽罕见却对信任是毁灭性」的判断。评估云 AI 供应商时,应直接追问其预填充/解码部署如何测试超长提示、是否做缓存行金丝雀校验。

余波方面,预计会出现类似 SOC 2 扩展的认证,专门审计推理调度器的缓存复用模式;开源引擎也会加入在请求间用 canary 值涂抹 KV 页的调试模式,以便在预发环境检出陈旧读取。对银行这类对模型风险团队,这起事件也是一次提醒:允许员工在共享托管 LLM 上做实验而不记录提示长度,本身已是基线卫生的缺口。