前言
Javascript中的数组和数组对象一直都是编程人员优化的主要目标,一般来说,数组只会包含一些基本类型数据,比如说32位整数或字符等等。因此,每个引擎都会对这些对象进行某些优化,并提升不同元素类型的访问速度和密集型表示。
在JavaScriptCore中,JavaScript引擎是在WebKit中实现的,其中每一个存储在对象中的元素都代表着一个IndexingType值,一个8位整数代表一套Flag组合,具体的参数定义可以在IndexingType.h中找到。接下来,引擎会检测一个对象中indexing的类型,然后决定使用哪一条快速路径,其中最重要的一种indexing类型就是ArrayWithUndecided,它表示的是所有元素均为未定义(undefined),而且没有存储任何实际的值。在这种情况下,引擎为了提升性能,会让这些元素保持未初始化。
分析
下面,我们一起看一看旧版本中实现Array.prototype.concat的代码(ArrayPrototype.cpp):

这个函数主要用来判断结果数组[[1]]的indexing类型,我们可以看到,如果indexing类型为ArrayWithDouble,它将会选择[[2]]作为快速路径。接下来,我们看一看:
mergeIndexingTypeForCopying的实现代码,这个函数主要负责在Array.prototype.concat被调用时,判断结果数组的indexing类型:
我们可以看到在这种情况下,有一个输入数组的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。
语句new Array(n)在被FTL JIT编译时将会触发[[4]],然后返回一个indexing类型为ArrayWithUndecided的数组,其中就包含未初始化的元素。
漏洞利用
清楚了之前所介绍的漏洞原理之后,想必触发这个漏洞也并非难事:我们可以不断重复调用一个使用new Array()方法来创建数组的函数,然后调用concat方法将这个数组和一个只包含double类型数据的数组进行拼接。在调用够足够次数之后,FTL编译器将会对其进行编译。
这份【漏洞利用代码】可以利用这个漏洞来泄漏一个目标对象的内存地址,实现机制是通过我们所创建的对象进行内存喷射,在触发这个漏洞之后,我们就能够从代码所返回的数组中找到目标对象的地址了。
总结
这个漏洞目前已经在iOS 12和macOS Mojave的最新版本(Safari)中修复了,该漏洞的CVE编号为CVE-2018-4358。
safari浏览器好用吗?
Safari,苹果计算机的最新作业系统Mac OS X中新的浏览器,用来取代之前的Internet Explorer for Mac。 Safari使用了KDE的KHTML作为浏览器的运算核心。 目前该浏览器已支持 Windows平台,但是与运行在Mac OS X上的safari相比,有些功能出现丢失。 2005年4月29日 Safari 2.0版推出,内置RSS及Atom阅读器,其他新功能计有隐秘浏览、收藏及电邮网页、搜寻网址书签等,其速度是1.2.4版本的1.8倍。 2005年4月 Safari的开发人员之一Dave Htatt,就他为Safari进行除错的进展方面提交文件,使之能通过Acid2测试。 4月27日,Hyatt宣布其内部试验版本的Safari通过了Acid2。 至10月31日,Safari 2.0.2版正式推出,成为首个通过Acid2测试的浏览器。 2008年3月19日 Windows平台的Safari 3.1版已发布,根据苹果Safari 3.1版本的介绍,这一版本不仅秉承“最出色的浏览器”的特性,而且集合了大量新的改进,堪称Mac和Windows平台上“最快的浏览器”。 Safari 简洁的外观、雅致的用户界面让你越过寻常路,尽情享受遨游网络的乐趣。 根据官方介绍,Safari 3.1版载入页面的速度是IE 7的1.9倍,是Firefox 2的1.7倍,运行JavaScript的速度则是其他浏览器的6倍。 性能测试以秒为单位。 苹果公司于2008年3月在一个配有2.4GHz Intel Core 2 Duo 的iMac系统上进行了此项测试,操作系统为 Mac OS X Leopard 10.5.2,配置1GB 内存和显存为256MB的 ATI Radeon HD 2600。 HTML与JavaScript基准以VeriTest使用默认设置的iBench Version 5.0为基础。 性能测试使用的是Safari测试版;其他所有浏览器均为正式版。 浏览器性能随系统配置、网络连接和其他因素而有所不同。 此次发布的Safari 3.1支持最新的网页标准,并包含大量新的改进,包括:改进JavaScript对CSS 3支持的性能表现、改进CSS渲染、HTML 5视频及音频的处理、SQL数据库离线存储、SVG图像以及支持SVG高级文本等。 另外,新版Safari 3.1在安全性上也作了相当的改进,这一版本已支持强大的128位加密,有效地保护用户的数据安全。 2008年11月14日推出了其Safari网络浏览器的最新升级3.2版本,对应Mac OS X 10.5 Leopard、Mac OS X 10.4 Tiger和Windows XP/Vista平台。 Safari 3.2主要对浏览器安全性进行了升级,针对钓鱼诈骗网站进行了专门的防范,并提高了网上商务应用的辨识度。 该升级共包括11个安全补丁,其中只有4个为Mac OS/Windows平台共有,修补的剩余7个漏洞都仅在Windows平台存在苹果2009年2月25日发布了Safari 4浏览器的首个公开测试版本,号称是世界上最快的网络浏览器,速度是Safari 3和其他浏览器的数倍。 很多人恐怕会认为苹果在吹牛,不过根据CNET的实际测试,苹果所言非虚,至少在JavaScript脚本运行速度上是如此。 JavaScript是新一代网页设计中的常用脚本语言,它的运行速度很大程度上决定了浏览器在访问诸如Gmail这样的网页应用程序时的效率。 CNET为测试Safari 4的JavaScript运行速度,分别在PC和Mac平台上使用SunSpider进行测试。 结果相当惊人,Safari 4的速度是IE7的42倍,IE8的6倍,Firefox 3的3.5倍,Google Crome的1.2倍。 这一数字甚至高于苹果官方给出的“比IE7快30倍,比Firefox 3快3倍”的数字。
如何用javascript为元素添加class
以给body标签添加class为例通过jQuery$(body)(class1class2);$(body)(class1class2);支持classlist的高级浏览器(IE10+,Chrome,Firefox,Safari)(class1,class2);(class1,class2);不支持classList的浏览器只能通过className来添加+=cl[1]直接把样式赋值给classNamevar odiv=(div1);= div3//这样我们会得到 class =div3 会直接把div2样式给覆盖掉;[2]使用累加赋值给classNamevar odiv=(div1);+= +div3 //样式和样式之间需要空隙 ,所以加个空字符串隔开//这样可以得到 可以正常增加,但是我们在添加样式的时候我们得考虑下他本身之前有没有同名的样式,如果有我们添加的话就会变成累赘 比如class=div2 div3 div3;[3]检测样式原先之前是否有相同的样式var odiv=(div1); function hasClass(element,csName){(RegExp((\\s|^)+csName+(\\s|$))); //使用正则检测是否有相同的样式}[4]在[3]的基础上我们就可以进行判断性给元素添加样式了 var odiv=(div1); function hasClass(element,csName){(RegExp((\\s|^)+csName+(\\s|$))); //使用正则检测是否有相同的样式} function addClass(element,csName){if(!hasClass(element,csName)){+= +csName;
定制陕西联通视频定向流量后,观看视频还收流量费吗?
陕西联通视频定向流量产品定制成功后,免费观看视频有以下情况:1.定制生效后手机浏览器(注:必须使用手机自带浏览器,如iPhone用户请使用Safari浏览器,安卓用户使用系统自带的“互联网”浏览器,不得使用第三方浏览器,如360、UC浏览器等)访问定向流量全免费,用户当月收费免费合计流量6GB封顶;2.“搜狐联通版”免流量费支持网站/客户端两种使用方式;3.“乐视联通版”、“沃看陕西”目前陕西用户免流量费只支持网页版,客户端版正常收费。
发表评论