V8利用(4)-CVE-2021-38001
环境配置
漏洞介绍页面 ,在该页面可以看到POC和writeup,issue编号为1260577
受影响的Chrome最高版本为:
95.0.4638.54
受影响的V8最高版本为:9.5.172.21
我这里装的是9.5.172.10
版本
POC
该POC为Hcamael优化后的POC
1 | import('./1.mjs').then((m1) => { |
其中1.mjs
为
1 | export let x = {}; |
这个1.mjs
的内容挺重要的,会导致你复现不出来
漏洞测试
直接运行POC,可以看到如下结果
1 | DebugPrint: Smi: 0x20202021 (538976289) |
因为在代码不变的情况下,每个对象的低32bit地址基本不变,因此可将设定的值设为一个对象的低32bit地址,运行
1 | DebugPrint: 0x55008049ce9: [JSArray] |
可以发现,将其解析为对象了,那么如果在某地址存在一个伪造对象,将设定的值设置为该伪造对象的地址,那么我们就可以通过该伪造对象进行任意地址读写了,但一个重要的问题是我们如何得到地址。此时就需要使用堆喷技术了
V8下的堆喷
V8的堆内存一般为如下内存段
1 | 0x1f4a00000000 0x1f4a00003000 rw-p 3000 0 [anon_1f4a00000] |
可以发现堆内存是连续的,从0x1f4a08240000
开始的0xf7dc0000
大小的内存便是还未分配的堆内存,查看未分配内存的前0x80000
大小内存可以看到
1 | pwndbg> x/16gx 0x1f4a081c0000 |
在V8的堆块结构中,首部8字节代表该堆块大小,其中的0x2118
代表有这些大小存储堆块信息,那么可用大小就是0x3dee8
。
其结构大致为
1 | +0 : 堆块size |
使用如下代码进行测试,查看内存段,可以发现之前0x80000
大小的内存区域不断增加
1 | var test1 = Array(0xf700); |
代码中Array(0xf700)
,在V8中一个内存占4字节,则总长度为0xf700*4+0x2118 = 0x3fd18
,在对齐后便为0x40000大小。对应内存区域变化如下
1 | 0x26a0081c0000 0x26a008280000 rw-p c0000 0 [anon_26a0081c0] |
查看test1 test2 test3
的对象内存,发现其elements
指针都是对应内存空间+0x2119
。
1 | 0x33ac080499e4: 0x08203ab9 0x0800222d 0x08242119 0x0001ee00 |
这意味着我们不需要泄露也可以很轻易的命中某个对象的elements
内存。
漏洞利用
这个过程整得我有点sb,BigInt转number时的精度丢失调了我好久
堆喷
选取一个Array的elements
内存区,例如0x82c2121
(elements对应低2字节为0x2119,数据区为0x2119+8=0x2121)。然后在堆喷对象的数据区域进行伪造。
经过测试,我发现各种对象的map地址似乎是一个固定值,所以就直接进行赋值了。我这里似乎理解的不太对,看了其他师傅的复现发现都是只分配了一次,我是分配了0x100次,然后给每个都赋以相同的值,然后随便找一个来利用,写完exp才发现,不想改了:(
1 | var double_array_map = 0x8203ae1; |
伪造对象的elements指向随便一个可写区域就行。
addressOf
1 | function addressOf(target_var) |
fakeObject
1 | function fakeObject(target_addr) |
AAR
1 | var fake_array=[u2d(double_array_map, 0), itof(0x4141414141414141n)]; |
AAW
1 | function AAW(addr, value) |
shellcode_write
1 | function shellcode_write(addr,shellcode) |
最终exp
最后触发挺稳定的
1 | import('./1.mjs').then((m1) => { |
漏洞原理
写完了exp,就该了解漏洞原理了。这个漏洞不像之前的CVE-2020-6507那样,不需要了解某些结构的内部机理就可以理解的七七八八。该漏洞涉及的V8内部原理较为复杂,参考文章https://a1ex.online/2021/12/02/cve-2021-38001-%E5%88%86%E6%9E%90/
- Title: V8利用(4)-CVE-2021-38001
- Author: Static
- Created at : 2024-03-10 16:37:25
- Updated at : 2024-03-10 16:37:10
- Link: https://staticccccccc.github.io/2024/03/10/V8/V8利用(4)-CVE-2021-38001/
- License: This work is licensed under CC BY-NC-SA 4.0.