chrome v8 CVE-2021-30632
chrome v8 CVE-2021-30632
参考文章:
- [原创]chrome v8漏洞CVE-2021-30632浅析-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
- v8漏洞CVE-2021-30632复现CVE-2021-30632复现 securitylab/SecurityExp - 掘金
- CVE-2021-30632 V8引擎漏洞分析 | CN-SEC 中文网
- CVE-2021-30632 V8引擎漏洞分析
个人见解,有不对的地方,欢迎各位师傅批评指正
版本回退
1 | cd v8 |
前置知识
PropertyCell- Ignition
- IR
- Turbofan JIT
PropertyCell
1 | // A PropertyCell's property details contains a cell type that is meaningful if |
每一个全局对象/变量都会有一个PropertyCell(属性单元格),其中记录着这个对象的值,cell_type也就是PropertyCellType,等等,JIT在优化代码时,会根据cell_type的不同,来生成不同的机械码(优化码)
举个例子:
1 | var a; |
这个漏洞是因为当一个对象的cell_type为kConstantType的时候,其所绑定的map是可以改变的,但在deopt(解优化)的判断时,认为kConstantType可以为map做担保,导致了漏洞
lgnition
用于将JS的源码转化为能被V8识别的字节码,由V8解释器执行
IR
每条字节码都会生成对应的IR节点,每一个节点代表着一个具体操作,同时每个IR节点里还会携带一个access_mode,这个之后源码分析里会用到
Turbofan JIT
对字节码进行优化
源码分析
load分支
1 | Reduction JSNativeContextSpecialization::ReduceGlobalAccess(......) |
store分支
1 | else { |
具体的测试案例大家可以参考[原创]chrome v8漏洞CVE-2021-30632浅析-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com 师傅写的很详细
总结触发deopt的条件:当一个全局对象的cell_type是kConstantType时
- load分支: 优化时刻MapA为Stable,后面修改MapA为MapB
- store分支:
- 全局变量属性的类型发生变化(cell_type改变)
- 全局变量Map由stable变为not stable
- 传入store参数的Map和前面不一致
Poc
1 | function foo(y) { |
EXP
接下来就是常见的打法了,不再赘述
1 | function hexx(str, value) |
评论
