聚焦源代码安全,网罗国内外最新资讯!

编译:奇安信代码卫士

本文作者 iamelli0t 发布文章,详细分析了谷歌于今天修复的两个近期备受关注的两个漏洞Chrome CVE-2021-21220 和 CVE-2021-21224。如下节选编译了针对 CVE-2021-21224 漏洞的分析。

4月12日,Chromium 中的一个代码 commit 引发关注,它是针对 Chromium Javascript 引擎 v8 中某个漏洞的 bugfix。同时,该 bugfix 的回归测试用例 regress-1196683.js 也被提交。基于该回归测试用例,某研究员发布了exploit 样本。而由于 Chrome 发布管道的原因,直到4月13日该漏洞才被修复。

巧合的是,4月15日,v8 中某个 bugfix 的另外一个代码 commit 也包含在一个回归测试用例 regress-1195777.js 中。基于该测试用例,exploit 样本再次被暴露。由于最新的 Chrome 稳定版并未拉取该 bugfix commit,因此该样本仍然可在最新的 Chrome 渲染进程中遭利用。当易受攻击的 Chromium 浏览器在未启用沙箱 (-no-sandbox) 的情况下访问恶意链接时,该漏洞将被触发并造成远程代码执行。

漏洞分析

该漏洞的 bugfix 如下:

该 commit 修复了一个整数会话节点生成错误,该节点用于在 SimplifiedLowering 阶段将64位整数转换为32位整数(截断)。提交前,如果当前节点的输出类型是 Signed32 或 Unsigned32,则生成TruncateInt64ToInt32 节点。提交后,如果当前节点的输出类型是 Unsigned32,则接下来需检查 use_info 的类型。只有当 use_info.type_check() == TypeCheckKind::kNone 时,才会生成 TruncateInt64ToInt32。

首先,通过 regress-1195777.js 分析该漏洞的根因:

(function() {function foo(b) {let x = -1;if (b) x = 0xFFFFFFFF;return -1 < Math.max(0, x, -1);}assertTrue(foo(true));%PrepareFunctionForOptimization(foo);assertTrue(foo(false));%OptimizeFunctionOnNextCall(foo);assertTrue(foo(true));
})();

触发 JIT 的函数 foo 中的关键代码是 return -1 < Math.max(0, x, -1) 。我们重点关注 TurboFan 关键阶段中的 Math.max(0, x, -1) 优化进程:

(1)TyperPhase

Math.max(0, x, -1) 对应于节点56 和节点58。节点58的输出是节点41

的输入:SpeculativeNumberLessThan (<)。

(2)TypedLoweringPhase

Math.max(0, x, -1) 中的两个常数参数 0,-1(节点54 和节点55)被常数节点32 和节点14 替换。

(3) SimplifiedLoweringPhase

原始的 NumberMax 节点56和节点58被 Int64LessThan + Select 节点替换。原始的节点41:SpeculativeNumberLessThan 被替换为 Int32LessThan。当处理 SpeculativeNumberLessThan 的输入节点时,由于输入节点 (Select) 的输出类型是 Unsigned32,则该漏洞被触发,且节点76: TruncateInt64ToInt32 的生成不正确。

Math.max(0, x, -1) 结果被截断为 Signed32。因此,当 Math.max(0, x, -1) 中的 x 是 Unsigned32 时,它会被 TruncateInt64ToInt32 截断为 Signed32。

最后,利用该漏洞,JIT 中异常值为1的变量x可通过如下代码获得(期望的值应该是0):

function foo(flag){let x = -1;if (flag){ x = 0xFFFFFFFF;}x = Math.sign(0 - Math.max(0, x, -1));return x;
}

利用分析

从根因分析来看,当 TurboFan 执行整数数据类型转换(扩展、阶段)时,都会触发CVE-2021-21220 和 CVE-2021-21224。利用这两个漏洞,可以获取 JIT 中异常值为1的变量 x。

根据遭在野利用的样本,利用步骤如下:

(1) 通过出错值为1的变量 x,创建一个数组,长度为1。

(2) 通过Array.prototype.shift() 获取长度为 0xFFFFFFFF 的界外数组。

关键代码如下:

var arr = new Array(x);  // wrong: x = 1
arr.shift();      // oob
var cor = [1.8010758439469018e-226, 4.6672617056762661e-62, 1.1945305861211498e+103];
return [arr, cor];

变量 arr = new Array(x) 的 JIT 代码为:

Rdi 是 arr 的长度,其值为1。它通过指针压缩向左移动一位 (rdi+rdi),并存储在JSArray.length 属性 (+0xC) 中。

Arr.shift() 的 JIT 代码为:

Arr.shift() 后,arr 的长度直接由常数 0xFFFFFFFE 分配,优化过程如下:

(1) TyperPhase

数组长度分配操作主要由节点152和节点153组成。节点152计算 Array.length-1。节点153将结算结果保存在 Array.length (+0xC)中。

(2) LoadEliminationPhase

由于通过 Ignition 获取的x的值为0,因此常数折叠 (0-1=-1) 获得常数 0xFFFFFFFF。左移一位后,它是 0xFFFFFFFE,并存储在 Array.length (+0xC) 中。这样,获得长度为 0xFFFFFFFF 的界外数组。

获得界外数组后,接下来就是常见步骤了:

(3) 凭借该界外数组实现 addrof/fakeobj

(4) 构造一个虚假 JSArray,利用 addrof/fakeobj实现任意内存读取/写入原语

