CVE-2018-18500:利用Firefox的堆漏洞进行攻击
字数 1477 2025-08-29 08:32:18
CVE-2018-18500:Firefox堆漏洞分析与利用教学文档
漏洞概述
CVE-2018-18500是Mozilla Firefox浏览器中的一个安全漏洞,由SophosLabs于2018年11月发现并报告给Mozilla基金会。该漏洞涉及Firefox的Gecko引擎中的HTML5解析器组件,特别是在处理"自定义元素"时存在的一个释放后写入(Write After Free)内存损坏漏洞。
技术背景:自定义元素
自定义元素是HTML标准中"Web组件"API的一部分,允许开发者创建新的HTML元素类型。基本示例:
<body>
// 创建元素类
class ExtendedBR extends HTMLBRElement {
constructor() {
super();
console.log("Extended BR created");
}
}
// 定义新元素
customElements.define("extended-br", ExtendedBR, {extends: "br"});
<br is="extended-br">
</body>
Firefox 63(2018年10月23日发布)首次引入了对自定义元素的支持。
漏洞详情
漏洞存在于HTML树构建过程中创建自定义元素时的处理逻辑:
- Firefox在解析HTML时会调用
nsHtml5TreeOperation::Perform()和CreateHTMLElement()函数 - 当遇到自定义元素时,会调用JavaScript回调执行构造函数
- 引擎代码在JavaScript回调周围使用C++对象但没有正确保存引用
- 如果构造函数中止文档加载(如通过
location.replace),会导致解析器资源被释放 - 当引擎代码从回调返回后,会写入已释放的内存,造成释放后写入
关键代码片段:
nsresult nsHtml5TreeOperation::Perform(...) {
case eTreeOpCreateHTMLElementNetwork:
case eTreeOpCreateHTMLElementNotNetwork: {
nsIContent** target = mOne.node;
*target = CreateHTMLElement(...); // 漏洞点:写入可能已释放的内存
return NS_OK;
}
}
漏洞利用技术
触发漏洞的步骤
-
创建自定义元素并在其构造函数中执行:
location.replace("about:blank"); var xhr = new XMLHttpRequest(); xhr.open('GET', '/delay.txt', false); // 同步XHR xhr.send(null); -
同步XHR确保在构造函数返回前完成解析器资源的释放
-
使用iframe技术保持主页面上下文继续执行JavaScript
堆利用技术
-
堆布局控制:
- 利用
FormData对象进行堆grooming FormData使用nsTArray存储数据,可以精确控制分配大小- 通过追加/删除操作控制特定大小内存块的分配和释放
- 利用
-
目标对象选择:
- 使用
XMLHttpRequest或FileReader作为目标 - 这些对象包含可以返回
ArrayBuffer的成员变量 - 通过破坏这些对象的内部指针,可以创建指向任意内存的
ArrayBuffer
- 使用
-
运行回收技术:
- 释放大块内存后重新分配为小块
- 利用jemalloc的LIFO(后进先出)特性
- 确保目标对象分配到之前释放的内存区域
完整利用流程
- 使用
FormData分配和释放特定大小的内存块 - 创建HTML解析器和
mHandles分配 - 触发漏洞释放
mHandles - 分配目标对象(
XMLHttpRequest/FileReader)到释放的内存区域 - 通过自定义元素构造函数触发写入,破坏目标对象内部状态
- 利用损坏的目标对象创建指向任意内存的
ArrayBuffer - 通过
ArrayBuffer读写内存,实现任意代码执行
漏洞修复
该漏洞在Firefox 65.0中修复,修复方法是添加了对解析器资源的强引用:
RefPtr<nsHtml5StreamParser> streamParserGrip;
if (mParser) {
streamParserGrip = GetParser()->GetStreamParser();
}
mozilla::Unused << streamParserGrip; // 确保引用在函数期间保持
教学总结
- 理解漏洞本质:释放后写入内存损坏
- 掌握触发条件:自定义元素构造函数中中止文档加载
- 学习利用技术:堆布局控制、运行回收、目标对象选择
- 实践利用开发:使用iframe保持执行上下文,精确控制内存分配
- 了解防御措施:正确管理对象生命周期和引用
扩展学习
- 研究jemalloc/mozjemalloc内存分配器特性
- 深入了解HTML5解析器工作原理
- 学习现代浏览器安全缓解措施及其绕过方法
- 分析更多自定义元素相关的安全漏洞
通过本教学文档,您应该能够全面理解CVE-2018-18500漏洞的原理、利用方法及防御措施,为进一步研究浏览器安全奠定基础。