加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

Safari信息泄露漏洞分析

发布时间:2018-11-08 00:44:38 所属栏目:评论 来源:Alpha_h4ck
导读:副标题#e# 前言 Javascript中的数组和数组对象一直都是编程人员优化的主要目标,一般来说,数组只会包含一些基本类型数据,比如说32位整数或字符等等。因此,每个引擎都会对这些对象进行某些优化,并提升不同元素类型的访问速度和密集型表示。 在JavaScript

我们可以看到在这种情况下,有一个输入数组的indexing类型为ArrayWithUndecided,结果indexing类型将会是另一个数组的indexing类型。因此,如果我们我们用一个indexing类型为ArrayWithUndecided的数组和另一个indexing类型为ArrayWithDouble的数组去调用Array.prototype.concat方法的话,我们将会按照快速路径[[2]]运行,并将两个数组进行拼接。

这段代码并不能保证这两个“butterfly”(JavaScript引擎攻击技术里的一种概念,详情请参考【这篇文章】)在代码调用memcpy之前能够正确初始化。这也就意味着,如果我们能够找到一条允许我们创建一个未初始化数组并将其传递给Array.prototype.concat的代码路径,那我们就能够在堆内存中拥有一个包含了未初始化值的数组对象了,而且它的indexing类型还不是ArrayWithUndecided。从某种程度上来说,这个安全问题跟lokihardt在2017年报告的一个旧漏洞有些相似,只不过利用方式不同。

在创建这种数组对象时,可以利用NewArrayWithSize DFG JIT的操作码来实现,在对FTLLowerDFGToB3.cpp中FTL所实现的allocateJSArray操作码进行分析之后,我们可以看到这个数组将会包含未初始化的值。引擎根本不需要对数组进行初始化,因为这个数组的indexing类型为ArrayWithUndecided。

  1. ArrayValuesallocateJSArray(LValue publicLength, LValue vectorLength, LValue structure,LValue indexingType, bool shouldInitializeElements = true, boolshouldLargeArraySizeCreateArrayStorage = true)  
  2. {  
  3.     [ ... ]  
  4.     initializeArrayElements(  
  5.        indexingType,  
  6.        shouldInitializeElements ?m_out.int32Zero : publicLength, vectorLength,  
  7.        butterfly);  
  8. ...  
  9. voidinitializeArrayElements(LValue indexingType, LValue begin, LValue end, LValuebutterfly)  
  10. {  
  11.     if (begin == end)  
  12.         return;    
  13.     if (indexingType->hasInt32()) {  
  14.         IndexingType rawIndexingType =static_cast<IndexingType>(indexingType->asInt32());  
  15.         if (hasUndecided(rawIndexingType))  
  16.             return;  // [[ 4 ]] 

语句new Array(n)在被FTL JIT编译时将会触发[[4]],然后返回一个indexing类型为ArrayWithUndecided的数组,其中就包含未初始化的元素。

漏洞利用

清楚了之前所介绍的漏洞原理之后,想必触发这个漏洞也并非难事:我们可以不断重复调用一个使用new Array()方法来创建数组的函数,然后调用concat方法将这个数组和一个只包含double类型数据的数组进行拼接。在调用够足够次数之后,FTL编译器将会对其进行编译。

这份【漏洞利用代码】可以利用这个漏洞来泄漏一个目标对象的内存地址,实现机制是通过我们所创建的对象进行内存喷射,在触发这个漏洞之后,我们就能够从代码所返回的数组中找到目标对象的地址了。

总结

这个漏洞目前已经在iOS 12和macOS Mojave的最新版本(Safari)中修复了,该漏洞的CVE编号为CVE-2018-4358。

【编辑推荐】

  1. 5G规范安全性和协议漏洞分析(下篇)
  2. 史上最大安全漏洞案和解 雅虎向2亿用户赔偿3.5亿元
  3. Windows 10被曝新零日漏洞 涉及3大版本
  4. 网络安全基础,缓冲区溢出漏洞解析
  5. 新的BLEEDINGBIT漏洞影响广泛使用的蓝牙芯片
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读