Exploit 样本中 arr 和 cor 的内存布局如下:

(a)   利用该漏洞获得长度为 0xFFFFFFFFF的arr(红框)

(b)   利用界外 arr 和 cor 实现 addrof/fakeobj(绿框)

(c)   利用界外 arr 修改 cor 的长度(黄框)

(d)   利用界外 cor,泄露映射和 cor 的属性(蓝框),伪造一个 JSArray并利用该虚假 JSArray 实现任意内存读/写原语。

(5) 借助 WebAssembly 执行 shellcode

最后,借助 WebAssembly 创建属性为 RWX 的内存页面。该 shellcode 被复制到内存页并在最后执行。

利用截图如下:

推荐阅读

又一枚 Chrome 0day现身

详细分析 Chrome V8 JIT 漏洞 CVE-2021-21220

原文链接

https://iamelli0t.github.io/2021/04/20/Chromium-Issue-1196683-1195777.html

题图:Pixabay License

转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 或 "赞” 吧~

详细分析谷歌紧急修复的 Chrome 0day(CVE-2021-21224)相关推荐

  1. 谷歌紧急修复已遭在野利用的Chrome 0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌发布适用于 Windows.Mac 和 Linux 系统的Chrome 94.0.4606.61 版本,紧急修复已遭在野利用的高危0day. ...

  2. 谷歌紧急修复已遭在野利用的0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 摘要 谷歌发布 Windows.Mac 和 Linux 版本的 Chrome 100.0.4896.127,修复已遭利用的高危0day漏洞(CV ...

  3. 谷歌紧急修复已遭利用的新 0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 上周五,谷歌紧急修复已遭利用的 Chrome 0day (CVE-2022-1096),和 V8 JavaScript 引擎中的类型混淆漏洞有关 ...

  4. 谷歌紧急修复已遭在野利用的高危 V8 0day (CVE-2021-4102)

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌为 Windows.Mac 和 Linux 系统发布 Chrome 96.0.4664.110 版本,修复一个已遭在野利用的位于V8 Jav ...

  5. 谷歌紧急修复今年已遭利用的第9个0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 当地时间上周五,谷歌紧急修复已遭利用的Chrome 高危0day (CVE-2022-4262). 该漏洞是位于V8 JavaScript引擎中 ...

  6. 欧洲最大汽车经销商遭遇勒索攻击、谷歌紧急修复零日漏洞|2月15日全球网络安全热点

    安全资讯报告 谷歌在2021年向安全研究人员支付了创纪录的870万美元 谷歌表示,它向安全研究人员支付了创纪录的870万美元,其中30万美元捐给了慈善机构,用于在2021年通过其漏洞奖励计划披露数千个 ...

  7. 谷歌紧急更新,Chrome 今年第二个零日漏洞曝光

    整理 | 张仕影 出品 | CSDN(ID:CSDNnews) 在曾经市场份额疯长到全球第二的 Firefox 浏览器日益变"糊,并且如今市场占有率已不足 4% 的形势下,2008 年诞生的 ...

  8. 谷歌悄悄修复4个 0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 今天,谷歌更新了2021年5月的安卓安全公告称,本月修复的其中4个漏洞"可能已遭有限的针对性利用". 除了发布这四个漏 ...

  9. 谷歌Chrome 紧急修复已遭利用的两个0day

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌发布适用于 Windows.Mac 和 Linux 系统的 Chrome 95.0.4638.69 版本,修复已遭利用的两个0day(CVE ...

最新文章

  1. 【渝粤题库】国家开放大学2021春1379人文英语3题目
  2. char 和 varchar 的区别,数据库索引B+树
  3. SQL2005 安装时 “性能监视器计数器要求(错误)” 解决方案
  4. Yii2 composer更新后报错: Calling unknown method: yii\web\UrlManager::addRules()
  5. 安装WampServer时出现的问题(丢失VCRUNTIME140.dll或MSVCR110.dll)以及解决办法
  6. Android Xml布局常见问题总结
  7. 常见数学公式和符号的英文读法大全
  8. BAT大厂面试精选的62道高频面试题【笔试+算法+代码+逻辑题等】
  9. onenote打开闪退平板_Win10系统下OneNote打不开或闪退如何解决
  10. 如何用python的turtle画五角星_使用Python的turtle模块画五角星
  11. 抖音小店无货源,营业执照怎么办理?该怎么选择经营范围?
  12. Facet Kernel详解、Random Walk随机游走算法详解
  13. 《呼吸法门精要》南师所讲。读后感
  14. 【分享】Python的QQ群
  15. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]
  16. 网络安全工程师从0单排日记-0
  17. 青龙面板搭建教程安装,使用拉库持续更新,干什么用,我不说?
  18. 韩国美女的16种味道
  19. 使用apache服务部署静态网站--初篇
  20. C语言设计一除法器,verilog 除法器

热门文章

  1. 搭建MIPS平台GDB调试环境
  2. BSCI—7:OSPF的路由汇总
  3. 高效程序员的45个习惯の欲速则不达
  4. html5 图片热点area,map的用法
  5. 使用 IntraWeb (10) - CSS
  6. 好奇:WayOs破解、OEM、修复、打包等工具大全,满足大家的好奇心发下截图
  7. artemis服务_artemis小结
  8. 让组件悬浮所有页面之上
  9. 读写锁分离的循环队列
  10. C#判断当前运行环境是否64bit