使用V8Harvest进行简易漏洞回归监控

本文介绍V8Harvest工具,用于监控V8引擎漏洞回归测试。该工具解析V8测试目录中的回归测试文件,提取关联的漏洞信息、Git提交记录和代码审查链接,帮助安全研究人员快速获取PoC和漏洞修复详情,支持2016-2021年的数据追溯。

简易漏洞回归监控与V8Harvest

引言

在研究Javascript引擎(V8)期间,我创建了一个小工具,帮助你在单个页面上查看包含回归测试的近期V8漏洞。由于回归测试通常包含触发漏洞的PoC(概念验证代码),分析它们对于找出根本原因和编写n-day漏洞的利用代码非常有用。

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

 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进行补丁间隙利用(patch gapping)。由于补丁间隙利用是与时间赛跑,拥有随漏洞修复提交一起公开的回归测试与否会产生巨大差异。

例如,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

使用方法

  1. 安装以下Python3库:
1
2
python3 -m pip install GitPython
python3 -m pip install tqdm
  1. 将V8 git仓库克隆到本地机器:
1
git clone https://github.com/v8/v8.git
  1. https://github.com/star-sg/V8Harvest获取v8Harvest.py

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

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

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