此漏洞影响到了我们提供服务的一家客户。本仓库是我们对原始研究的贡献:为团队提供一个集中起点,以便当影响该组件的类似漏洞再次出现时,我们已有前期基础。它汇集了漏洞背后的理论、原始研究员发现的文档化总结,以及一组用于在实验室环境中验证暴露情况的实用工具。
注意:我本想分享更多研究内容,但由于公司限制,我无法进一步披露。这里包含的所有内容都已通过审查,且不违反我所受的任何协议。因此,本仓库以其当前状态归档。
2026 年 4 月 1 日,Google 发布了一次 Chrome 安全更新,修复了 21 个漏洞,其中 CVE-2026-5281 在披露时已被野外积极利用。三天后,CISA 将其列入已知被利用漏洞目录,并发布了一项具有约束力的操作指令,要求联邦机构进行修补。到那时,它已经影响到了我们。
本仓库的存在只有一个原因:当下次发生类似情况时,我们有一个起点,而不是从零开始。它汇集了:
想理解一个漏洞为何存在,就要从系统的设计目的及其所基于的假设入手。
WebGPU 通过 API 在图形处理单元(GPU)上执行渲染和计算等操作。WebGPU 并不是要对外暴露 OpenGL 或 OpenGL ES(嵌入式系统)。它是一个基于 Direct3D 12、Metal 和 Vulkan 等现代 API 思想构建的全新 API。
WebGPU 是 WebGL(浏览器多年来使用的旧 GPU API)的现代替代品。关键区别在于,WebGPU 从设计之初就着眼于安全性和显式资源管理。你需要自己声明每个缓冲区、纹理和管线的生命周期。浏览器充当 JavaScript 与 GPU 硬件之间的验证层。
处于此漏洞中心的对象,按创建顺序如下:``` GPUAdapter ← represents a physical GPU or software fallback └─ GPUDevice ← your logical connection to the adapter; owns everything ├─ GPUBuffer ← a chunk of GPU-accessible memory ├─ GPUShaderModule ← a compiled WGSL shader program ├─ GPUComputePipeline ← a shader wired to a pipeline layout ├─ GPUBindGroup ← binds buffers as inputs to a pipeline ├─ GPUCommandEncoder ← records a sequence of GPU commands └─ GPUQueue ← submits recorded commands to hardware
The rule that matters here: every object is owned by the GPUDevice. Destroying a buffer while the device still has commands in flight that reference it is explicitly illegal under the spec. The Dawn implementation is supposed to detect and reject that. CVE-2026-5281 is a case where it did not.
---
---
---
<div id='whatisdawn'/>
## ***⚙️ 什么是 Dawn?***
- **[Dawn - 开源 WebGPU 实现](https://dawn.googlesource.com/dawn)**
> Dawn 是正在制定中的 WebGPU 标准的开源跨平台实现。它提供了一个原生 C++ API,镜像了 WebGPU IDL,并带有一些扩展。
Dawn 是 Chrome 内部的 C++ 库,负责将 WebGPU JavaScript 调用转换为平台原生的 GPU 命令。在 Windows 上,它面向 D3D12;在 macOS 上,面向 Metal;在 Linux 上,面向 Vulkan。它位于 Chrome 的 JavaScript 引擎与硬件驱动程序之间,负责四件事:验证 API 调用、序列化命令、跟踪对象生命周期,以及将错误返回给 JavaScript。
CVE-2026-5281 存在于生命周期跟踪部分。具体来说,问题在于当引用缓冲区对象的命令仍在硬件队列中等待执行时,Dawn 将这些 GPU 缓冲区对象保持存活的时长。```
JavaScript (V8)
│ WebGPU API calls
▼
Dawn (C++) - validates, serializes, tracks lifetimes, reports errors
│
▼
D3D12 (Windows) - Metal (macOS) - Vulkan (Linux)
│
▼
GPU hardware driver
│
▼
Physical GPU - shader cores, VRAM
在理解 Use-After-Free 之前,你需要对内存中各对象的存放位置有一个清晰的思维模型。``` High addresses ┌────────────────────────────────────┐ │ Kernel space │ The OS and drivers live here. │ │ User-mode code cannot touch it. ├────────────────────────────────────┤ │ Stack │ Function call frames. Fast. │ (grows downward) │ Freed automatically when the │ │ function returns. ├────────────────────────────────────┤ │ Heap │ Dynamic allocations - malloc, new, │ (grows upward) │ smart pointers like Ref. │ │ Freed only when you say so. ├────────────────────────────────────┤ │ BSS / Data / Text │ Globals, constants, compiled code. └────────────────────────────────────┘ Low addresses
Dawn的C++对象,例如支撑GPUBuffer的内部对象,存活于堆上。它们采用引用计数:智能指针统计有多少持有者引用了该对象。当计数降为零时,析构函数运行,内存归还给分配器。
GPUBuffer同时具有两种表示形式,一种在CPU侧,一种在GPU侧:```
CPU side (Dawn, system RAM)
└─ C++ object - metadata, state flags, and a hardware handle
│
│ handle: ID3D12Resource* (D3D12) - MTLBuffer (Metal) - VkBuffer (Vulkan)
▼
GPU side (driver, VRAM)
└─ Actual memory allocation on the graphics card
当 JavaScript 调用 buffer.destroy() 时,预期行为是:将对象标记为已销毁,递减引用计数,释放硬件句柄,并释放 VRAM。CVE-2026-5281 中的漏洞会导致 VRAM 被释放,而 GPU 命令队列仍持有对该硬件句柄的引用,这意味着 GPU 正在主动读取或写入不再属于它的内存。
引用已释放的内存可能导致程序崩溃、使用意外值或执行代码。使用先前已释放的内存可能产生任何数量的不利后果,从破坏有效数据到执行任意代码。
Use-After-Free(释放后使用)遵循固定的三步模式,是浏览器安全中最常被利用的内存安全漏洞类别之一:```
在第 2 步之后,分配器可以将同一块内存区域交给一个完全不同的分配。如果攻击者能够控制被释放区域中随后被放入的内容(这种技术称为堆布局操纵 heap grooming),他们就能控制悬垂指针读回的内容。这就是内存安全漏洞如何变为代码执行。
GPU 端的 UAF 比 CPU 端的 UAF 更难观察,因为:
- “分配器”是 GPU 驱动程序的 VRAM 分配器,而不是系统的 malloc。
- “悬垂指针”是仍被命令队列引用的硬件句柄。
- GPU 异步执行命令,CPU 在崩溃发生很久之前就已经继续运行了。
---
---
---
<div id='thevulnerability'/>
## ***🕳️ 漏洞***
---
<div id='thevulnerability-whatweknow'/>
### ***📋 我们从公开来源了解到的信息***
以下内容完全基于已被公开确认的信息。
- **[NVD: CVE-2026-5281](https://nvd.nist.gov/vuln/detail/CVE-2026-5281)**
> Google Chrome 146.0.7680.178 之前版本中 Dawn 组件存在释放后使用(UAF)漏洞,允许已攻破渲染进程的远程攻击者通过特制 HTML 页面执行任意代码。
- **[The Hacker News: 2026年4月1日](https://thehackernews.com/2026/04/new-chrome-zero-day-cve-2026-5281-under.html)**
> Google 已获悉 CVE-2026-5281 存在野外利用。
- **[Help Net Security: 2026年4月1日](https://www.helpnetsecurity.com/2026/04/01/google-chrome-zero-day-cve-2026-5281/)**
> CVE-2026-5281 由一位化名漏洞猎人(86ac1f1587b71893ed2ad792cd7dde32)报告,此人此前还报告过两个已在 2026 年 3 月 23 日发布的 Chrome 更新中修复的漏洞:WebGL 中的堆缓冲区溢出(CVE-2026-4675)以及 Dawn 中的另一个释放后使用漏洞(CVE-2026-4676)。该漏洞猎人这次还报告了 Dawn 中的第三个释放后使用漏洞(CVE-2026-5284),该漏洞也已在此次更新中修复。
---
<div id='thevulnerability-executionlayers'/>
### ***🔗 从 JavaScript 到硬件***