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-remedication/ 评论 URL:https://news.ycombinator.com/item?id=50252159 要点:18# 评论:6

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日恢复了模型。 我们确认,在工人大赦国际上主持的其他模式没有受到影响。

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

在排除了我们自己的测试和研究人员的测试后,我们确定的请求在时间和数量上与普通的长文使用一致,而不是与反复利用bug的人一致。 我们没有发现任何蓄意剥削的证据。

今天,我们正与我们使用的开源推论引擎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 缓存,同时对此请求有完全的及时性,而事实上它使得之前状态的大部分都完好无损。 解码节点随后在浏览仍然保存来自先前请求的数据的 Stale 缓存页面时生成了响应。 因此,对超过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团队现在处理了这个错误,它处理提示的时间比KV池大小长。 以下是之前发生的事情。

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

在像我们运行这样的分类模式中,预填和解码上的录取队列检查请求是否完成,而不是是否被拒绝。 一个被拒绝的请求自称是活的。 因此:

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

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

- 预填前传拒绝已被一个单键占位符取代。 Prefill 运行了一个微不足道的前进传递一个标志。

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

- 破解密码解码的录取队列有相同的完成()检查,所以接受了交接。

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

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

每一次超过门槛的请求都这样这个bug在2026年7月6日被另一个用户报告为#30233号问题,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是唯一受到这个bug影响的模型。 关于工人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 热门项目与动态