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

从CVE-2018-8355零基础学Chakracore漏洞利用

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

学习v8后,对chakracore还是一无所知,恶补一波。虽然chakracore不久就会被淘汰了,但对于学习浏览器的漏洞利用而言,漏洞调试经验才是最宝贵的。本篇文章主要是从入门角度,通过调试CVE-2018-8355一步步学习chakracore引擎的漏洞利用。文章难免会出现理解错误,敬请斧正。
文中涉及到有漏洞的chakracore程序,连同上一篇的v8程序,我都编译好放在了github上,链接在文章末尾。有兴趣的童鞋,可以下载调试。调试环境:Ubuntu 18.04系统。
0×01 编译chakracore源码
chakracore的编译相比v8来说是很简单的,直接git clone编译即可。如果需要patch补丁的话,在下载源码后,直接patch命令加入源码,再编译:
git clone https://github.com/Microsoft/ChakraCorecd ChakraCorepatch -p1 ./build.sh
如果需要切换到某个有问题的分支,以CVE-2018-8355为例,在github上找到该漏洞的commit,然后git切换到该分支,编译即可。
git clone https://github.com/Microsoft/ChakraCorecd ChakraCoregit checkout 91bb6d68bfe0455cde08aaa5fbc3f2e4f6cc9d04 或 git reset --hard 91bb6d68bfe0455cd./build.sh
0×02 chakracore的调试方式
这里主要讲源码调试,后续会专门总结非源码模式下主流浏览器在windbg/gdb中的通用调试技巧。
chakra默认没有显示对象地址和int 3断点的调试接口,因此需要在源码中定制。具体需要修改ChakraCore/bin/ch/WScriptJsrt.cpp和WScriptJsrt.cpp.h。
在WScriptJsrt.cpp文件起始位置增加:
#include
然后在WScriptJsrt.cpp中合适位置定义breakpoint和addressOf接口:
IfFalseGo(WScriptJsrt::InstallObjectsOnObject(global, "breakpoint", BreakpointCallback));IfFalseGo(WScriptJsrt::InstallObjectsOnObject(global, "addressOf", addressOfCallback));....JsValueRef __stdcall WScriptJsrt::BreakpointCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState){    raise(SIGINT);    return nullptr;}​JsValueRef __stdcall WScriptJsrt::addressOfCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState){    for(unsigned int i=1; i  argumentCount; i++)    {        wprintf(_u("Addresss of the %2dth argument is 0x%llx\n"), i, (long long)arguments[i]);    }    fflush(stdout);    return nullptr;}
在WScriptJsrt.cpp.h中增加:
static JsValueRef CALLBACK BreakpointCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState);static JsValueRef CALLBACK addressOfCallback(JsValueRef callee, bool isConstructCall, JsValueRef *arguments, unsigned short argumentCount, void *callbackState);
编译ChakraCore即可。
然后在编写的js脚本中就可以利用下列语句,实现打印某个对象的地址或触发int3断点的效果:
let array1 = [1.1, 2.2, 3.3];let array2 = [1.1, 2.2, 3.3];addressOf(array1, array2);breakpoint();
gdb调试该脚本:
pwndbg> set args poc.jspwndbg> rStarting program: /Release/ch poc.js... ...Addresss of the  1th argument is 0x7f02d8b51cb0Addresss of the  2th argument is 0x7f02d8b51d20... ...Program received signal SIGINTpwndbg>
现在就能够在gdb中打印对象的内存地址,并在需要的位置断了下来。这两个函数基本可以满足后续漏洞利用过程中的调试需求了。
0×03 对chakra类型混淆漏洞的理解与利用思路
首先需要学习的知识点是,chakra中的数组存在三种,分别为NativeIntArray、NativeFloatArray和VarArray。VarArray代表的是对象数组。比如:
let arr = [1.1, 1.1];
这里arr是NativeFloatArray,我们可以通过向数组中添加非Native元素,自动使其变为VarArray对象数组:
arr[0] = {}
NativeIntArray和NativeFloatArray数组转化成VarArray数组过程中,会将数组中的元素通过异或0xfffc000000000000转化为VarArray中的数据。也就是说VarArray会通过数组中元素的高位来判断数组中的元素是数据还是对象。
NativeIntArray和NativeFloatArray之间出现混淆一般不能带来安全问题,但是当这二者和VarArray混淆之后就会出现数据和对象无法区分的问题。先看一段简单的代码:
a[0] = 1.2;xxxx;a[0] = 2.3023e-320; // 0x1234的Float格式
这段代码在JIT优化后的表现形式是这样的:
mov a.segment.index 1.2xxxx;mov a.segment.index 2.3023e-320
如果在xxxx操作过程中,将NativeFloatArray的类型改变成VarArray,但JIT优化过程无法检测这种变化,那么在JIT优化期间,2.3023e-320就会仍旧被当做浮点数赋值给a[0]元素。但当程序离开JIT优化函数后,很明显此时a数组已经转换为对象数组了,因此再访问a[0],实际上访问的就是以0×1234作为内存地址的一个对象。而0×1234内存肯定不可访问,从而产生内存访问异常。
let a = [1.1, 2.2];function opt() // JIT优化{    a[0] = 1.2;    xxxx;    a[0] = 2.3023e-320; // 0x1234的Float格式}print(a[0]);  //此时a[0]已经为一个对象了
因此,对JIT优化产生的类型混淆,最需要理解的本质是,在JIT优化函数过程中a[0]一直会被当做浮点数来处理,而程序离开JIT优化函数后,a[0]就会被JS引擎正常地认为是一个对象了。这一点需要特别特别特别好好理解一下。再次举例说明:
let a = [1.1, 2.2];let obj = {}let b = 0;function opt() // JIT优化{    a[0] = 1.2;    a[1] =obj; // 将a的类型改为对象数组而JIT优化无法察觉    a[0] = 2.3023e-320; // 0x1234的Float格式    b = a[1]; // 此时b存储的就是obj对象的内存地址了    }print(a[1]);  //此时a[1]已经为obj对象了print(b);  // 可以打印出obj对象的地址

[1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页

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