MartinaStarone/CVE-2026-2441
GitHub: MartinaStarone/CVE-2026-2441
针对 Chrome CSSFontFeatureValuesMap 释放后重用漏洞(CVE-2026-2441)的概念验证与根因分析,提供三种独立的崩溃触发方法以验证漏洞存在性。
Stars: 0 | Forks: 0
# CVE-2026-2441 — Chrome CSSFontFeatureValuesMap 释放后重用(Use-After-Free)
**CVSS 8.8 (高危)** | **已在野外被积极利用** | **渲染器 RCE (沙箱内)**
Google Chrome 的 Blink CSS 引擎中存在一个释放后重用(Use-After-Free)漏洞,允许远程攻击者通过精心构造的 HTML 页面在浏览器沙箱内执行任意代码。
## 漏洞详情
| 字段 | 值 |
|-------|-------|
| **CVE** | CVE-2026-2441 |
| **CVSS** | 8.8 (高危) |
| **类型** | 释放后重用 (CWE-416) |
| **组件** | Blink CSS — `CSSFontFeatureValuesMap` |
| **源文件** | `third_party/blink/renderer/core/css/css_font_feature_values_map.cc` |
| **修复提交** | `63f3cb4864c64c677cd60c76c8cb49d37d08319c` |
| **报告者** | Shaheen Fazim (2026-02-11) |
| **补丁日期** | 2026-02-13 |
| **野外利用** | 是 — Google 确认存在积极利用 |
## 受影响版本
| 平台 | 受影响版本 | 已修复版本 |
|----------|-----------|-------|
| Windows / macOS (稳定版) | < 145.0.7632.75 | >= 145.0.7632.75 |
| Linux (稳定版) | < 144.0.7559.75 | >= 144.0.7559.75 |
| Windows / macOS (长期支持稳定版) | < 144.0.7559.177 | >= 144.0.7559.177 |
| 基于 Chromium 的浏览器 (Edge, Brave, Opera, Vivaldi) | 查看供应商公告 | 视情况而定 |
## 根本原因
`FontFeatureValuesMapIterationSource` 存储了一个指向内部 `FontFeatureAliases` HashMap 的**裸指针**(`const FontFeatureAliases* aliases_`)。当在迭代期间通过 `set()` 或 `delete()` 对 HashMap 进行修改时,它会进行重哈希——分配新存储并释放旧存储。裸指针因此变为**悬空指针**,随后的 `FetchNextItem()` 调用会读取已释放的内存。
### 漏洞代码路径
```
CreateIterationSource()
→ FontFeatureValuesMapIterationSource(map, aliases_)
→ aliases_ = raw pointer to internal HashMap
→ iterator_ = aliases_->begin()
FetchNextItem()
→ reads iterator_->key (through aliases_)
If map.set() / map.delete() is called between iterations:
→ HashMap rehashes (new alloc, old freed)
→ aliases_ → dangling pointer
→ iterator_ → invalidated
→ Next FetchNextItem() → USE-AFTER-FREE
```
### 修复方案
```
- const FontFeatureAliases* aliases_; // raw pointer → dangling after rehash
+ const FontFeatureAliases aliases_; // deep copy → immune to rehash
```
该修复将裸指针替换为 HashMap 的**深拷贝**。即使原始 HashMap 发生重哈希,迭代器也会在其自身的副本上进行操作,从而防止出现悬空指针。
## 概念验证(PoC)
### 使用方法
1. 在**存在漏洞的** Chrome 版本(< 145.0.7632.75)中打开 `poc.html`
2. 页面将尝试通过三种不同的方法触发释放后重用(UAF)漏洞
### 预期结果
| Chrome 版本 | 预期行为 |
|---------------|-------------------|
| < 145.0.7632.75 (未打补丁) | **渲染器崩溃** — `STATUS_ACCESS_VIOLATION` (Windows) 或 `SIGSEGV` (Linux/macOS)。Chrome 显示“无法打开此页面”错误。 |
| >= 145.0.7632.75 (已打补丁) | 无崩溃 — PoC 运行完成,所有条目正常读取。 |
### 截图(未打补丁的 Chrome — 崩溃)
在存在漏洞的 Chrome 版本中打开时,渲染器进程会崩溃并提示 `STATUS_ACCESS_VIOLATION`:
```
Can't open this page
Error code: STATUS_ACCESS_VIOLATION
```
这证实了 UAF 被触发——悬空指针访问了已释放/未映射的内存,导致渲染器进程终止。
## PoC 工作原理
PoC 通过**三种独立的方法**触发 UAF:
### 方法 1: `entries()` 迭代器 + 变更循环
```
const iterator = map.entries();
while (step < 20) {
iterator.next(); // read through (now dangling) pointer
map.delete(key); // trigger rehash
for (i = 0; i < 512; i++)
map.set("spray_" + i, [i]); // force reallocation
}
```
### 方法 2: `for...of` + 并发变更
```
for (const [k, v] of map) {
map.delete(k);
for (i = 0; i < 512; i++)
map.set("alt_" + i, [i]);
}
```
### 方法 3: `requestAnimationFrame` + 布局重算
```
function rafTrigger() {
document.body.offsetWidth; // force layout recalc
const result = iterator.next();
map.delete(k);
for (i = 0; i < 512; i++)
map.set("raf_" + i, [i]);
requestAnimationFrame(rafTrigger);
}
```
每种方法还包含**堆喷射**——分配 50 个相同大小的 `@font-feature-values` 规则,使堆布局变得可预测,以便进行潜在的漏洞利用。
## 影响
### 直接影响 (沙箱范围内)
- 在渲染器进程沙箱内进行**任意代码执行**
- **信息泄露** — 泄露 V8 堆指针(绕过 ASLR),读取渲染器内存内容
- **凭据窃取** — 读取 `document.cookie`、`localStorage`、`sessionStorage`、表单输入值
- **会话劫持** — 窃取会话 token,通过 `fetch()` / `WebSocket` / `sendBeacon` 进行数据渗出
- **DOM 操控** — 注入钓鱼表单,修改页面内容
- **键盘记录** — 通过 `addEventListener('keydown')` 捕获所有按键输入
### 链式攻击 (配合沙箱逃逸)
当与单独的沙箱逃逸漏洞结合使用时:
```
Renderer RCE (CVE-2026-2441)
→ Mojo IPC exploit → Browser process RCE
→ Kernel exploit → Full system compromise
→ Malware / ransomware / spyware installation
→ File system access, lateral movement, persistence
```
利用类似浏览器 UAF 漏洞的现实世界攻击链:
- **NSO Pegasus** — WebKit UAF + 沙箱逃逸 + 内核漏洞利用
- **Intellexa Predator** — Chrome UAF + Android 内核漏洞利用
- **APT-28 (Fancy Bear)** — Chrome 0-day + Windows LPE 攻击链
## 攻击向量
该漏洞可通过**水坑式挂马**(Drive-by download)利用——除了访问恶意页面外,不需要任何用户交互:
- **恶意广告** — 通过合法的广告网络投放恶意广告
- **水坑攻击** — 攻击目标经常访问的网站
- **鱼叉式网络钓鱼** — 通过电子邮件或消息发送特制链接
## 缓解措施
1. 将 Chrome **更新**至 >= 145.0.7632.75 (Windows/macOS) 或 >= 144.0.7559.75 (Linux)
2. 在供应商补丁可用时,**更新**基于 Chromium 的浏览器(Edge, Brave, Opera, Vivaldi)
3. **验证**是否启用了 Site Isolation(`chrome://flags/#site-isolation-trial-opt-out`)
4. **监控**终端是否存在低于已修复构建版本的 Chrome 版本
## 时间线
| 日期 | 事件 |
|------|-------|
| 2026-02-11 | 漏洞由 Shaheen Fazim 报告 |
| 2026-02-13 | Google 发布 Chrome 145.0.7632.75/76 (Windows/macOS),144.0.7559.75 (Linux) |
| 2026-02-13 | Google 承认在野外被积极利用 |
| 2026-02-16 | Vivaldi 和 Opera 发布修复 |
## 参考
- [Google Chrome 发布博客](https://chromereleases.googleblog.com/2026/02/stable-channel-update-for-desktop_13.html)
- [NVD — CVE-2026-2441](https://nvd.nist.gov/vuln/detail/cve-2026-2441)
- [The Hacker News — Chrome 零日漏洞正遭受积极攻击](https://thehackernews.com/2026/02/new-chrome-zero-day-cve-2026-2441-under.html)
- [Chromium 问题追踪器](https://issues.chromium.org/) (受限)
## 免责声明
本概念验证(PoC)仅出于**教育和授权安全研究目的**提供。未经明确授权对系统使用此 PoC 是非法且不道德的。作者不对任何滥用行为负责。
## 许可证
MIT
标签:0day漏洞, Blink引擎, C++, Chrome浏览器漏洞, Chromium内核, CISA项目, CSS引擎漏洞, CVE-2026-2441, CWE-416, Go语言工具, HashMap Rehash, PoC, RCE, UAF漏洞, Use-After-Free, 内存安全, 前端安全, 后端开发, 在野漏洞利用, 多模态安全, 数据可视化, 数据擦除, 暴力破解, 浏览器沙箱, 渲染进程, 漏洞分析, 编程工具, 网络安全, 路径探测, 远程代码执行, 隐私保护, 高危漏洞