返回列表
🧠 阿头学 · 💬 讨论题

Mozilla 披露用 Claude Mythos + Agent 流水线大规模加固 Firefox

这篇文章最重要的判断是:LLM 在安全领域已经不是“会胡猜的玩具”,而是“能产出真实高危漏洞的生产工具”,但真正的壁垒显然不在模型名,而在 Mozilla 搭出的验证与分诊流水线。
打开原文 ↗

2026-05-08 原文链接 ↗
阅读简报
双语对照
完整翻译
原文
讨论归档

核心观点

  • 能力跃迁是真的,但不是模型单独完成的 Mozilla 给出的样本足够硬,覆盖 JIT、IPC、XSLT、DOM、布局、沙箱逃逸等高复杂度区域,因此“现代模型已经能稳定发现真实漏洞”这个结论站得住;但把成果主要归功于 Claude Mythos Preview 仍然有宣传色彩,因为文章自己也承认效果来自模型升级、harness、VM 并行、工程师分诊和 100+ 人修复协作的叠加。
  • 真正有价值的是“发现—验证—修复”闭环 文章最可信的部分不是 271 个漏洞这个数字,而是 Mozilla 明确说早期静态式 LLM 审计误报太高,直到 agent harness 能自己生成测试、动态验证、排除不可复现假设,系统才从实验变成可扩展生产力;这说明 AI 安全的门槛已经从“会不会看代码”转向“能不能闭环验证”。
  • 沙箱逃逸成为 AI 审计的高价值战场 文中大量案例都属于 fuzz 很难覆盖的沙箱逃逸和跨进程逻辑错误,这一点判断很关键:AI 不是简单补 fuzz 的洞,而是在复杂语义推理、跨边界建模、构造攻击链局部环节上表现出了新优势;这意味着浏览器、操作系统、中间件等高复杂系统会最先受到冲击。
  • 防御收益不只在多抓漏洞,还在验证架构防线 Mozilla 提到模型多次尝试旧的原型污染逃逸路径但被“冻结原型”的架构改动挡住,这个信号很强:AI 不只是漏洞挖掘器,也是防御有效性的压力测试器;不过这类“没找到所以防御有效”的解释仍偏乐观,因为也可能是模型没覆盖到或预算不足。
  • “现在所有项目都该上”这个结论过于激进 对有成熟测试基础设施和安全团队的大项目,这个建议是正确的;但对没有沙箱环境、缺少分诊能力、没有 VM 编排和发布流程的普通团队,这种做法短期更可能制造处理成本,而不是立刻带来净收益,因此文章在推广上明显低估了 adoption 门槛。

跟我们的关联

  • 对 ATou 意味着什么、下一步怎么用 这说明 AI 真正的产品价值不在“更强回答”,而在“把猜想变成可执行验证”;下一步可以把这个框架迁移到任何高价值 agent 场景,用“模型层—工具层—流水线层—组织响应层”去审视产品设计,而不是只比拼模型。
  • 对 Neta 意味着什么、下一步怎么用 这证明组织能力会决定 AI 红利能不能落地,发现问题的速度一旦提升,瓶颈会迅速转向分诊、优先级、修复和发布;下一步应把“消化能力”视为 AI 时代的主战场,优先补中后台流程,而不是只追新模型。
  • 对 Uota 意味着什么、下一步怎么用 这篇文章能帮你判断 AI 安全赛道的真实护城河:不是单个模型,也不是 PR 数字,而是谁先把验证 harness 和工程闭环搭起来;下一步看项目或公司时,应追问误报率、单位漏洞成本、人工复核负担,而不是只看发现总数。
  • 对通用读者意味着什么、下一步怎么用 这不是“Firefox 被 AI 打穿”,而是“浏览器厂商已经被迫用 AI 提前打自己”;下一步如果你做软件,不一定立刻复制 Mozilla 全套,但至少该从一个小范围模块开始搭最小闭环审计流程,否则未来只会更被动。

讨论引子

1. 如果没有 Mozilla 现成的 fuzz 基建、VM 环境和 100+ 人协作,这套 LLM 安全流水线还能成立到什么程度? 2. 我们该把安全成果归因给 Claude Mythos,还是归因给“模型可插拔 + harness + 工程组织”这个系统? 3. 当 AI 让漏洞发现速度远超人工修复速度时,安全团队最先该优化的是模型、流程,还是发布机制?

两周前,我们宣布,在 Claude Mythos Preview 和其他 AI 模型的帮助下,我们发现并修复了 Firefox 中数量空前的潜在安全漏洞。本文会更详细地介绍我们是如何开展这项工作的、发现了什么,以及给其他项目的一些建议,帮助大家善用这些新出现的能力来加固自身、防御攻击。

漏洞突然变得非常厉害

就在几个月前,AI 生成并提交给开源项目的安全漏洞报告,大多还因为质量低劣而不受欢迎。处理那些看起来像是真的、其实却是错的报告,会给项目维护者带来不对称的成本。用 LLM 提示一下,让它在代码里找个问题,既便宜又快。可要去回应这种报告,却既慢又贵。

很难夸大这几个月里这种局面变化得有多快。这主要来自两个因素的叠加。第一,模型本身变强了很多。第二,我们在如何_驾驭_这些模型上有了大幅进步,也就是如何引导它们、扩展它们、叠加它们,从而产出大量有效信号,并过滤掉噪声。

通常情况下,在发布修复并发出安全公告后,我们会把详细的漏洞报告继续保密几个月。这主要是出于谨慎,保护那些因为各种原因没有及时升级到最新版 Firefox 的用户。考虑到大家对这个话题的关注度异常之高,以及整个软件生态都需要尽快采取行动,我们经过权衡,决定公开一小部分最近已发布修复背后的报告样本。我们尽量让这些样本覆盖浏览器中不同的子系统,但选择过程仍然带有一定随意性。即便如此,我们仍希望这些报告在深度和多样性上的表现,能支撑我们对这类能力的判断,也能支撑我们呼吁防守方尽快开始使用这些技术:

Bug ID 描述
2024918 一处错误的相等性检查会导致 JIT 把一个仍然存活的 WebAssembly GC 结构体初始化优化掉,从而构造出伪对象原语,并可能实现任意读写。这段代码此前已经历了内部和外部研究人员的大量 fuzz 测试。
2024437 一个存在了 15 年的 <legend> 元素漏洞,通过对浏览器中相距甚远的多个边界条件进行精细编排而触发,其中包括递归栈深度限制、expando 属性以及循环回收。
2021894 能稳定利用 IPC 上的一个竞态条件,使已被攻陷的内容进程操纵父进程中的 IndexedDB 引用计数,从而触发 UAF,并可能实现沙箱逃逸。
2022034 一个原始 NaN 穿过 IPC 边界后,可以伪装成带标签的 JS 对象指针,把双重反序列化变成父进程中的伪对象原语,用于沙箱逃逸。
2024653 一个复杂的测试用例,穿梭于嵌套事件循环、pagehide 监听器和垃圾回收之间,从而触发 <object> 元素属性 setter 中的 UAF。
2022733 通过向 WebTransport 灌入数千个证书哈希,拉长一个高度依赖引用计数的拷贝循环中的竞态窗口,从而在父进程触发 UAF,并从已被攻陷的内容进程经由 IPC 利用这一竞态条件。
2023958 通过拦截 glibc 的 DNS 函数调用来模拟恶意 DNS 服务器,以复现一个 UDP 到 TCP 回退的边界情况,从而在 HTTPS RR 与 ECH 解析期间触发缓冲区越界读取以及父进程栈内存泄露。
2025977 一个存在了 20 年的 XSLT 漏洞,其中可重入的 key() 调用会导致哈希表重哈希,在原始条目指针仍在使用时释放其底层存储。这只是我们修复的多个 XSLT sec-high 问题之一。
2027298 通过给颜色选择器打补丁来模拟原本无法自动化的用户选择,再利用一个同步输入事件转出嵌套事件循环,重新进入 actor 销毁流程,在回调仍在退栈时将其释放,从而触发内容进程 UAF。
2023817 已被攻陷的内容进程可以发送任意壁纸图像到父进程中解码。如果图像解码器中再配合一个假设性的漏洞,就可能实现沙箱逃逸。这需要对父进程输入的信任级别进行难以自动化的推理。
2029813 利用我们用于将值从沙箱边界的不可信侧复制到可信侧时所采用验证逻辑中的一个缺口,逃逸了第三方库的进程内沙箱技术 RLBox
2026305 一个极小的测试用例,通过在 HTML 表格中追加超过 65535 行,利用特殊的 rowspan=0 语义绕过限制并让一个 16 位布局位字段溢出,多年来一直没有被 fuzz 工具发现。

