AI宝库

AI宝库首页 › AI 资讯 › GLM-5.3工人AI模型中的交叉请求 KV缓存曝光(155个答复)

GLM-5.3工人AI模型中的交叉请求 KV缓存曝光(155个答复)

来源:Hacker News · 发布时间:10-27 · 由 AI宝库每小时自动聚合

文章 URL:https://blog.cloudflare.com/kv-cache-exposure-remedation/ 评论 URL:https://news.ycombinator.com/item?id=50252159 要点:43# 评论:8

GLM-5.3工人AI模型中的交叉请求 KV缓存曝光,以及我们与SGLang的补救

2026年9月8日,来自克诺斯季克的安检人员加迪·埃夫龙(Gadi Evron)提醒我们,一个租户隔离问题影响到了GLM-5.3工人AI模型(@cf/zai-org/glm-5.3),从2026年8月27日开始。 我们已经纠正了这个问题,并于9月9日恢复了模型。 我们确认,在工人AI上托管的其他模式没有受到影响。

8月27日至9月9日期间,少数使用GLM 5.3工人AI模型的客户收到了包含来自其他客户在他们之前不久向同一种模型提出的要求的数据的答复。 总共155个答复受到影响,导致超过681 280个信使。

在排除了我们自己的测试和研究者的要求后,我们找出的要求在时间和体积上都与普通的长文使用一致,而不是与有人反复地利用虫子。 我们没有发现任何蓄意剥削的证据。

今天,我们正在发表这份报告,同时发表来自SGLang的一篇文章,即我们使用的开源推论引擎作为协调披露。 这篇文章描述了引起这个问题的缺陷,我们的反应时间表,以及随后我们对生产SGLang的部署进行的更硬化。 我们还详细说明,我们继续与SGLang的上游维护者一起努力解决这一问题和类似的问题。

发生了什么事

GLM是来自Z.ai的文本生成模型,为代理编码工作流程所建;它是通过Workers AI提供的许多模型之一。 Gadi Evron于9月8日通过我们的HackerOne程序提交了一份报告,Cloudflare于次日早上转载了这期节目,并在宣布出事后40分钟内将模型下线。 然后我们部署了一个修正的配置和一个补丁的推论引擎,并于同一天恢复服务。

关于交叉请求的KV缓存暴露的具体报告是两个重叠问题的结果。 第一个是开源推论引擎SGLang的错配置,由Cloudflare使用。 我们部署了GLM 5.3,有一个1,048,576个上下文窗口,但是我们预填GPU上的KV缓存池只有681,280个令牌的空间。 在发布之前,我们意识到这种不匹配。 我们期望引擎返回任何它无法处理的即时错误,我们的长文本测试返回了成功的答复,因此我们认为这不是一个问题。

第二是SGLang如何在分类的预填/解码模式下处理产生的超长请求的出错。 一个不符合池的快取被内部标记为拒绝并被取而代之的一键占位符,但是没有中止请求并返回客户端出错,而是预填生成了占位符的 KV 缓存,并被转移到解码节点。 解码节点收到"传输完整"的消息,并假定预先填充会从先前的请求中超额刷取出KV缓存,同时对此请求有完全的快取,而事实上它使之前状态的大部分都完好无损。 解码节点随后生成了响应,同时在浏览了仍然保存来自先前请求的数据的已停用缓存页面。 因此,对超过681 280个令牌的提示的响应可能包含来自其他用户GLM 5.3会的数据。

立即补救

在使模式失效后,我们采取了以下行动来纠正这种脆弱性,然后恢复公众使用这一模式的机会:

为了修复我们的配置,我们让游泳池保持了完整的环境。 我们调整了我们的GLM 5.3配置,以匹配我们的GLM 5.2配置,它释放出足够的GPU内存,预填KV池现在持有约204万个令牌,大约是1,048 576个上下文长度的两倍。 符合上下文窗口的提示现在总是符合集合,所以拒绝路径永远无法为有效的请求所达到。 仅此就阻止了虫子被锻炼。

为了修复引擎,我们还使拒绝路径安全。 单靠池子大小是脆弱的:任意向分数化,收分数平行化,CUDA图表大小,或未来的模型版本以容易错过的方式改变池子大小。 此外,还可能存在预填调度器可以拒绝请求并触发同一种错误的其他情况。 为了防止这种情况,我们还修补了引擎,使一个载有待决拒绝的请求在分解录入队列中被退役,加上其原错误,在任何靴子夹,分配,或KV传输发生之前。 我们提出这个上游为#38704,它也让解码节点验证所传输的符号数量与它所保留的号码相符。 该修道已经于36988年的SGLang主干道上被合并为9月6日的相關故障道,但尚未被发布。 维护者们还按照我们的方法,合并了38935号,它早些时候拒绝了这些要求。

在恢复模型之前我们验证了研究者复制脚本的修改以及我们自己的金丝雀标记测试

背景:我们如何服务GLM 5.3

工人AI在分解配置中运行了带有SGLang的GLM 5.3:一组预填GPU处理快取并产生模型的KV缓存,再将缓存放在远程直接内存访问(RDMA)上,通过Mooncake,到一个生成响应的解码GPU集合。 我们之前在高性能的LLMs和较小,更快,更安全的模型的岗位上写过这个架构。

