Firefox 中一个 隐蔽但危险的内存漏洞 在被安全研究人员发现前已静默存在六个月,影响超过 1.8 亿用户。
该漏洞允许攻击者通过 恶意构造的 WebAssembly 负载 破坏内存,甚至可能执行任意代码。
“Aisle 的自主 AI 系统在我们对 WebAssembly 安全的深入研究中发现了这个微妙的边界条件漏洞,为约 1.8 亿 Firefox 用户揭示了重大的内存安全风险,”AISLE 创始人兼首席科学家 Stanislav Fort 在博客文章中表示。
他补充道:“Mozilla 迅速采取行动部署了修复程序。现代浏览器是现存最安全、设计最严谨的平台之一,这一发现凸显了持续的、AI 驱动的安全研究对于保障全球用户安全的重要性。”
暴露 Firefox 用户的隐藏代码错误
该漏洞(CVE-2025-13016)的核心是 Firefox WebAssembly 垃圾回收(GC)实现中的一个 微妙指针算术错误,具体位于 StableWasmArrayObjectElements 类中,其中不匹配的指针类型导致内联数组数据的错误复制。
易受攻击的代码使用字节寻址指针(uint8_t*)来确定要复制的数据量,但将数据复制到类型为 uint16_t 的缓冲区中。当模板为 16 位值实例化时,std::copy() 将基于字节的范围解释为类型化元素的计数,而非字节数。
结果,一个旨在容纳 N 个 16 位元素的缓冲区接收了 2N 个元素,导致 堆栈内存溢出 并破坏相邻数据结构。第二个缺陷加剧了问题:复制操作没有从正确的内存位置读取数据。
代码没有使用数组数据区域的专用指针,而是从 inlineStorage() 中提取数据,该位置以内部对象元数据开头。
这意味着复制到缓冲区的前几个字节根本不是数组内容,而是 WebAssembly 对象本身的结构信息。这引入了额外的不可预测性,并增加了在利用过程中将损坏内存武器化的可能性。
攻击者利用此 Firefox 漏洞所需的条件
并非 Firefox 中的每条执行路径都会触及有缺陷的例程,这也是该漏洞长期未被发现的原因。
该问题仅在 Firefox 回退到较慢的、支持 GC 的路径处理 WebAssembly 数组时发生——特别是在将这些数组转换为字符串的过程中。
在典型序列中,WebAssembly 代码首先操作一个数组,例如 char16_t 数组。Firefox 然后尝试使用旨在避免垃圾回收的快速路径操作将该数组转换为字符串。然而,当某些条件(最常见的是内存压力)导致该快速路径失败时,浏览器会切换到允许 GC 的回退例程。
正是在这个回退过程中,Firefox 调用了易受攻击的 StableWasmArrayObjectElements 构造函数,该构造函数执行有缺陷的复制操作,最终导致堆栈溢出,破坏相邻内存。
在实际攻击场景中,攻击者可以故意构造恶意 WebAssembly 模块来操纵此序列以利于他们。
通过创建特定大小的数组、故意使浏览器陷入内存压力以强制垃圾回收,并反复触发数组到字符串的转换过程,攻击者可以可靠地将 Firefox 推入易受攻击的回退路径。
这创建了一个受控环境,在其中,由此产生的内存损坏可以被定向到堆栈上的选定目标。








发表评论
您还未登录,请先登录。
登录