请注意,其中不少漏洞都属于_沙箱逃逸_。它们还需要和其他利用链配合,才能形成对 Firefox 的_完整链路_攻破。这类报告假设负责渲染网页内容的沙箱进程已经先被另一个独立漏洞攻陷,此时攻击者控制的机器码正在运行,试图把控制权进一步提升到高权限的父进程。在构造沙箱逃逸时,模型被允许修改 Firefox 源码,只要这些改动后的代码被限制为只能在沙箱进程中运行[1]。这类漏洞向来很难靠 fuzz 找到。虽然我们也在开发新技术来弥补这一空白,但 AI 分析对这一关键攻击面的覆盖要全面得多。

和模型找到了什么同样有意思的,是它们_没能_找到什么。这不是因为它们没试,而是因为它们没能绕过 Firefox 的分层防御。举个例子,近些年我们收到过几份很聪明的研究报告,通过在高权限父进程中触发原型污染来逃出进程沙箱。我们没有逐个修这些问题,而是做了一项架构调整,默认冻结这些原型。回看 harness 的审计日志时,我们看到了很多沿着这条路线尝试逃逸的_尝试_,但都被这个设计拦住了。能直接看到以往加固工作带来的回报,比继续发现并修更多漏洞还更令人满足。

驾驭模型,搭建加固流水线

过去几年里,我们一直在内部尝试用 LLM 做代码安全审计。早期尝试使用过 GPT 4、Sonnet 3.5 之类的模型,对高风险代码做静态分析,寻找漏洞。这些实验显示出了一些潜力,但误报率太高,无法真正扩展到大规模使用。

能够稳定发现安全问题的 agent 型 harness 出现之后,情况彻底变了。它们不仅能找到真实漏洞,还能排除那些无法复现的推测。这样的 harness 最关键的特征是,只要给对接口和指令,它就能创建并运行可复现的测试用例,动态验证关于代码漏洞的各种假设。2 月份修完 Anthropic 发给我们的第一批问题后,我们在现有的fuzz 基础设施之上,搭建了自己的 harness。

我们最开始做的是小规模实验,用 Claude Opus 4.6 提示 harness 去找沙箱逃逸。即便是这个模型,也已经帮我们识别出数量可观、此前未知的漏洞,而这些漏洞都要求对多进程浏览器引擎代码进行复杂推理。最初阶段,我们在终端里盯着整个过程,实时观察它的表现,并调整提示词和逻辑。等这套东西运转顺畅后,我们把任务并行化,分发到多个临时 VM 上。每台 VM 负责围绕一个特定目标文件寻找漏洞,再把结果写回同一个 bucket。

发现子系统是必要条件,但还不够。想把这件事扩展起来,就必须把它接进完整的安全漏洞生命周期,也就是先决定找什么、去哪找,以及对产出的结果怎么处理。最后这一部分包括和已知问题去重、跟踪漏洞、做分诊,以及把修复真正发出去。模型是驱动 harness 的核心原语,但要在规模化场景里真正有用,离不开这整条流水线。

harness 本身也许能跨项目复用,但这条流水线天生是项目特定的,因为它会反映每个代码库自己的语义、工具链和流程。把这套体系真正搭起来,离不开大量迭代,而且必须和负责接收并处理这些漏洞的 Firefox 工程师保持紧密的反馈回路。

升级模型

一旦端到端流水线搭起来,后面只要有新模型可用,替换进去几乎不费事。及早建设这条流水线,让我们先用公开可用的模型找到了不少严重漏洞,也让我们在有机会评估 Claude Mythos Preview 时,能够立刻上手。在我们的经验里,模型升级会提升整条流水线的效果。系统会同时在三个方面变强,分别是发现潜在漏洞、构造概念验证测试用例来证明它们,以及清楚说明它们的病理机制和影响。

除了修复 Claude Mythos Preview 在 150 版本发布中识别出的 271 个漏洞,我们也已经在 149.0.2150.0.1150.0.2 中发布了更多相关修复。与此同时,我们内部也在继续通过其他方式发现漏洞。和其他项目类似,最近几个月我们看到外部提交的报告数量也明显上升。

Image 1: A graph showing the volume of Firefox security bug fixes shipped by month, trending in the 20-30 range throughout each month in 2025, with a spike to 60-70 in February and March 2026, up to 423 in April 2026

归根到底,每一个漏洞都需要被认真对待,才能被正确修复。过去几个月里,为了跟上这波前所未有的数量,我们投入了大量工作,也熬了不少长时间的班。团队在应对这个挑战时展现出的投入和执行力,让我们非常自豪。为了交付迄今为止最安全的 Firefox,有超过 100 人为这项工作贡献了代码。除了撰写和审查补丁之外,还有人在搭建和扩展这条流水线、分诊漏洞、测试修复,以及为每一个漏洞管理发布流程。

要点总结

任何在做软件的人,今天就可以开始使用现代模型配合 harness 来找漏洞、加固代码。我们的建议是,现在就开始。你一定会发现漏洞,也会为将来新模型一出现就能立刻用上打好基础。

你可以从非常简单的提示开始,然后观察,再迭代。我们最初的提示和这里描述的方式并没有太大不同。经过不断迭代,我们补上了很多编排层和工具层,用来优化并扩展这条流水线,但内层循环的本质一直没变,也就是,这段代码里有个漏洞,请把它找出来,并写出测试用例。

我们还没有把 Firefox 里所有潜在漏洞都挖到底,但对当前的趋势已经相当满意。今天,我们的扫描仍然主要聚焦在代码中的特定区域,比如某些文件、某些函数。系统要看哪里,是由人工判断和自动信号共同决定的。接下来不久,我们打算把这类分析接入持续集成系统,在补丁进入代码树时就开始扫描。模型对上下文形式非常灵活,我们预计基于补丁的扫描效果会和基于文件的扫描一样好,甚至更好。

当下这个时刻既危险,也充满机会。一起把互联网变得更安全吧。


常见问题

公告里说是 271 个漏洞,但我数出来不一样。这是怎么回事

