尝试引用非结构体数组的字段_V8 引擎空指针引用漏洞的新型利用技术

7b6bb5805dc024fcbcb84da0d9f202cf.png

介绍

去年,英国国家网络安全中心(NCSC)报告了一个V8编译器中存在的安全漏洞,随后Google便悄悄修复了该漏洞。这个漏洞ID为1003286,漏洞的具体信息可以点击【】获取。根据漏洞报告的描述,这是一个空指针解除引用DoS漏洞,这个漏洞是一个不可利用的漏洞,并且只能通过WASM代码来触发。在深入分析之后,我们发现这里还有另一种触发该漏洞的方式,并且能够通过V8 JIT编译器进程来利用该漏洞实现攻击。

在这篇文章中,我们将会介绍该漏洞的利用技术细节,并演示如何利用该漏洞实现远程代码执行。

漏洞成因

出于代码优化方面的考虑,V8 JIT编译器使用了节点图,并通过优化管道的几个阶段减少节点图来生成优化的本机代码。而且这个节点图也适用于WASM编译器,可以将WASM代码编译为本机代码。

节点在图中使用“Use”结构相互链接,如下所示:

f81fd0616ea48c7445f0dcf4b2c9fe11.png

通过使用这种结构,节点可以指定自己的输入节点和用户节点来减少图的遍历。Use结构体重包含了用于保存多种信息的比特字段,如下所示:

00f5c4c042f9b4dfd4ba6a496dcc338e.png

InputIndex字段表示这个Use结构输入节点的索引,它可以用来定位用户节点相应的输入节点。但是,这个字段仅提供了17比特的空间来存储索引,而且没有任何代码来检测这个限制是否正常执行。因此,我们就可以使用大量输入节点来构建一个图,让这些节点指向一个单一节点,以此来引起整型溢出。比如说,0x20002表示0x2为输入节点索引。

Use::input_ptr和Use::from函数都使用了这个InputIndex字段来定位用户节点以及对应的输入节点。

43b989f3fc85ebef5297d32981caf515.png

这将导致节点、Use结构及其子字段之间出现类型混乱的情况。

NCSC的研究人员使用WebAssembly构建了一个PoC,并通过它来处罚空指针解引问题。WASM代码优化过程比JIT编译器的更加简单,因此控制过程与JIT编译器相比也更加难,所以它们无法避免空指针解引的情况。

在分析过程中,我们发现JIT代码可以让节点拥有大量输入节点:

dcae8ca48a384e9f834a4776aa47f72e.png

这个函数可以帮助我们构建一个跟NCSC代码不同的PoC,并成功处罚漏洞,最终实现代码执行流的控制。

漏洞利用

虽然这个漏洞存在于V8 JIT编译器之中,但它跟其他常见的JIT编译器漏洞有很大不同。为了成功利用该漏洞,我们需要生成能够利用初始漏洞的漏洞代码,然后利用它们来实现远程代码执行。

节点、Use和Operator都是我们能够因此类型混乱的结构体,它们对应的结构如下:

5c858d648d4bdb88591e4af8800f0b99.png

上面的Use::input_ptr和Use::from函数都是通过ReplaceWithValue函数来调用的,而这个函数是用来替换节点值的:

ae55e63baa30fed2040293deda2dcd60.png

这里的“old_to”并非节点类型,而是Use字段:

8fee9189e302d88e895e81c3ebf8a8c0.png

如果use->prev为空,old_to->first_use则会被替换成use->next。由于“old_to”本质为Use,那么old_to->first_use就相当于CheckMap节点的Operator。如果old_to->first_use被替换成了use->next,那么CheckMapNode->op->opcode就会变成use->next->bit_field。此时,CheckMap节点的操作码opcode就会被其他opcode替换,并导致CheckMap节点失效。这也是漏洞利用第一步的主要攻击场景:

2f8f4cbf564dc99ad4dd2a02bfbfd81b.png

根据这个模型,我们创建了下列代码:

c1552fe376806b125ad29d276116fe68.png

在替换JSStrictEqual节点之前的节点图正好满足我们的要求:

ffc7b4031aaf01c88f12806c1142f1c8.png

现在,我们就可以在PACKED_DOUBLE_ELEMENTS和DICTIONARY_ELEMENTS数组之间引起类型混乱问题,并获取任意读写/addrof原语来实现远程代码执行了。

广大研究人员可以在Chrome v77版本上进行完整的漏洞利用测试。

53269d069ff8780e3d140375ce8bf64d.gif

精彩推荐

50b0145d6afa8fbb7e30937ec731d5f4.png d6da3dcf3c99de2415d980327d1f88a0.png aa20c4439ca5d8223481e8e63afaa393.png

dd962a877043dee98943df96545689ba.png5edf2dfd58a0a107ad3e9907b3dcd0be.png4a02fc9a1e48d63c44afab76fac2d57a.png

b19d3f0227ad831cf734e9eb2470b616.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值