SGLang 安全更新:强化请求隔离机制

2026年9月9日,Cloudflare向SGLang团队通报:部署在Workers AI上的GLM-5.3出现跨请求KV cache暴露。SGLang团队随后联合Cloudflare与安全研究员展开处置,修好了请求拒绝路径,并收紧了分离式服务中的缓存生命周期管理。

影响范围与受影响部署

受波及的只有2026年8月27日至9月9日期间的@cf/zai-org/glm-5.3模型。Cloudflare排查后确认,Workers AI上的其余模型没有牵涉其中。故障出在分离式prefill/decode服务里:一旦请求量超过prefill KV cache容量,返回的内容就可能来自别的用户会话。

问题根源

Cloudflare设置的上下文长度为1,048,576 tokens,而prefill KV cache池只能装下681,280 tokens,拒绝路径因此被触发。走分离式路径时,一个已被标记拒绝的请求依然可能进入handoff,decode端随之读到尚未初始化的缓存页。

An aborted request's launched writes land in KV cache slots that have already been reassigned to another request.

即时修复与上游变更

9月9日当天,Cloudflare关掉了该模型的公开访问,扩了大prefill池,并给引擎打上补丁。上游的PR #36988和#38935分别做了两件事:让被中止的请求能及时回收,以及在进入分离式handoff之前就把请求拒掉。

相关KV cache生命周期问题

团队还处理了异步传输中的竞态条件。prefill/decode分离服务中,被中止请求的RDMA写操作还在路上,如果decode端提前释放槽位,这次写入就可能盖掉其他请求的缓存。

The transfer stack below the Python scheduler: aborts stop future chunks while launched transfers and posted NIC writes continue.

背景与机制分析

异步RDMA传输一旦发出写操作就无法取消,分配器有可能在写操作完成之前就把槽位标成free,形成分布式的use-after-free。要把活性问题处理完整,得从路由器一路管到引擎层。

Deferred KV cache release: decode holds slots until all required drain acknowledgments arrive or the configured timeout expires.

新增的机制采用延迟释放:decode端会一直占着槽位,直到所有确认或超时到期,再叠加传输层防护和完整性检查,静默数据污染的风险被消掉了。