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子系统中,具体在浏览器进程(非沙箱内)的引用计数管理部分。

漏洞原理

  1. AppCache使用引用计数机制管理对象生命周期
  2. 当清空应用缓存时,会调用RemoveCache函数
  3. 问题在于newest_complete_cache_对象的引用计数管理不当:
    • 可先将newest_complete_cache_设为NULL
    • 然后调用CancelUpdate进行修复
    • 通过递减newest_complete_cache_对象的引用计数至0来触发释放
  4. 当引用计数减至0时,会调用AppCache析构函数释放对象

关键代码片段

void AppCacheGroup::RemoveCache(AppCache* cache) {
  DCHECK(cache->associated_hosts().empty());
  if (cache == newest_complete_cache_) {
    // ...
  } else {
    scoped_refptr<AppCacheGroup> protect(this);
    // ...
  }
}

漏洞利用

利用条件

  1. 能够控制被释放对象的第一个双字节中的递减量(N)
  2. 当递减使第一个双字节变为0时,会调用AppCache析构函数

利用步骤

阶段一: 信息泄露

  1. 释放的AppCache对象大小为0xA0字节
  2. 发现net::CanonicalCookie具有相同大小
  3. 通过发出网络请求并在响应中包含cookie来散布cookie
  4. 利用std::string的name字段(第一个四字节为字符串数据指针)泄露堆地址

阶段二: 代码执行

  1. 为已释放的AppCache生成野指针
  2. 使用相同大小的二进制大对象(BLOB)回收内存
  3. 伪造引用计数(初始为1,后递减为0)
  4. 触发AppCache析构函数调用
  5. 利用AppCacheGroup析构函数中的虚函数调用实现控制流劫持
AppCacheGroup::~AppCacheGroup() {
  // ...
  if (update_job_)
    delete update_job_; // <- 代码执行点
}

Windows平台利用特点

  • ASLR导致所有模块在渲染器和代理进程中加载到相同地址
  • 使用_longjmp_internal gadget构建ROP链
  • 可选择直接跳转至shellcode或打开记事本等操作

防护建议

  1. 升级至Chrome 70或更高版本
  2. 启用Chrome自动更新功能
  3. 在浏览器中禁用AppCache功能(可通过chrome://flags)
  4. 部署内存保护机制如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消息和内存操作,攻击者可以绕过沙箱保护实现任意代码执行。这强调了即使是高度安全的浏览器架构,也需要对所有组件(包括沙箱外部分)进行严格的安全审计。

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析构函数释放对象 关键代码片段 漏洞利用 利用条件 能够控制被释放对象的第一个双字节中的递减量(N) 当递减使第一个双字节变为0时,会调用AppCache析构函数 利用步骤 阶段一: 信息泄露 释放的AppCache对象大小为0xA0字节 发现 net::CanonicalCookie 具有相同大小 通过发出网络请求并在响应中包含cookie来散布cookie 利用 std::string 的name字段(第一个四字节为字符串数据指针)泄露堆地址 阶段二: 代码执行 为已释放的AppCache生成野指针 使用相同大小的二进制大对象(BLOB)回收内存 伪造引用计数(初始为1,后递减为0) 触发AppCache析构函数调用 利用AppCacheGroup析构函数中的虚函数调用实现控制流劫持 Windows平台利用特点 ASLR导致所有模块在渲染器和代理进程中加载到相同地址 使用 _longjmp_internal gadget构建ROP链 可选择直接跳转至shellcode或打开记事本等操作 防护建议 升级至Chrome 70或更高版本 启用Chrome自动更新功能 在浏览器中禁用AppCache功能(可通过chrome://flags) 部署内存保护机制如CFG(Control Flow Guard) 参考代码 漏洞利用中使用的部分HTML/JavaScript代码框架: 总结 该漏洞展示了Chrome沙箱外组件中的内存安全问题如何被利用来突破浏览器安全边界。通过精心构造的IPC消息和内存操作,攻击者可以绕过沙箱保护实现任意代码执行。这强调了即使是高度安全的浏览器架构,也需要对所有组件(包括沙箱外部分)进行严格的安全审计。