尊龙凯官网入口ADLab:Chrome 恣意代码执行误差剖析

宣布时间 2021-04-16

4月13日,外洋清静研究职员在社交媒体上宣布了Chrome 的0Day 误差(拜见参考链接[1]),误差编号为CVE-2021-21220,并在github上果真了该误差的POC以及使用代码,相关的使用代码在关闭沙盒的情形下可抵达远程代码执行。由于chromium 相关框架的普遍应用,该误差在其他浏览器或剧本引擎中仍有保存的可能。该误差在chrome 90.0.4430.72版本已经修复,提醒宽大用户实时更新到最新版本(拜见参考链接[2]),以规避该误差保存的攻击危害。


尊龙凯官网入口ADLab剖析发明,该误差保存于Chrome 的JavaScript 剖析引擎V8中,POC主要代码如下:


1.png


在POC line4执行异或操作,(2**31)^0=-2147483648。凭证ECMA标准(拜见参考链接[3]),异或的效果是32位整数:


2.png


在v8 SimplifiedLowering阶段,增添了对异或的效果执行ChangeInt32ToInt64的操作:


3.png


SimplifiedLowering 执行后,异或的类型被标记为Word32:


4.png


在MachineOperatorOptimizer阶段,由于是和0做异或,以是用左操作数取代异或操作。


5.png


此时的结构图如下,可以看出异或的效果是Word32|TypeUint32:


6.png


在指令选择时,关于VisitChangeInt32ToInt64操作,凭证其输入类型选择操作码:


7.png


以是,这里的操作码是kX64Movl操作码,该指令在将源操作数移至目的位置时并不做符号扩展,这样在POCline4中x的值为2147483649,于是在poc line12的位置,编译器着实使用的是x=1的值作为建设数组的长度。这是编译器未曾预推测的情形。


在变量的规模剖析中,编译器以为建设的数组长度是0:


8.png


 在执行POP时,会先判断数组的长度是否为0,若是不是就会将其长度减1:


9.png


由于数组长度牢靠,编译器在LoadElimination 的历程中会举行常量折叠,在代码路径走到这里的时间通过StoreField操作将数组的长度直接赋值为-1:


10.png

11.png


由于是smi,以是是0xfffffffe:


12.png


打印数组长度:


13.png

这时超长的数组就出炉了,任由你玩了。从补丁比照上来看(拜见参考链接[4]),关于ChangeInt32ToInt64将其输入作为有符号看待,这样就阻止了该误差通过该路径触发。


14.png


关于使用的部分,基本是老套路,这里就不再赘述。


参考链接:

[1]https://twitter.com/r4j0x00/status/1381643526010597380

[2]https://www.google.com/chrome/

[3]https://www.ecma-international.org/publications-and-standards/standards/ecma-262/

[4]https://chromium-review.googlesource.com/c/v8/v8/+/2820971/3/src/compiler/backend/x64/instruction-selector-x64.cc#1379


尊龙凯官网入口起劲防御实验室(ADLab)


ADLab建设于1999年,是中国清静行业最早建设的攻防手艺研究实验室之一,微软MAPP妄想焦点成员,“黑雀攻击”看法首推者。阻止现在,ADLab已通过CVE累计宣布清静误差近1100个,通过 CNVD/CNNVD累计宣布清静误差1000余个,一连坚持国际网络清静领域一流水准。实验室研究偏向涵盖操作系统与应用系统清静研究、智能终端清静研究、物联网智能装备清静研究、Web清静研究、工控系统清静研究、云清静研究。研究效果应用于产品焦点手艺研究、国家重点科技项目攻关、专业清静服务等。


adlab.jpg