Chrome AppCache子系统SBX的UAF漏洞利用
字数 1230 2025-08-29 08:31:47
Chrome AppCache子系统SBX的UAF漏洞分析与利用
漏洞概述
本漏洞存在于Chrome 69.0及以下版本的AppCache子系统中,涉及沙箱(SBX)外的浏览器进程。攻击者可通过渲染器进程向浏览器进程发送特定IPC消息,利用引用计数管理不当导致的Use-After-Free(UAF)漏洞,最终实现任意代码执行。
技术细节
受影响版本
- Google Chrome 69.0及以下版本
- CVE编号: CVE-2018-17462
- 修复版本: Chrome 70
漏洞位置
漏洞位于AppCache子系统中,具体在浏览器进程(非沙箱内)的引用计数管理部分。
漏洞原理
- AppCache使用引用计数机制管理对象生命周期
- 当清空应用缓存时,会调用
RemoveCache函数 - 问题在于
newest_complete_cache_对象的引用计数管理不当:- 可先将
newest_complete_cache_设为NULL - 然后调用
CancelUpdate进行修复 - 通过递减
newest_complete_cache_对象的引用计数至0来触发释放
- 可先将
- 当引用计数减至0时,会调用AppCache析构函数释放对象
关键代码片段
void AppCacheGroup::RemoveCache(AppCache* cache) {
DCHECK(cache->associated_hosts().empty());
if (cache == newest_complete_cache_) {
// ...
} else {
scoped_refptr<AppCacheGroup> protect(this);
// ...
}
}
漏洞利用
利用条件
- 能够控制被释放对象的第一个双字节中的递减量(N)
- 当递减使第一个双字节变为0时,会调用AppCache析构函数
利用步骤
阶段一: 信息泄露
- 释放的AppCache对象大小为0xA0字节
- 发现
net::CanonicalCookie具有相同大小 - 通过发出网络请求并在响应中包含cookie来散布cookie
- 利用
std::string的name字段(第一个四字节为字符串数据指针)泄露堆地址
阶段二: 代码执行
- 为已释放的AppCache生成野指针
- 使用相同大小的二进制大对象(BLOB)回收内存
- 伪造引用计数(初始为1,后递减为0)
- 触发AppCache析构函数调用
- 利用AppCacheGroup析构函数中的虚函数调用实现控制流劫持
AppCacheGroup::~AppCacheGroup() {
// ...
if (update_job_)
delete update_job_; // <- 代码执行点
}
Windows平台利用特点
- ASLR导致所有模块在渲染器和代理进程中加载到相同地址
- 使用
_longjmp_internalgadget构建ROP链 - 可选择直接跳转至shellcode或打开记事本等操作
防护建议
- 升级至Chrome 70或更高版本
- 启用Chrome自动更新功能
- 在浏览器中禁用AppCache功能(可通过chrome://flags)
- 部署内存保护机制如CFG(Control Flow Guard)
参考代码
漏洞利用中使用的部分HTML/JavaScript代码框架:
<head>
<title>owning, please wait...</title>
<style>
body{background:white;font-size:0.8em;}
document{background:white;}
</style>
</head>
<pre id="progress"></pre>
<pre id="progress-rce"></pre>
<pre id="progress-infoleak"></pre>
<pre id="progress-rip"></pre>
<script src="crypto/BigInteger.js"></script>
<script src="crypto/aes.js"></script>
<script>
// 加密通信和漏洞利用代码...
</script>
总结
该漏洞展示了Chrome沙箱外组件中的内存安全问题如何被利用来突破浏览器安全边界。通过精心构造的IPC消息和内存操作,攻击者可以绕过沙箱保护实现任意代码执行。这强调了即使是高度安全的浏览器架构,也需要对所有组件(包括沙箱外部分)进行严格的安全审计。