安全公告网页上,我们把所有内部报告的问题归并为带有多个子漏洞的 rollup CVE。这个网页由 foundation-security-advisories 仓库中的 yaml 生成,而那里也是我们分配 CVE 的规范来源。虽然有些浏览器对内部发现的问题根本不会创建 CVE 标识,但我们还是提供这些信息,以尽可能保持透明。

在 Firefox 150 中,有三个内部汇总项,分别是 CVE-2026-6784 共 154 个漏洞,CVE-2026-6785 共 55 个漏洞,以及 CVE-2026-6786 共 107 个漏洞。

细心的读者会发现,这三个内部汇总项加起来是 316 个漏洞,比我们宣布由 Claude Mythos Preview 找到的 271 个还多。这是因为我们的安全团队每天都会用多种方式攻击 Firefox、寻找新漏洞,其中包括 fuzz 系统、人工检查,以及这条基于多种模型的新 agent 流水线。

我们在 4 月发布的版本中总共修复了 423 个安全漏洞。除了两周前宣布的 271 个之外,还有 41 个来自外部报告,剩下的 111 个则是内部发现的,大致平均分成三类:

  1. 使用 Claude Mythos Preview 配合这条流水线找到,但修复发布在 Firefox 150 以外版本中的漏洞
  2. 使用其他模型配合这条流水线找到的漏洞
  3. 使用 fuzz 等其他技术找到的漏洞

还要说明的是,我们另外还把 3 个 CVE 直接记在了 Anthropic 名下,和这次最新工作分开计算,分别是 CVE-2026-6746、CVE-2026-6757、CVE-2026-6758。这些修复对应的是几个月前那支非常出色的 Anthropic Frontier Red 团队发给我们的漏洞。按照我们平时的流程,我们为每个漏洞分别分配了独立的 CVE。

安全等级是什么意思

为了提供更多背景,我们会给漏洞标上从 critical 到 low 的安全严重性等级,以表示问题的紧迫程度:

  • sec-criticalsec-high 用于那些在用户正常使用行为下就能触发的漏洞,比如浏览某个网页。我们在_技术上_并不区分这两者,但 sec-critical 只保留给那些已经公开披露,或已知正在野外被利用的问题。
  • sec-moderate 用于那些本来应算作 sec-high,但需要受害者配合不寻常且复杂步骤才能触发的漏洞。
  • sec-low 用于那些令人烦恼,但离真正伤害用户还很远的问题,比如安全的崩溃。

在我们为 Firefox 150 公布的 271 个漏洞中,180 个是 sec-high,80 个是 sec-moderate,11 个是 sec-low

虽然我们最关注的是 critical 和 high 级别的问题,但为了修复正确性问题,以及出于纵深防御考虑,我们优先处理 moderate 和 low 级别的安全漏洞也是很正常的。

sec-highsec-critical 漏洞是否就等于可实际利用的攻击

不一定。

大多数情况下,单个 critical 或 high 级漏洞其实并不足以攻陷 Firefox。这是因为 Firefox 采用了纵深防御架构。比如利用一个 JIT 漏洞,通常也只能在一个受沙箱保护、且与特定站点对应的进程里实现远程代码执行。现实中的攻击者一般需要把多个利用串成链条,跨过一层或多层沙箱,再叠加操作系统层面的缓解机制,比如 ASLR,才能逐步提升权限。

我们通常也不会真的去构造利用,来验证某个漏洞在现实世界中是否能被攻击者实际使用。我们把漏洞归类为 sec-high,主要依据的是可预期的崩溃症状,比如 AddressSanitizer 报出的 use-after-free 或越界内存问题。我们的威胁模型默认认为,只要投入足够精力,这些问题都可能被利用。这样做可以降低在可利用性分析中出现漏判的风险,更重要的是,它能让我们把资源集中到发现和修复更多漏洞上。


[1] 我们的漏洞赏金计划也有类似规则

Firefox 杰出工程师

Brian Grinstead 的更多文章…

Christian 是 Mozilla 的 Firefox 技术负责人兼首席工程师。

Christian Holler 的更多文章…

Frederik Braun 负责管理 Firefox 应用安全团队。他常驻柏林,专注于为 Web 和 Mozilla Firefox 构建安全能力。作为标准领域的贡献者,Frederik 也在通过 Sanitizer API 和 Subresource Integrity 等规范,把安全性带入默认设置,从而改进 Web 平台。不工作的时候,Frederik 喜欢读一本好小说,或者骑车长途穿越欧洲。

Two weeks ago we announced that we had identified and fixed an unprecedented number of latent security bugs in Firefox with the help of Claude Mythos Preview and other AI models. In this post, we’ll go into more detail about how we approached this work, what we found, and advice for other projects on making good use of emerging capabilities to harden themselves against attack.

两周前,我们宣布,在 Claude Mythos Preview 和其他 AI 模型的帮助下,我们发现并修复了 Firefox 中数量空前的潜在安全漏洞。本文会更详细地介绍我们是如何开展这项工作的、发现了什么,以及给其他项目的一些建议,帮助大家善用这些新出现的能力来加固自身、防御攻击。

Suddenly, the bugs are very good

漏洞突然变得非常厉害

Just a few months ago, AI-generated security bug reports to open source projects were mostly known for being unwanted slop. Dealing with reports that look plausibly correct but are wrong imposes an asymmetric cost on project maintainers: it’s cheap and easy to prompt an LLM to find a “problem” in code, but slow and expensive to respond to it.

就在几个月前,AI 生成并提交给开源项目的安全漏洞报告,大多还因为质量低劣而不受欢迎。处理那些看起来像是真的、其实却是错的报告,会给项目维护者带来不对称的成本。用 LLM 提示一下,让它在代码里找个问题,既便宜又快。可要去回应这种报告,却既慢又贵。

It is difficult to overstate how much this dynamic changed for us over a few short months. This was due to a combination of two main factors. First, the models got a lot more capable. Second, we dramatically improved our techniques for harnessing these models — steering them, scaling them, and stacking them to generate large amounts of signal and filter out the noise.

很难夸大这几个月里这种局面变化得有多快。这主要来自两个因素的叠加。第一,模型本身变强了很多。第二,我们在如何_驾驭_这些模型上有了大幅进步,也就是如何引导它们、扩展它们、叠加它们,从而产出大量有效信号,并过滤掉噪声。

Ordinarily we keep detailed bug reports private for several months after shipping fixes and issuing security advisories, largely as a precaution to protect any users who, for whatever reason, were slow to update to the latest version of Firefox. Given the extraordinary level of interest in this topic and the urgency of action needed throughout the software ecosystem, we’ve made the calculated decision to unhide a small sample of the reports behind the fixes we recently shipped. We’ve attempted to draw them from a range of browser subsystems, but the selection process was still somewhat arbitrary. Nevertheless, we hope that the depth and diversity of these reports lends credence to our assessment of the capabilities and our calls for defenders to begin applying these techniques:

通常情况下,在发布修复并发出安全公告后,我们会把详细的漏洞报告继续保密几个月。这主要是出于谨慎,保护那些因为各种原因没有及时升级到最新版 Firefox 的用户。考虑到大家对这个话题的关注度异常之高,以及整个软件生态都需要尽快采取行动,我们经过权衡,决定公开一小部分最近已发布修复背后的报告样本。我们尽量让这些样本覆盖浏览器中不同的子系统,但选择过程仍然带有一定随意性。即便如此,我们仍希望这些报告在深度和多样性上的表现,能支撑我们对这类能力的判断,也能支撑我们呼吁防守方尽快开始使用这些技术:

