宝运莱官方网站ADLab:Chrome 肆意代码执行缝隙分析
颁布功夫 2021-04-164月13日,国表安全钻研人员在社交媒体上颁布了Chrome 的0Day 缝隙(拜见参考链接[1]),缝隙编号为CVE-2021-21220,并在github上公开了该缝隙的POC以及利用代码,有关的利用代码在关关沙盒的情况下可达到远程代码执行。由于chromium 有关框架的宽泛利用,该缝隙在其他浏览器或剧本引擎中仍有存在的可能。该缝隙在chrome 90.0.4430.72版本已经建复,提醒宽大用户实时更新到最新版本(拜见参考链接[2]),以躲避该缝隙存在的攻击风险。
宝运莱官方网站ADLab分析发现,该缝隙存在于Chrome 的JavaScript 解析引擎V8中,POC重要代码如下:

在POC line4执行异或操作,(2**31)^0=-2147483648。凭据ECMA尺度(拜见参考链接[3]),异或的了局是32位整数:

在v8 SimplifiedLowering阶段,增长了对异或的了局执行ChangeInt32ToInt64的操作:

SimplifiedLowering 执行后,异或的类型被象征为Word32:

在MachineOperatorOptimizer阶段,由因而和0做异或,所以用左操作数包办异或操作。

此时的结构图如下,能够看出异或的了局是Word32|TypeUint32:

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

所以,这里的操作码是kX64Movl操作码,该指令在将源操作数移至主张地位时并不做符号扩大,这样在POCline4中x的值为2147483649,因而在poc line12的地位,编译器其实使用的是x=1的值作为创建数组的长度。这是编译器未曾意料到的情况。
在变量的领域分析中,编译器以为创建的数组长度是0:

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

由于数组长度固定,编译器在LoadElimination 的过程中会进行常量折叠,在代码蹊径走到这里的时辰通过StoreField操作将数组的长度直接赋值为-1:


由因而smi,所所以0xfffffffe:

打印数组长度:

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

关于利用的部门,根基是老套路,这里就不再赘述。
参考链接:
[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安全钻延注工控系统安全钻延注云安全钻研。钻研成就利用于产品主题技术钻延注国度沉点科技项目攻关、专业安全服务等。



京公网安备11010802024551号