利用V8Harvest实现简单漏洞回归监控

本文介绍V8Harvest工具,用于监控V8 JavaScript引擎的漏洞回归测试。该工具解析V8测试目录中的回归测试文件,提取相关漏洞信息,帮助安全研究人员分析PoC和开发漏洞利用代码,支持从2016到2021年的数据。

简单漏洞回归监控与V8Harvest

引言

在我研究JavaScript引擎(V8)的过程中,创建了一个小工具,帮助你在单个页面上查看最近包含回归测试的V8漏洞。由于大多数情况下,回归测试通常包含触发漏洞的PoC,分析它们以找到根本原因并为n-day漏洞编写利用代码非常有用。

例如,regress-1053604.js包含触发kJSCreate操作码中副作用的PoC(CVE-2020-6418)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
let a = [0, 1, 2, 3, 4];
function empty() {}
function f(p) {
  a.pop(Reflect.construct(empty, arguments, p));
}
let p = new Proxy(Object, {
  get: () => (a[0] = 1.1, Object.prototype)
});
function main(p) {
  f(p);
}
%PrepareFunctionForOptimization(empty);
%PrepareFunctionForOptimization(f);
%PrepareFunctionForOptimization(main);
main(empty);
main(empty);
%OptimizeFunctionOnNextCall(main);
main(p);

有时,由于Chrome的发布流程,在V8中修复的漏洞可能未在最新的Chrome稳定版本中修复。因此,一些漏洞利用开发者经常在Chrome上进行补丁差异分析。由于补丁差异分析是与时间赛跑,拥有与漏洞修复提交一起暴露的回归测试与否会产生巨大差异。例如,regress-1196683.js也在4月12日随此漏洞修复一起提交,而这个漏洞修复直到4月13日才应用到Chrome稳定版。一些安全研究人员已经基于回归测试编写了利用代码,并在那时在Twitter上发布。

仅仅一天后,4月14日,regress-1195777.js也随此漏洞修复一起提交。基于该回归测试,利用代码再次在互联网上泄露。而这次,直到一周后的4月20日才应用到最新的Chrome稳定版。

工作原理

该工具简单地解析/src/v8/test/mjsunit/目录及其子目录下的所有regress-*文件。

从那里,我使用git log检索与回归文件相关的信息。

1
git log -1 --name-only /path/to/regress/file

每个回归将包含以下信息:

  • Chromium Bugs / V8 Bugs
  • V8 Git
  • Chromium Code Search
  • Chromium Code Review

输出将如下图所示:

使用这种方法,我收集了大量带有相关信息的PoC/回归测试,按提交时间排序并按年份划分,从2016年到2021年。参见V8 Harvest。

如何使用

安装以下python3库:

1
2
python3 -m pip install GitPython
python3 -m pip install tqdm

将V8 git仓库克隆到本地机器:

1
git clone https://github.com/v8/v8.git

从https://github.com/star-sg/V8Harvest获取v8Harvest.py

将v8Harvest.py放入V8的文件夹中并运行它,输出将命名为output.md

我希望这个工具对你们中的一些人有用或有益。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计