Cloudflare公布了对Cloudflare Workers平台远程Spectre攻击的重新评估结果,该评估于2024年和2025年初进行。研究团队成功在生产环境中构建了一个可运行的概念验证,使受害Worker中的数据能够以最高每秒12比特、超过99%的准确率泄漏到由研究人员控制的攻击者Worker。
公司确认,所展示的攻击已通过Cloudflare Workers Runtime团队采取的措施在生产系统中得到处理,并表示在过去三年中没有发现主动利用的迹象。研究结果发表在一篇由Albert Pedersen、Haocheng Xiao、Sam Ainsworth、Nigel Topham和Martin Schwarzl共同撰写的论文中。
为什么这项研究很重要?
Workers依赖在边缘运行不受信任的JavaScript,因为数以万计的租户可以通过V8隔离环境共享一个操作系统进程。每个Worker都有独立的JavaScript堆,这提高了启动速度以及托管大量租户的效率,但也意味着进程内的任意读取漏洞可能为租户之间的数据泄漏打开大门。
Spectre攻击利用处理器中的推测执行。当处理器预测软件分支的结果并在确认之前执行指令时,结果随后可能被撤销,但一些细微痕迹仍会留在处理器的微架构状态中,包括缓存。攻击者可以利用内存访问延迟差异,推断出本不应读取的数据中的比特。
Cloudflare曾于2021年推出名为Dynamic Process Isolation(即DyPrIs)的生产级防御,用于将看似恶意的脚本隔离到独立进程中。然而,重新评估发现,执行机制中存在一个限制,使攻击能够保持足够长的有效时间,从而绕过隔离。
攻击如何克服Workers的限制?
该平台限制本地计时器,不允许共享内存或多线程,因此依赖SharedArrayBuffer的传统测量方法无法使用。研究人员改用通过WebSocket连接实现的远程计时器,并利用L1缓存中的基于树的PLRU替换策略所产生的缓存事件信号放大效果。
团队还设计了两种Spectre gadgets。第一种用于泄漏堆中的压缩指针,包括隔离环境专属的堆基址。第二种利用类型推测混淆访问一个宽度为64位的原始指针,从而能够将泄漏转化为对攻击方选择的地址进行读取。在研究进行时,V8 Sandbox尚未应用于Workers,而TypedArray属于保留指向其后备存储的原始指针的对象之一。
为了确保测量结果可重复,研究人员创建了大量超出缓存容量的对象,然后在每一轮中随机选择位置,而不是为每个内存缓存行寻找精确的驱逐集合。此外,他们还使用Durable Objects维持长期运行的执行上下文,并通过WebSocket消息重置处理时间和请求限制。通过在执行批次之间定期暂停,可以使隔离环境保持活跃五小时至超过20小时。
为实现攻击者与受害者之间的共置,攻击者Worker通过fetch调用受害者Worker,这在大多数情况下会使二者在同一边缘服务器上的同一进程中运行。该方法还使研究人员能够利用边缘数据中心负载较低的时段,提高测量稳定性。
Cloudflare的防御措施实际上发生了哪些变化?
Cloudflare引入了多项调整,而不是依赖单一措施。V8 Sandbox现已成为保护层的一部分,旨在减少JavaScript堆大部分区域中宽度为64位的原始指针存在。这使研究中使用的一些推测混淆工具更难以复用,但并不能完全解决Spectre攻击,因为仍可能出现能够实现越界内存访问的其他工具或形式。
2025年9月,公司发布了基于Memory Protection Keys(即MPK)的进程内隔离。该技术将内存划分为保护域,并以较低成本切换访问权限,使每个隔离环境的堆都处于由硬件强制实施的屏障之后。这阻止了攻击所依赖的隔离环境堆之间的直接读取,但并未消除Spectre的所有风险;保护域数量有限,而且系统需要精确管理保护密钥状态。
Cloudflare还改进了DyPrIs机制,以应对长期运行的执行过程和高强度输入输出负载。当WebSocket连接或Durable Object可以将调用保持数小时时,仅等待调用结束后再隔离脚本是不够的。公司还在研究将远程计时行为加入检测信号,尤其是在高计算量部分反复执行类似计时器的操作时,而不是将伴随的网络流量视为普通噪声。
结果的局限性
测试针对的是由Cloudflare和研究人员控制的Workers,而不是证明实际入侵了真实租户。公司还说明,最高泄漏速率是以牺牲准确率为代价获得的,并且在此前三年中没有发现实际利用的迹象。因此,研究结果揭示了在此前隔离模型中一种可执行的攻击能力,也凸显了结合进程隔离、硬件强制的内存保护和持续行为检测的重要性。