Bug ID Description
2024918 An incorrect equality check can cause the JIT to optimize away the initialization of a live WebAssembly GC struct, creating a fake-object primitive with potential arbitrary read/write in code that had undergone extensive fuzzing by internal and external researchers.
2024437 A 15-year-old bug in the <legend> element triggered by meticulous orchestration of edge cases across distant parts of the browser, including recursion stack depth limits, expando properties, and cycle collection.
2021894 Reliably exploits a race condition over IPC, allowing a compromised content process to manipulate IndexedDB refcounts in the parent to trigger a UAF and potential sandbox escape.
2022034 A raw NaN crossing an IPC boundary can masquerade as a tagged JS object pointer, turning double deserialization into a parent-process fake-object primitive for a sandbox escape.
2024653 An intricate testcase weaving through nested event loops, pagehide listeners, and garbage collection to trigger a UAF in the attribute setter for <object> elements.
2022733 Triggers a parent UAF by flooding WebTransport with thousands of certificate hashes to stretch a race condition in a refcount-heavy copy loop, and exploits that race condition over IPC from a compromised content process.
2023958 Simulates a malicious DNS server by intercepting glibc DNS function calls in order to reproduce a UDP->TCP fallback edge case, triggering a buffer over-read and parent-process stack memory leak during HTTPS RR & ECH parsing.
2025977 20-year-old XSLT bug in which reentrant key() calls cause a hash table rehash that frees its backing store while a raw entry pointer is still in use (one of several sec-high issues we fixed involving XSLT).
2027298 Patches the color picker to simulate otherwise non-automatable user selection, then uses a synchronous input event to spin a nested event loop that re-enters actor teardown and frees the callback while it is still unwinding, triggering a content process UAF.
2023817 A compromised content process could send an arbitrary wallpaper image to be decoded in the parent process, which could be paired with a hypothetical vulnerability in an image decoder to escape the sandbox. This entailed difficult-to-automate reasoning about the trust-level of inputs in the parent process.
2029813 Escapes our in-process sandboxing technology for third-party libraries (RLBox) by leveraging a gap in the verification logic used to copy values from the untrusted to the trusted side of the sandbox boundary.
2026305 Extremely small testcase that exploits the special rowspan=0 semantics in HTML tables by appending >65535 rows to bypass clamping and overflow a 16-bit layout bitfield, which went undetected for years by fuzzers.
Bug ID 描述
2024918 一处错误的相等性检查会导致 JIT 把一个仍然存活的 WebAssembly GC 结构体初始化优化掉,从而构造出伪对象原语,并可能实现任意读写。这段代码此前已经历了内部和外部研究人员的大量 fuzz 测试。
2024437 一个存在了 15 年的 <legend> 元素漏洞,通过对浏览器中相距甚远的多个边界条件进行精细编排而触发,其中包括递归栈深度限制、expando 属性以及循环回收。
2021894 能稳定利用 IPC 上的一个竞态条件,使已被攻陷的内容进程操纵父进程中的 IndexedDB 引用计数,从而触发 UAF,并可能实现沙箱逃逸。
2022034 一个原始 NaN 穿过 IPC 边界后,可以伪装成带标签的 JS 对象指针,把双重反序列化变成父进程中的伪对象原语,用于沙箱逃逸。
2024653 一个复杂的测试用例,穿梭于嵌套事件循环、pagehide 监听器和垃圾回收之间,从而触发 <object> 元素属性 setter 中的 UAF。
2022733 通过向 WebTransport 灌入数千个证书哈希,拉长一个高度依赖引用计数的拷贝循环中的竞态窗口,从而在父进程触发 UAF,并从已被攻陷的内容进程经由 IPC 利用这一竞态条件。
2023958 通过拦截 glibc 的 DNS 函数调用来模拟恶意 DNS 服务器,以复现一个 UDP 到 TCP 回退的边界情况,从而在 HTTPS RR 与 ECH 解析期间触发缓冲区越界读取以及父进程栈内存泄露。
2025977 一个存在了 20 年的 XSLT 漏洞,其中可重入的 key() 调用会导致哈希表重哈希,在原始条目指针仍在使用时释放其底层存储。这只是我们修复的多个 XSLT sec-high 问题之一。
2027298 通过给颜色选择器打补丁来模拟原本无法自动化的用户选择,再利用一个同步输入事件转出嵌套事件循环,重新进入 actor 销毁流程,在回调仍在退栈时将其释放,从而触发内容进程 UAF。
2023817 已被攻陷的内容进程可以发送任意壁纸图像到父进程中解码。如果图像解码器中再配合一个假设性的漏洞,就可能实现沙箱逃逸。这需要对父进程输入的信任级别进行难以自动化的推理。
2029813 利用我们用于将值从沙箱边界的不可信侧复制到可信侧时所采用验证逻辑中的一个缺口,逃逸了第三方库的进程内沙箱技术 RLBox
2026305 一个极小的测试用例,通过在 HTML 表格中追加超过 65535 行,利用特殊的 rowspan=0 语义绕过限制并让一个 16 位布局位字段溢出,多年来一直没有被 fuzz 工具发现。

Note that a number of these bugs are sandbox escapes, which would need to be combined with other exploits to achieve a full-chain Firefox compromise. These reports presume that the sandboxed process that renders site content has already been compromised with some separate bug, and is now running attacker-controlled machine code attempting to escalate control into the privileged parent process. When crafting a sandbox escape, the model is permitted to patch the Firefox source code, so long as the modified code is restricted to run only in the sandboxed process[1]. Such bugs are notoriously difficult to find with fuzzing, and while we’ve had some success developing new techniques to close this gap, AI analysis provides much more comprehensive coverage of this critical surface.

请注意,其中不少漏洞都属于_沙箱逃逸_。它们还需要和其他利用链配合,才能形成对 Firefox 的_完整链路_攻破。这类报告假设负责渲染网页内容的沙箱进程已经先被另一个独立漏洞攻陷,此时攻击者控制的机器码正在运行,试图把控制权进一步提升到高权限的父进程。在构造沙箱逃逸时,模型被允许修改 Firefox 源码,只要这些改动后的代码被限制为只能在沙箱进程中运行[1]。这类漏洞向来很难靠 fuzz 找到。虽然我们也在开发新技术来弥补这一空白,但 AI 分析对这一关键攻击面的覆盖要全面得多。

Just as interesting as what the models found is what they didn’t find — not because they didn’t try, but because they were unable to circumvent Firefox’s layered defenses. For example, in recent years we received several clever reports from security researchers that managed to escape the process sandbox by triggering prototype pollution in the privileged parent process. Rather than fixing these problems one-by-one, we made an architectural change to freeze these prototypes by default. While auditing logs from the harness, we saw many attempts to pursue this line of escape that were thwarted by this design. Observing such direct payoff from previous hardening work was even more rewarding than finding and fixing more bugs.

和模型找到了什么同样有意思的,是它们_没能_找到什么。这不是因为它们没试,而是因为它们没能绕过 Firefox 的分层防御。举个例子,近些年我们收到过几份很聪明的研究报告,通过在高权限父进程中触发原型污染来逃出进程沙箱。我们没有逐个修这些问题,而是做了一项架构调整,默认冻结这些原型。回看 harness 的审计日志时,我们看到了很多沿着这条路线尝试逃逸的_尝试_,但都被这个设计拦住了。能直接看到以往加固工作带来的回报,比继续发现并修更多漏洞还更令人满足。

