首页
社区
课程
招聘
[原创]CVE-2016-7189分析
发表于: 2017-11-17 02:06 6848

[原创]CVE-2016-7189分析

2017-11-17 02:06
6848

标签(空格分隔): Chakra

观察一下poc,poc首先创建了一个array t,之后创建object o,并对o设置一个getter。之后把t的_proto设为o,在对t调用Array.prototype.join。
在getter中会把t中的所有元素设为对象{a:i}。

简化POC进行调试,发现程序触发Assert异常

之所以会触发这个Assert异常是因为pArr的虚表类型为JavascriptArray::vtable,而不是JavascriptNativeIntArray::vtable,由此推测这是一个Array对象的类型混淆。
根据调用关系可以看到是JavascriptArray::EntryJoin函数中触发了crash。同时由POC可以看出t的初始类型是JavascriptNativeIntArray,在getter中的赋值会导致t的类型变为JavascriptArray,而这个过程就在Array.prototype.join中发生。当然这里只是猜测,需要通过调试来说话。

对应于Chakra的implementation是有如下几个函数

其中主要的处理是在JoinArrayHelper中完成的

关注JavascriptArray::JoinArrayHelper函数的流程,发现有以下代码值得注意

注意代码中调用了TemplatedGetItem,而这个函数最终会调用到ES5ArrayTypeHandlerBase<T>::GetItem。我们知道这个函数会调用到对Object设置的Getter。

通过调试发现经过if(TemplatedGetItem(arr, i, &item, scriptContext))之后array t的类型由Array变成了NativeIntArray

这也印证了我们前面的猜测

POC中还有一句t.length = 100;如果去掉这句POC是不能触发的。
原因是因为代码的逻辑是获取目标array的长度,然后逐个元素的取出进行操作

但是注意我们对于array t调用Object.defineProperty的操作并不会增加array的length值,所以TemplatedGetItem也就不会对我们的getter进行调用,因此需要手动设置array t的长度使得我们的getter可以被调用。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
2
关于利用,等这一系列分析发完之后会单独发帖写利用部分
2017-11-17 02:07
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
期待0x9A82湿敷的利用部分
2017-11-17 21:19
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错!
2017-11-18 20:30
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
5

2018-7-15 00:22
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
6
通过调试发现经过if(TemplatedGetItem(arr, i, &item, scriptContext))之后array t的类型由Array变成了NativeIntArray

这句话错了,刚好反了……(看下面配字应该是笔误
2018-7-15 00:23
0
游客
登录 | 注册 方可回帖
返回
//