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

Chakra漏洞(CVE-2018-8266)漏洞分析

来源:本站整理 作者:佚名 时间:2020-03-18 TAG: 我要投稿

虽然微软已经在新版Edge浏览器中弃用Chakra引擎,但作为曾经的微软主力JS引擎,Chakra在其短暂的生命周期中为我们留下了许多经典JS漏洞,这些案例是学习脚本引擎漏洞非常不错的资料。本文我们一起来看一个Chakra引擎的JIT类型混淆漏洞。
 
漏洞复现
Bruno Keith在《Attacking Edge through theJavaScript compiler》这篇paper中给出了该漏洞的PoC。为便于观察,我们对其稍加改动,调试所用Poc如下。

漏洞调试的第一步有两个关键要素:能复现问题的样本和能复现问题的环境,上面已经有了样本,接下来需要搭建能复现漏洞的环境。
首先在ChakraCore项目中搜索当前漏洞的CVE号:

随后定位到该漏洞补丁对应的commit:

接着选取一个补丁之前的版本,这里最终选取的是d1dc14版本(Bruno Keith指出的版本)。许多文章中一般只会提及所需ChakraCore版本对应的sha1,如果遇到这种情况,可以直接替换下面链接中的sha1进行下载:
https://github.com/microsoft/ChakraCore/tree/sha1
下载完成后,需要编译生成可供调试的二进制文件,ChakraCore原生支持VS编译,这里采用VS2015编译,编译选项为x64+release。编译完成后,在如下相对路径会生成相关二进制文件(如需生成IR等中间代码,请编译为Debug版本):
Build\VcBuild\bin\x64_release
我们主要关注ch.exe(用于加载ChakraCore.dll)和ChakraCore.dll(漏洞模块)。
现在已经有了复现问题的环境,将ch.exe设为启动项目,并在”属性->调试->命令行参数”配置PoC文件全路径,启动调试,可以观察到如下异常:

为了进一步定位问题,接下来我们采用Windbg Preview的TTD(Time Travel Debugging)进行调试,TTD调试的一个好处是可以在不用重启调试器的情况下进行反向回溯。
安装完Windbg Preview后,首先在界面上设置一下源码路径和符号路径:

接着用管理员权限启动调试器,进行TTD文件路径等基本设置,点击Record开始调试,此过程中如果出现弹窗,请不要点cancel,否则TTD调试将终止。

脚本执行完毕后,在调试器中观察到和VS中相同的崩溃点:

 
定位成因
从上一小节最后一张截图中我们可以看到崩溃时rax被当做指针来寻址,出问题的rax取自rdi,看一下rdi里面存了什么:

似乎一个DynamicObject对象的auxSlots指针被覆写为了一个非预期值,而且这个非预期值来PoC。
接下来借助TTD回溯auxSlots对应的内存地址是在前面何时被改写的:

可以看到前一次改写这个地址处的数据是在JIT代码中,紧接着往前回溯一条指令,我们来看一下改写前此处是什么:

而0x2337、2这两个整数此时仍Inline存储在DynamicObject中。

此时回头看一下PoC,注意到数字1、2、3、4、5、0x1337、0x2337都是PoC里面设置的属性值。
为什么上述DynamicObject对象的5个属性会变成这种两头存储的状态?
为了回答这个问题,首先要理解DynamicObject对象的属性存储方式,关于这部分更多的细节可以参考《AttackingEdge through the JavaScript compiler》。这里仅借助ChakraCore源码中对auxSlots的注释进行说明:

以上注释对应的源码文件:
lib\Runtime\Types\DynamicObject.h
可以看到此时auxSlots对应的情况似乎是(#2),接下来我们再次往前回溯,看再前面一次修改auxSlots对应地址处的操作在什么时候?

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

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