Harnessing Models to Build a Hardening Pipeline

驾驭模型,搭建加固流水线

We’ve experimented internally with LLM code audits over the past few years, with early attempts using models like GPT 4 or Sonnet 3.5 to statically analyze high risk code for vulnerabilities. These experiments showed some promise, but the high rate of false positives made them impractical to scale.

过去几年里,我们一直在内部尝试用 LLM 做代码安全审计。早期尝试使用过 GPT 4、Sonnet 3.5 之类的模型,对高风险代码做静态分析,寻找漏洞。这些实验显示出了一些潜力,但误报率太高,无法真正扩展到大规模使用。

The introduction of agentic harnesses that can reliably detect security issues has completely changed this. These can find real bugs and dismiss unreproducible speculation. The key feature of such a harness is that, given the right interfaces and instructions, it can create and run reproducible test cases to dynamically test hypotheses about bugs in code. After fixing the initial set of issues that Anthropic sent to us in February, we built our own harness atop our existing fuzzing infrastructure.

能够稳定发现安全问题的 agent 型 harness 出现之后,情况彻底变了。它们不仅能找到真实漏洞,还能排除那些无法复现的推测。这样的 harness 最关键的特征是,只要给对接口和指令,它就能创建并运行可复现的测试用例,动态验证关于代码漏洞的各种假设。2 月份修完 Anthropic 发给我们的第一批问题后,我们在现有的fuzz 基础设施之上,搭建了自己的 harness。

We began with small-scale experiments prompting the harness to look for sandbox escapes with Claude Opus 4.6. Even with this model, we identified an impressive amount of previously-unknown vulnerabilities which required complex reasoning over multiprocess browser engine code. At first, we supervised the process in the terminal to observe the process in real-time and tune the prompts and logic. Once this was working well, we parallelized the jobs across multiple ephemeral VMs, each tasked to hunt for bugs within a specific target file and write its findings back to a bucket.

我们最开始做的是小规模实验,用 Claude Opus 4.6 提示 harness 去找沙箱逃逸。即便是这个模型,也已经帮我们识别出数量可观、此前未知的漏洞,而这些漏洞都要求对多进程浏览器引擎代码进行复杂推理。最初阶段,我们在终端里盯着整个过程,实时观察它的表现,并调整提示词和逻辑。等这套东西运转顺畅后,我们把任务并行化,分发到多个临时 VM 上。每台 VM 负责围绕一个特定目标文件寻找漏洞,再把结果写回同一个 bucket。

A discovery subsystem is necessary but not sufficient. In order to scale the effort, we needed to integrate it with our full security bug lifecycle: determining what to look for, where to look, and how to handle what it produces. This last part includes deduplicating against known issues, tracking bugs, triaging them, and getting fixes shipped. While the model is the core primitive powering the harness, this full pipeline is necessary to make it useful at scale.

发现子系统是必要条件,但还不够。想把这件事扩展起来,就必须把它接进完整的安全漏洞生命周期,也就是先决定找什么、去哪找,以及对产出的结果怎么处理。最后这一部分包括和已知问题去重、跟踪漏洞、做分诊,以及把修复真正发出去。模型是驱动 harness 的核心原语,但要在规模化场景里真正有用,离不开这整条流水线。

While harnesses may be reusable across projects, this pipeline is inherently project-specific, reflecting each codebase’s semantics, tooling, and processes. Standing this up required significant iteration, with a tight feedback loop alongside the Firefox engineers who were fielding the incoming bugs.

harness 本身也许能跨项目复用,但这条流水线天生是项目特定的,因为它会反映每个代码库自己的语义、工具链和流程。把这套体系真正搭起来,离不开大量迭代,而且必须和负责接收并处理这些漏洞的 Firefox 工程师保持紧密的反馈回路。

Upgrading the Models

升级模型

Once the end-to-end pipeline is in place, it’s trivial to swap in different models when they become available. Building this pipeline early helped us find a number of serious bugs using publicly-available models, and it also helped us hit the ground running when we had the opportunity to evaluate Claude Mythos Preview. In our experience, model upgrades increase the effectiveness of the entire pipeline: the system gets simultaneously better at finding potential bugs, creating proof-of-concept test cases to demonstrate them, and articulating their pathology and impact.

一旦端到端流水线搭起来,后面只要有新模型可用,替换进去几乎不费事。及早建设这条流水线,让我们先用公开可用的模型找到了不少严重漏洞,也让我们在有机会评估 Claude Mythos Preview 时,能够立刻上手。在我们的经验里,模型升级会提升整条流水线的效果。系统会同时在三个方面变强,分别是发现潜在漏洞、构造概念验证测试用例来证明它们,以及清楚说明它们的病理机制和影响。

In addition to fixing the 271 bugs identified by Claude Mythos Preview in the 150 release, we’ve shipped more of these fixes in 149.0.2, 150.0.1, and 150.0.2. We also continue to find bugs with other means internally, and, similar to other projects, we’ve seen a significant uptick in external reports in the last few months.

除了修复 Claude Mythos Preview 在 150 版本发布中识别出的 271 个漏洞,我们也已经在 149.0.2150.0.1150.0.2 中发布了更多相关修复。与此同时,我们内部也在继续通过其他方式发现漏洞。和其他项目类似,最近几个月我们看到外部提交的报告数量也明显上升。

Image 1: A graph showing the volume of Firefox security bug fixes shipped by month, trending in the 20-30 range throughout each month in 2025, with a spike to 60-70 in February and March 2026, up to 423 in April 2026

Ultimately, every bug requires care and attention to properly fix. Staying on top of this unprecedented volume has led to a lot of work and long days over the last few months, and we’re extremely proud of how the team has stepped up to meet this challenge. Over 100 people contributed code to this effort to ship the most secure Firefox yet. In addition to writing and reviewing patches, others have been building and scaling this pipeline, triaging, testing the fixes, and managing the release process for each bug.

归根到底,每一个漏洞都需要被认真对待,才能被正确修复。过去几个月里,为了跟上这波前所未有的数量,我们投入了大量工作,也熬了不少长时间的班。团队在应对这个挑战时展现出的投入和执行力,让我们非常自豪。为了交付迄今为止最安全的 Firefox,有超过 100 人为这项工作贡献了代码。除了撰写和审查补丁之外,还有人在搭建和扩展这条流水线、分诊漏洞、测试修复,以及为每一个漏洞管理发布流程。

Takeaways

要点总结

Anyone building software can start using a harness with a modern model to find bugs and harden their code today. We recommend getting started now. You will find bugs, and you will set yourself up to take advantage of new models as soon as they become available.

任何在做软件的人,今天就可以开始使用现代模型配合 harness 来找漏洞、加固代码。我们的建议是,现在就开始。你一定会发现漏洞,也会为将来新模型一出现就能立刻用上打好基础。

You can start with very simple prompting, then observe and iterate. Our initial prompts were not dissimilar from those described here. Through iteration we’ve built out a lot of orchestration and tooling to optimize and scale the pipeline, but the essence of the inner loop remains the same: there is a bug in this part of the code, please find it and build a testcase.