GPU内存中的KV缓存是一个共享的固定大小页面集合。 每个请求在被接受时被指定页;发布在完成时被指定页。 当前在请求之间没有将页面零化;获得页面的下一个请求会简单地覆盖它。 这种方法在推论引擎中是常见的,并且是实现最佳性能所必需的,但这意味着推论引擎负责跟踪这些内存页的所有权。 KV缓存页面所有权和寿命跟踪不仅必须处理节点内共享的所有权(KV缓存卸载和信使生成同时访问不同寿命的内存),而且还要处理技术上与远程预填节点共享的所有权(它同时持有可变引用页面).

此外,该池的大小不是一个配置值。 SGLang在启动时从GPU内存中装入模型重量后留下的大小。 该模型所广告的上下文长度是一个单独的配置值。 没有任何东西迫使两人同意,我们的任务是检查他们是否同意。

问题一:配置错误

在我们的GLM 5.3预填节点与我们的配置,池来681,280个令牌而模型的上下文长度是1,048,576个令牌。 所选择的KV池大小由SGLang在启动时以日志形式打印出,并作为公尺被曝光。 我们意识到这种大小不匹配;然而,在发布前测试期间,我们观测到HTTP状态代码和一个在基准设定过程中没有出错框架的流体。 我们假设引擎能够优雅地处理 KV 缓存池与请求的上下文窗口之间的差额,通过流出或其他机制。

这是我们测试中的一个关键缺口:我们只在长时间内验证HTTP响应代码和引擎性能,而没有验证模型输出和一致性。 我们现在从运行的引擎直接检查KV集合大小,然后进行分门别类的部署改变,而不是从响应代码中推断出来。

第二期:SGLang 错误

在v0.5.21中,SGLang团队现在已经处理了这个bug的处理提示比KV池大小长的方式。 以下是之前发生的事情。

当超过KV游泳池的快车到达时,SGLang的调度员拒绝了。 拒绝路径(Req.set finish with bort)记录了要返回客户端的错误,并交换了单键占位符的提示,以便请求可以在不分配真实内存的情况下通过正常的批量机械排出。 在单个节点的部署上,此操作有效:占位符运行,批量完成,客户端收到错误。

在像我们运行这样的分类模式下,预填和解码的入场排队检查请求是否完成,而不是是否被拒绝。 一个被拒绝的请求自称是活的。 所以说:

- 鞋带路由器告诉解码节点的即时长度(图中为8页). 解码为请求保留了8个KV页。

- 预填录入。 如果req. finished( ) 是 False,预填录取队列会接受任何请求。 一个被拒绝的请求将其拒绝存储为完成,而非完成理由,因此完成( ) 仍然返回 False。 被拒绝的请求被接受。

- 预填前传拒绝已经用一键占位符取代了提示符。 Prefield跑出一个微不足道的前进传递一个标志。

-KV转帐 Prefill发送了一页KV来解码并发出信号,表示传输完成。

- 解码录入。 解码的入场队列有相同的完成()检查,因此接受了交接。

- 解码注意。 解码器开始生成,注意力读取所有8个保留页。 这一要求只写了P0页。 第P1页至第P7页仍然保留着它们中较早的请求:其他用户的提示和部分代。

- 回应。 客户端得到了HTTP 200而不是HTTP 400. prools tokens 匹配了长长的提示,并且回复是连贯的。 它的到来比8页的预填要快,它包含了来自其他用户的KV页面的内容。

每一次超过门槛的请求都会这样这个bug在2026年7月6日被另一个用户作为#30233号问题报告给SGLang,Cloudflare在调查这一事件时注意到了这个错误。 我们自v0.5.10起就一直向SGLang提出这类问题,这次安全事件加速了Cloudflare与SGLang团队合作已经开始的工作。 此期的补丁为:在SGLang v0.5.20中为发布,在v0.5.21和v0.5.22中为后续,并可供所有其他依赖于SGLang的操作者使用。 我们强烈推荐所有运营商将SGLang依赖性更新为v0.5.22或更晚。 具体PR的更详细情况见下文。

GLM 5.3是受此虫影响的唯一型号。 关于工人AI的所有其他分类部署在预填和解码上都有比上下文长度更大的KV集合,因此任何请求都无法到达拒绝路径。 我们把发动机固定和下面描述的硬化应用到我们为SGLang服务的每一个模型上,我们的部署检查需要它们来进行每次新的部署。

时间线

所有时间UTC.

正在加紧努力

这个bug属于Cloudflare已经工作了几个月的KV缓存存储安全bug的类。 在每一种情况下,一个页面都被解禁、重新使用或读取,而其他的网页却仍然有权利主张。 我们看到两个共同的原因。

第一个是单节点内页寿命。 解码节点上的几个任务可以同时持有同一页:令牌生成,卸载到主机内存,KV传输接收器,以及中止和出错路径。 如果其中之一在另一页仍在使用时解开页面,则可以在仍然被读取或写入时给出新的请求。 我们先前对解码卸载(#24226,#30899)和对语法错误(#30937)的双放的修补就是这种。

第二场是横跨节点的比赛。 当一个请求在预填时仍然写入其 KV 缓存以解码 RDMA 时,已经发送的写入无法被召回。 如果解码立即解码这些页面,这些页面可以被赋予另一个请求,而后期写入请求的KV缓存中。 Cloudflare通过提议的修补(#31357,#38961)和复制脚本(#32564)来为修补这场赛事做出了贡献。 在这两种情况下,结果都是被损坏的输出,或者一个用户的数据在另一个用户的反应中,没有

本文由 AI宝库自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(blog.cloudflare.com)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI宝库首页 · 提交工具 · 商务合作 · 关于本站 · 591 款 AI 工具分类导航 · 每日 AI 热门项目与动态