欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何在v8引擎中找到未被发现的攻击面(以CVE-2019-5790为例)

来源:本站整理 作者:佚名 时间:2019-05-08 TAG: 我要投稿

如果你查看最近关于浏览器安全性和JavaScript引擎安全性的所有文章,你很容易产生一种错觉,即在现代JavaScript实现中,只能在即时(just-in-time, JIT)编译器中寻找未被发现的漏洞。JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中,该引擎的结构非常复杂、代码非常混乱(仅在3月份,仅V8就提交了500次有问题的代码),另外公开披露的漏洞的数量似乎不断地在增加,这些都表明现代JavaScript就是所有攻击的初始源头。
然而,在研究web浏览器等常见的攻击目标时,许多研究人员的关注点很可能会习惯性的被公开披露的漏洞所主导。我想在发现漏洞这件事上,造成这样的原因主要有两方面:
一方面,在开始寻找一个从未被发现的新漏洞时,这种参考已有成果的方法可以让研究人员很好地快速了解代码库中可能容易出错的区域。毫无疑问,有些研究范围(JavaScript引擎)比其他领域更复杂,技术要求更高,因此为了快速得出成果,许多人就愿意在既定成果中打转转,不做思考。
另一方面,人们常常忘记代码库的其他部分(目前不太受公众关注)也可能提供一些有趣的攻击面和漏洞,不应该被轻易忽略。
如果研究人员的目标是寻找生命周期已经超过几周甚至几个月的漏洞,那以上这种跟风的方法是没有什么问题的。不过在寻找新出现甚至还未在公开出版物中提及的漏洞时,以上方法就没有用了。
在这篇文章里,我们描述我们是如何成功地找到一个在v8引擎中的漏洞(CVE-2019-5790)?除此之外,我还会介绍一下如何专注于一个看起来不像是有攻击面的架构的。
JavaScript管道
下面给出了JavaScript管道中涉及的不同阶段的高级描述,以便对可能的攻击表面提供非常粗略的概述。如果你想了解更多,请点此。
                             AST               Bytecode
+-------------+   +--------+    +-------------+        +--------------+
| JavaScript  |-->| Parser |--->| Interpreter |------->| JIT Compiler |----+
| source code |   |        |    | (Ignition)  |        | (TurboFan)   |    |
+-------------+   +--------+    +-------------+        +--------------+    | Assembly
                                       |                                   | code
                                       |               +---------+         |
                                       +-------------->| Runtime |
以下描述将重点介绍V8,但类似的概念也适用于其他引擎。
分析JavaScript引擎漏洞的第一步是解析JavaScript源代码,目的就是将源代码转换为抽象语法树(AST)表示。即使是这样一个看似简单的任务,例如从字符流中扫描已知令牌的文本,在V8等现代JavaScript引擎中也得到了高度的速度优化和持续改进。这正是第一阶段,这一阶段是我们能够确定漏洞的基础,下文将加以说明。
构建AST之后,它被转换为自定义字节码,然后由解释器或JIT编译器使用。V8使用Ignition作为它的解释器,2016年谷歌V8 JavaScript引擎引入新解释器Ignition,旨在减少内存消耗。字节码要么由寄存器设备直接执行,要么传递给JIT编译器。在JavaScript管道这个阶段,我们已经有了进行了一些优化,因此潜在的漏洞也可能会出现。
当一个函数在interpeter中执行了一定次数后,它被令牌为“hot”,并将由JIT编译器编译为设备代码。V8使用TurboFan作为它的JIT编译器,从整体架构上Ignition与TurboFan在一起配合工作有许多的好处。例如,不需要在手工编写高效的程序集处理Ignition生成的字节码,而是使用TurboFan中间件来处理,并让TurboFan为V8所支持的平台进行优化和生成最终的执行代码。目前,这个阶段是一个非常复杂的过程,已经成为了大量漏洞的来源之处。
与JavaScript管道同时使用的还有垃圾收集器,它允许程序员不必显式地管理内存。尽管这减少了大量的漏洞,比如内存泄漏,但是它也会导致一些有趣的漏洞。因为当需要分配的内存空间不再使用的时候,JVM将调用垃圾回收机制来回收内存空间。
JavaScript解析
实现解析器的代码可以在src/parser/V8源代码树中找到:
                                                  +-----------+

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

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载