你可以从非常简单的提示开始,然后观察,再迭代。我们最初的提示和这里描述的方式并没有太大不同。经过不断迭代,我们补上了很多编排层和工具层,用来优化并扩展这条流水线,但内层循环的本质一直没变,也就是,这段代码里有个漏洞,请把它找出来,并写出测试用例。

We haven’t bottomed on all the latent bugs in Firefox, but are quite pleased with the trajectory. Today, our scanning is largely focused on specific areas of the code (files, functions) where we instruct the system to look, based on a mix of human judgement and automated signals. In the near future, we intend to integrate this analysis into our continuous integration system to scan patches as they land in the tree. Models are quite flexible with the form of context provided, and we expect patch-based scanning to work as well or even better than file-based scanning.

我们还没有把 Firefox 里所有潜在漏洞都挖到底,但对当前的趋势已经相当满意。今天,我们的扫描仍然主要聚焦在代码中的特定区域,比如某些文件、某些函数。系统要看哪里,是由人工判断和自动信号共同决定的。接下来不久,我们打算把这类分析接入持续集成系统,在补丁进入代码树时就开始扫描。模型对上下文形式非常灵活,我们预计基于补丁的扫描效果会和基于文件的扫描一样好,甚至更好。

The current moment is a perilous one, but also full of opportunity. Let’s work together to secure the internet.

当下这个时刻既危险,也充满机会。一起把互联网变得更安全吧。



FAQ

常见问题

The announcement said “271 bugs”, but I count something different. What’s going on?

公告里说是 271 个漏洞,但我数出来不一样。这是怎么回事

On the advisories web page we group all internally-reported bugs as “rollup” CVEs with multiple bugs underneath them. The web page is built from yaml in the foundation-security-advisories repo, the canonical location for our CVE assignments. While some browsers do not create CVE identifiers for internally-discovered issues at all, we provide this information in order to be as transparent as possible.

安全公告网页上,我们把所有内部报告的问题归并为带有多个子漏洞的 rollup CVE。这个网页由 foundation-security-advisories 仓库中的 yaml 生成,而那里也是我们分配 CVE 的规范来源。虽然有些浏览器对内部发现的问题根本不会创建 CVE 标识,但我们还是提供这些信息,以尽可能保持透明。

In Firefox 150, there were three internal rollups: CVE-2026-6784 (154 bugs), CVE-2026-6785 (55 bugs), and CVE-2026-6786 (107 bugs).

在 Firefox 150 中,有三个内部汇总项,分别是 CVE-2026-6784 共 154 个漏洞,CVE-2026-6785 共 55 个漏洞,以及 CVE-2026-6786 共 107 个漏洞。

Astute readers will notice the number of bugs in those internal rollups adds up to 316, which is more than the 271 we announced finding with Claude Mythos Preview. That’s because our security team hunts for new bugs every day by attacking Firefox with a combination of (a) fuzzing systems (b) manual inspection and (c) this new agentic pipeline across a variety of models.

细心的读者会发现,这三个内部汇总项加起来是 316 个漏洞,比我们宣布由 Claude Mythos Preview 找到的 271 个还多。这是因为我们的安全团队每天都会用多种方式攻击 Firefox、寻找新漏洞,其中包括 fuzz 系统、人工检查,以及这条基于多种模型的新 agent 流水线。

We fixed a total of 423 security bugs in releases in April. In addition to the 271 bugs announced two weeks ago, there were 41 externally reported bugs, with the remaining 111 discovered internally and split roughly in third between:

我们在 4 月发布的版本中总共修复了 423 个安全漏洞。除了两周前宣布的 271 个之外,还有 41 个来自外部报告,剩下的 111 个则是内部发现的,大致平均分成三类:

  1. Bugs found using this pipeline with Claude Mythos Preview but fixed in releases other than Firefox 150
  2. Bugs found using this pipeline with other models
  3. Bugs found with other techniques like fuzzing
  1. 使用 Claude Mythos Preview 配合这条流水线找到,但修复发布在 Firefox 150 以外版本中的漏洞
  2. 使用其他模型配合这条流水线找到的漏洞
  3. 使用 fuzz 等其他技术找到的漏洞

Note that we also directly credited 3 CVEs to Anthropic separate from this latest effort (CVE-2026-6746, CVE-2026-6757, CVE-2026-6758). These were fixes for bugs sent to us by the outstanding Anthropic Frontier Red team a couple months ago and we assigned unique CVEs for each as per our normal process.

还要说明的是,我们另外还把 3 个 CVE 直接记在了 Anthropic 名下,和这次最新工作分开计算,分别是 CVE-2026-6746、CVE-2026-6757、CVE-2026-6758。这些修复对应的是几个月前那支非常出色的 Anthropic Frontier Red 团队发给我们的漏洞。按照我们平时的流程,我们为每个漏洞分别分配了独立的 CVE。

What do security ratings mean?

安全等级是什么意思

As additional context, we apply security severity ratings from critical to low to indicate the urgency of a bug:

为了提供更多背景,我们会给漏洞标上从 critical 到 low 的安全严重性等级,以表示问题的紧迫程度:

  • sec-critical and sec-high are assigned to vulnerabilities that can be triggered with normal user behavior, like browsing to a web page. We make no technical difference between these, but sec-critical bugs are reserved for issues that are publicly disclosed or known to be exploited in the wild.
  • sec-moderate is assigned to vulnerabilities that would otherwise be rated sec-high but require unusual and complex steps from the victim.
  • sec-low is assigned to bugs that are annoying but far from causing user harm (e.g, a safe crash).
  • sec-criticalsec-high 用于那些在用户正常使用行为下就能触发的漏洞,比如浏览某个网页。我们在_技术上_并不区分这两者,但 sec-critical 只保留给那些已经公开披露,或已知正在野外被利用的问题。
  • sec-moderate 用于那些本来应算作 sec-high,但需要受害者配合不寻常且复杂步骤才能触发的漏洞。
  • sec-low 用于那些令人烦恼,但离真正伤害用户还很远的问题,比如安全的崩溃。

Of the 271 bugs we announced for Firefox 150: 180 were sec-high, 80 were sec-moderate, and 11 were sec-low.

在我们为 Firefox 150 公布的 271 个漏洞中,180 个是 sec-high,80 个是 sec-moderate,11 个是 sec-low

While we care most about critical/high bugs, it’s normal for us to prioritize moderate and low security bugs in order to fix correctness issues and as a defense-in-depth mechanism.

虽然我们最关注的是 critical 和 high 级别的问题,但为了修复正确性问题,以及出于纵深防御考虑,我们优先处理 moderate 和 low 级别的安全漏洞也是很正常的。

Is a sec-high or sec-critical bug the same as a practical exploit?

sec-highsec-critical 漏洞是否就等于可实际利用的攻击

Not necessarily.

不一定。

In most cases, a single critical/high bug is not actually enough to compromise Firefox. This is because Firefox has a defense-in-depth architecture, so for example exploiting a JIT bug only achieves remote code execution in a sandboxed and site-specific process. Real-world attackers generally need to chain multiple exploits together to escalate privileges through one or more layers of sandboxing along with OS-level mitigations like ASLR.

大多数情况下,单个 critical 或 high 级漏洞其实并不足以攻陷 Firefox。这是因为 Firefox 采用了纵深防御架构。比如利用一个 JIT 漏洞,通常也只能在一个受沙箱保护、且与特定站点对应的进程里实现远程代码执行。现实中的攻击者一般需要把多个利用串成链条,跨过一层或多层沙箱,再叠加操作系统层面的缓解机制,比如 ASLR,才能逐步提升权限。

