从漏洞利用角度介绍Chrome的V8安全研究

来源:岁月联盟 编辑:猪蛋儿 时间:2020-04-14

0x01  环境搭建
去年我对Chrome的JavaScript引擎V8 的漏洞利用进行了大量研究,尽管这种漏洞利用的大多数概念都是传统技术:例如,类型混淆和释放后使用漏洞,区别之一是UAF的free / malloc没有被直接利用;类型混淆漏洞的可利用性的根本原因之间存在巨大差异,这是由于在触发Type Confusion错误之前JavaScript引擎进入了优化阶段。
正因为如此,在完成了一个漏洞利用并学习很多知识之后,我试图通过阅读代码并编写一些示例来尝试了解V8中的优化流程。v8的开发人员团队使用一个非常出色的工具Turbolizer。
如果你也想做进一步研究,请在终端中执行以下命令:
 git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git && cd depot_tools && echo "export PATH=/$PATH:`pwd`" >> ~/.bashrc
 source ~/.bashrc && cd ~ && mkdir v8_turbolizer && cd v8_turbolizer && fetch v8
 ./v8/build/install-build-deps.sh
 ./v8/tools/dev/gm.py x64.debug d8
 cd ./v8/tools/turbolizer/ && npm i && npm run-script build
编译执行这些命令可能需要一些时间,具体取决于构建V8的网络速度和CPU能力。
0x02  V8的生态系统
V8是一款非常复杂的软件,它由JavaScript引擎的许多部分组成:解析器,AST,中间表示,字节码解释器,即时编译器,优化器等。
JIT编译器简介
以前,JavaScript纯粹是一种解释性语言,这意味着引擎中将有一些组件可以将代码动态地转换为字节码,以便最终可以执行。
如今,JavaScript需要提高性能,因为它不再只是用来修改图形界面并通过与DOM交互来修改一些HTML输入。现在,它已用于更为复杂的项目中,例如NodeJS,通过JavaScript,我们可以在其中运行完整的服务器。因此,大多数JavaScript引擎已实现JIT编译器。
JIT编译器在JavaScript代码本身运行时动态地动作。从本质上讲,它基于一个非常简单的概念:如果多次使用一个函数,它将被视为“热”函数,因此它将被编译为机器代码,并且在下次调用同一函数时,机器代码将被编译为机器代码。运行,跳过所有中间步骤(中间表示,转换为字节码等)。
Ignition, TurboFan and Optimisation
我们的重点将放在解释器和优化编译器上。V8中带有Ignition(代替了基线编译器,但它也是字节码解释器)和TurboFan(V8的优化编译器之一),就像它是V8引擎一样。
在运行任何JavaScript之前,Turbolizer将在解析器之后运行,它的主要功能是生成字节码,然后将其全部馈送到Turbolizer的解释器部分以运行它。需要记住的一点是,在运行源代码之前,已经进行了某些优化,例如消除了无效代码。
它会通过检查诸如Ignition提供的反馈,例如检查一个函数运行了多少次,为该函数提供的类型和值是什么等。由此,如果代码的任何部分调用很多,Turbofan将进行编译字节码转换为机器码。所以,Turbofan是JIT编译器,但有一点变化:它基于假设优化代码。这就是为什么Turbofan以其优化而闻名。
为了快速优化,有一个重要的概念与V8中的内置函数有关,这些是预编译的函数(JavaScript,字节码或汇编代码),已知它们经常在JavaScript中用于调试目的,因此V8具有一组可以从脚本本身调用的函数,并将触发内置代码。 查找内置文件的另一种方法是通过SimpleInstallFunction在V8的源代码中进行搜索。
以上所有内容都是管道的一部分,在管道中,所有JavaScript代码,字节码和优化都转化成机器代码(得到优化)或流回字节码。
0x03  Turbolizer介绍
很高兴看到大公司和世界一流的团队共享他们的工具,以简化诸如Turbofan之类的软件调试。这就是Turbolizer的全部意义,它是一个图形界面,可帮助调试运行JavaScript代码时每个优化阶段发生的事情。

Turbolizer的示例用法-TypedLowering阶段

Turbolizer的使用示例-EarlyOptimization阶段
0x04  One too many colours
正如在前面的图像中看到的那样,Turbolizer在优化的不同阶段给出了五种颜色。由于Turbofan使用“ 节点海 ” 的概念,这是一个有助于编译优化的框架。在我们的案例中,重要的是要了解大量的节点如何与JavaScript相关联的,并在Turbolizer的支持下了解每个阶段发生了什么。
节点数

黄色:这些节点代表控制节点,改变或描述脚本流程,例如起点或终点,返回,“ if”语句等。

浅蓝色:表示某个节点可能具有或返回的值的节点。比如一个函数总是返回“ 42”,根据优化阶段,我们将其视为图形上的常数或范围(42、42)。

深蓝色:中级语言动作的表示(字节码指令),有助于了解从何处将反馈送到Turbofan中。

[1] [2] [3]  下一页