We also generally don’t build exploits to see whether a bug could be used by an attacker in the real world. We classify sec-high based on predictable crash symptoms such as use-after-free or out-of-bounds memory issues being reported by AddressSanitizer, and our threat model assumes that any of them could be exploitable with sufficient effort. This reduces the risk of a false negative during exploitability analysis, and more importantly it allows us to focus our resources on finding and fixing more vulnerabilities.

我们通常也不会真的去构造利用,来验证某个漏洞在现实世界中是否能被攻击者实际使用。我们把漏洞归类为 sec-high,主要依据的是可预期的崩溃症状,比如 AddressSanitizer 报出的 use-after-free 或越界内存问题。我们的威胁模型默认认为,只要投入足够精力,这些问题都可能被利用。这样做可以降低在可利用性分析中出现漏判的风险,更重要的是,它能让我们把资源集中到发现和修复更多漏洞上。



[1] Our bug bounty program has similar rules.

[1] 我们的漏洞赏金计划也有类似规则

Distinguished Engineer, Firefox

Firefox 杰出工程师

Christian is a Firefox Tech Lead and Principal Engineer at Mozilla.

Christian 是 Mozilla 的 Firefox 技术负责人兼首席工程师。

Frederik Braun manages the Firefox Application Security team. He builds security for the web and for Mozilla Firefox from Berlin. As a contributor to standards, Frederik is also improving the web platform by bringing security into the defaults with specifications like the Sanitizer API and Subresource Integrity. When not at work, Frederik likes reading a good novel or going on long bike treks across Europe.

Frederik Braun 负责管理 Firefox 应用安全团队。他常驻柏林,专注于为 Web 和 Mozilla Firefox 构建安全能力。作为标准领域的贡献者,Frederik 也在通过 Sanitizer API 和 Subresource Integrity 等规范,把安全性带入默认设置,从而改进 Web 平台。不工作的时候,Frederik 喜欢读一本好小说,或者骑车长途穿越欧洲。

Two weeks ago we announced that we had identified and fixed an unprecedented number of latent security bugs in Firefox with the help of Claude Mythos Preview and other AI models. In this post, we’ll go into more detail about how we approached this work, what we found, and advice for other projects on making good use of emerging capabilities to harden themselves against attack.

Suddenly, the bugs are very good

Just a few months ago, AI-generated security bug reports to open source projects were mostly known for being unwanted slop. Dealing with reports that look plausibly correct but are wrong imposes an asymmetric cost on project maintainers: it’s cheap and easy to prompt an LLM to find a “problem” in code, but slow and expensive to respond to it.

It is difficult to overstate how much this dynamic changed for us over a few short months. This was due to a combination of two main factors. First, the models got a lot more capable. Second, we dramatically improved our techniques for harnessing these models — steering them, scaling them, and stacking them to generate large amounts of signal and filter out the noise.

Ordinarily we keep detailed bug reports private for several months after shipping fixes and issuing security advisories, largely as a precaution to protect any users who, for whatever reason, were slow to update to the latest version of Firefox. Given the extraordinary level of interest in this topic and the urgency of action needed throughout the software ecosystem, we’ve made the calculated decision to unhide a small sample of the reports behind the fixes we recently shipped. We’ve attempted to draw them from a range of browser subsystems, but the selection process was still somewhat arbitrary. Nevertheless, we hope that the depth and diversity of these reports lends credence to our assessment of the capabilities and our calls for defenders to begin applying these techniques:

Bug ID Description
2024918 An incorrect equality check can cause the JIT to optimize away the initialization of a live WebAssembly GC struct, creating a fake-object primitive with potential arbitrary read/write in code that had undergone extensive fuzzing by internal and external researchers.
2024437 A 15-year-old bug in the <legend> element triggered by meticulous orchestration of edge cases across distant parts of the browser, including recursion stack depth limits, expando properties, and cycle collection.
2021894 Reliably exploits a race condition over IPC, allowing a compromised content process to manipulate IndexedDB refcounts in the parent to trigger a UAF and potential sandbox escape.
2022034 A raw NaN crossing an IPC boundary can masquerade as a tagged JS object pointer, turning double deserialization into a parent-process fake-object primitive for a sandbox escape.
2024653 An intricate testcase weaving through nested event loops, pagehide listeners, and garbage collection to trigger a UAF in the attribute setter for <object> elements.
2022733 Triggers a parent UAF by flooding WebTransport with thousands of certificate hashes to stretch a race condition in a refcount-heavy copy loop, and exploits that race condition over IPC from a compromised content process.
2023958 Simulates a malicious DNS server by intercepting glibc DNS function calls in order to reproduce a UDP->TCP fallback edge case, triggering a buffer over-read and parent-process stack memory leak during HTTPS RR & ECH parsing.
2025977 20-year-old XSLT bug in which reentrant key() calls cause a hash table rehash that frees its backing store while a raw entry pointer is still in use (one of several sec-high issues we fixed involving XSLT).
2027298 Patches the color picker to simulate otherwise non-automatable user selection, then uses a synchronous input event to spin a nested event loop that re-enters actor teardown and frees the callback while it is still unwinding, triggering a content process UAF.
2023817 A compromised content process could send an arbitrary wallpaper image to be decoded in the parent process, which could be paired with a hypothetical vulnerability in an image decoder to escape the sandbox. This entailed difficult-to-automate reasoning about the trust-level of inputs in the parent process.
2029813 Escapes our in-process sandboxing technology for third-party libraries (RLBox) by leveraging a gap in the verification logic used to copy values from the untrusted to the trusted side of the sandbox boundary.
2026305 Extremely small testcase that exploits the special rowspan=0 semantics in HTML tables by appending >65535 rows to bypass clamping and overflow a 16-bit layout bitfield, which went undetected for years by fuzzers.

Note that a number of these bugs are sandbox escapes, which would need to be combined with other exploits to achieve a full-chain Firefox compromise. These reports presume that the sandboxed process that renders site content has already been compromised with some separate bug, and is now running attacker-controlled machine code attempting to escalate control into the privileged parent process. When crafting a sandbox escape, the model is permitted to patch the Firefox source code, so long as the modified code is restricted to run only in the sandboxed process[1]. Such bugs are notoriously difficult to find with fuzzing, and while we’ve had some success developing new techniques to close this gap, AI analysis provides much more comprehensive coverage of this critical surface.

Just as interesting as what the models found is what they didn’t find — not because they didn’t try, but because they were unable to circumvent Firefox’s layered defenses. For example, in recent years we received several clever reports from security researchers that managed to escape the process sandbox by triggering prototype pollution in the privileged parent process. Rather than fixing these problems one-by-one, we made an architectural change to freeze these prototypes by default. While auditing logs from the harness, we saw many attempts to pursue this line of escape that were thwarted by this design. Observing such direct payoff from previous hardening work was even more rewarding than finding and fixing more bugs.

Harnessing Models to Build a Hardening Pipeline

We’ve experimented internally with LLM code audits over the past few years, with early attempts using models like GPT 4 or Sonnet 3.5 to statically analyze high risk code for vulnerabilities. These experiments showed some promise, but the high rate of false positives made them impractical to scale.

The introduction of agentic harnesses that can reliably detect security issues has completely changed this. These can find real bugs and dismiss unreproducible speculation. The key feature of such a harness is that, given the right interfaces and instructions, it can create and run reproducible test cases to dynamically test hypotheses about bugs in code. After fixing the initial set of issues that Anthropic sent to us in February, we built our own harness atop our existing fuzzing infrastructure.

We began with small-scale experiments prompting the harness to look for sandbox escapes with Claude Opus 4.6. Even with this model, we identified an impressive amount of previously-unknown vulnerabilities which required complex reasoning over multiprocess browser engine code. At first, we supervised the process in the terminal to observe the process in real-time and tune the prompts and logic. Once this was working well, we parallelized the jobs across multiple ephemeral VMs, each tasked to hunt for bugs within a specific target file and write its findings back to a bucket.

A discovery subsystem is necessary but not sufficient. In order to scale the effort, we needed to integrate it with our full security bug lifecycle: determining what to look for, where to look, and how to handle what it produces. This last part includes deduplicating against known issues, tracking bugs, triaging them, and getting fixes shipped. While the model is the core primitive powering the harness, this full pipeline is necessary to make it useful at scale.

While harnesses may be reusable across projects, this pipeline is inherently project-specific, reflecting each codebase’s semantics, tooling, and processes. Standing this up required significant iteration, with a tight feedback loop alongside the Firefox engineers who were fielding the incoming bugs.

Upgrading the Models

Once the end-to-end pipeline is in place, it’s trivial to swap in different models when they become available. Building this pipeline early helped us find a number of serious bugs using publicly-available models, and it also helped us hit the ground running when we had the opportunity to evaluate Claude Mythos Preview. In our experience, model upgrades increase the effectiveness of the entire pipeline: the system gets simultaneously better at finding potential bugs, creating proof-of-concept test cases to demonstrate them, and articulating their pathology and impact.

In addition to fixing the 271 bugs identified by Claude Mythos Preview in the 150 release, we’ve shipped more of these fixes in 149.0.2, 150.0.1, and 150.0.2. We also continue to find bugs with other means internally, and, similar to other projects, we’ve seen a significant uptick in external reports in the last few months.

Image 1: A graph showing the volume of Firefox security bug fixes shipped by month, trending in the 20-30 range throughout each month in 2025, with a spike to 60-70 in February and March 2026, up to 423 in April 2026

Ultimately, every bug requires care and attention to properly fix. Staying on top of this unprecedented volume has led to a lot of work and long days over the last few months, and we’re extremely proud of how the team has stepped up to meet this challenge. Over 100 people contributed code to this effort to ship the most secure Firefox yet. In addition to writing and reviewing patches, others have been building and scaling this pipeline, triaging, testing the fixes, and managing the release process for each bug.

Takeaways

Anyone building software can start using a harness with a modern model to find bugs and harden their code today. We recommend getting started now. You will find bugs, and you will set yourself up to take advantage of new models as soon as they become available.

You can start with very simple prompting, then observe and iterate. Our initial prompts were not dissimilar from those described here. Through iteration we’ve built out a lot of orchestration and tooling to optimize and scale the pipeline, but the essence of the inner loop remains the same: there is a bug in this part of the code, please find it and build a testcase.

We haven’t bottomed on all the latent bugs in Firefox, but are quite pleased with the trajectory. Today, our scanning is largely focused on specific areas of the code (files, functions) where we instruct the system to look, based on a mix of human judgement and automated signals. In the near future, we intend to integrate this analysis into our continuous integration system to scan patches as they land in the tree. Models are quite flexible with the form of context provided, and we expect patch-based scanning to work as well or even better than file-based scanning.

The current moment is a perilous one, but also full of opportunity. Let’s work together to secure the internet.


FAQ

The announcement said “271 bugs”, but I count something different. What’s going on?

On the advisories web page we group all internally-reported bugs as “rollup” CVEs with multiple bugs underneath them. The web page is built from yaml in the foundation-security-advisories repo, the canonical location for our CVE assignments. While some browsers do not create CVE identifiers for internally-discovered issues at all, we provide this information in order to be as transparent as possible.

In Firefox 150, there were three internal rollups: CVE-2026-6784 (154 bugs), CVE-2026-6785 (55 bugs), and CVE-2026-6786 (107 bugs).

Astute readers will notice the number of bugs in those internal rollups adds up to 316, which is more than the 271 we announced finding with Claude Mythos Preview. That’s because our security team hunts for new bugs every day by attacking Firefox with a combination of (a) fuzzing systems (b) manual inspection and (c) this new agentic pipeline across a variety of models.

We fixed a total of 423 security bugs in releases in April. In addition to the 271 bugs announced two weeks ago, there were 41 externally reported bugs, with the remaining 111 discovered internally and split roughly in third between:

  1. Bugs found using this pipeline with Claude Mythos Preview but fixed in releases other than Firefox 150
  2. Bugs found using this pipeline with other models
  3. Bugs found with other techniques like fuzzing

Note that we also directly credited 3 CVEs to Anthropic separate from this latest effort (CVE-2026-6746, CVE-2026-6757, CVE-2026-6758). These were fixes for bugs sent to us by the outstanding Anthropic Frontier Red team a couple months ago and we assigned unique CVEs for each as per our normal process.

What do security ratings mean?

As additional context, we apply security severity ratings from critical to low to indicate the urgency of a bug:

  • sec-critical and sec-high are assigned to vulnerabilities that can be triggered with normal user behavior, like browsing to a web page. We make no technical difference between these, but sec-critical bugs are reserved for issues that are publicly disclosed or known to be exploited in the wild.
  • sec-moderate is assigned to vulnerabilities that would otherwise be rated sec-high but require unusual and complex steps from the victim.
  • sec-low is assigned to bugs that are annoying but far from causing user harm (e.g, a safe crash).

Of the 271 bugs we announced for Firefox 150: 180 were sec-high, 80 were sec-moderate, and 11 were sec-low.

While we care most about critical/high bugs, it’s normal for us to prioritize moderate and low security bugs in order to fix correctness issues and as a defense-in-depth mechanism.

Is a sec-high or sec-critical bug the same as a practical exploit?

Not necessarily.

In most cases, a single critical/high bug is not actually enough to compromise Firefox. This is because Firefox has a defense-in-depth architecture, so for example exploiting a JIT bug only achieves remote code execution in a sandboxed and site-specific process. Real-world attackers generally need to chain multiple exploits together to escalate privileges through one or more layers of sandboxing along with OS-level mitigations like ASLR.

We also generally don’t build exploits to see whether a bug could be used by an attacker in the real world. We classify sec-high based on predictable crash symptoms such as use-after-free or out-of-bounds memory issues being reported by AddressSanitizer, and our threat model assumes that any of them could be exploitable with sufficient effort. This reduces the risk of a false negative during exploitability analysis, and more importantly it allows us to focus our resources on finding and fixing more vulnerabilities.


[1] Our bug bounty program has similar rules.

Distinguished Engineer, Firefox

More articles by Brian Grinstead…

Christian is a Firefox Tech Lead and Principal Engineer at Mozilla.

More articles by Christian Holler…

Frederik Braun manages the Firefox Application Security team. He builds security for the web and for Mozilla Firefox from Berlin. As a contributor to standards, Frederik is also improving the web platform by bringing security into the defaults with specifications like the Sanitizer API and Subresource Integrity. When not at work, Frederik likes reading a good novel or going on long bike treks across Europe.

📋 讨论归档

讨论进行中…