从 0 开始学 V8 漏洞利用之 CVE 您所在的位置:网站首页 时间漏洞是怎么产生的 从 0 开始学 V8 漏洞利用之 CVE

从 0 开始学 V8 漏洞利用之 CVE

2023-03-14 12:29| 来源: 网络整理| 查看: 265

作者:Hcamael@知道创宇404实验室

复现CVE-2020-6507

信息收集

在复习漏洞前,我们首先需要有一个信息收集的阶段:

1.可以从Chrome的官方更新公‍告(https://chromereleases.googleblog.com/)

得知某个版本的Chrome存在哪些漏洞。

2.从官方更新公告上可以得到漏洞的bug号,从而在官方的issue列表(https://bugs.chromium.org/p/chromium/issues/list)获取该bug相关信息,太新的可能会处于未公开状态。

3.可以在Google搜索,比如,可以搜到一些网站有Chrome更新的新闻,在这些新闻中能获取该版本Chrome官方离线安装包。下载Chrome一定要从网站上下载。

我第二个研究的是,可以从官方公告得知其chrome的bug编号为:1086890(https://bugs.chromium.org/p/chromium/issues/detail?id=1086890)

可以很容易找到其相关信息:

受影响的Chrome最高版本为: 受影响的V8最高版本为:

相关PoC:

搭建环境

一键编译相关环境:

套模版

暂时先不用管漏洞成因,漏洞原理啥的,我们先借助PoC,来把我们的exp写出来。

研究PoC

运行一下PoC:

可以发现,改PoC的作用是把数组的长度改为,那么后续如果我们的和在这个长度的内存区域内,那么就可以写和函数了。

来进行一波测试:

调试的时候,发现程序crash了,不过我们仍然可以查看内存,发现该版本的v8,已经对地址进行了压缩,我们虽然把length位改成了,但是我们却也把位改成了。在这个步骤的时候,我们没有泄漏过任何地址,有没有其他没办法构造一个呢。

改了改测试代码,如下所示:

结果为:

成功泄漏出变量的map地址,再改改测试代码:

再来看看结果:

成功泄漏了map地址,不过该方法的缺点是,只要修改了js代码,堆布局就会发生一些变化,就需要修改的值,所以需要先把所有代码写好,不准备变的时候,再来修改一下这个值。

不过也还有一些方法,比如堆喷,比如把值设置的稍微小一点,然后在根据map的低20bit为0x891,来搜索map地址,不过这些方法本文不再深入研究,有兴趣的可以自行进行测试。

编写addressOf函数

现在我们能来编写addressOf函数了:

编写fakeObj函数

接下来就是编写函数:

修改偏移

改版本中,需要修改的偏移有:

其他都模板中一样,最后运行:

优化exp

前面内容通过套模板的方式,写出了,但是却有些许不足,因为的值是根据我们本地环境测试出来的,即使在测试环境中,代码稍微变动,就需要修改,如果只是用来打CTF,我觉得这样就足够了。但是如果拿去实际的环境打,exp大概需要进行许多修改。

接下来,我将准备讲讲该漏洞原理,在理解其原理后,再来继续优化我们的exp。那为啥之前花这么长时间讲这个不太实用的exp?而不直接讲优化后的exp?因为我想表明,在只有PoC的情况下,也可以通过套模板,写出exp。

漏洞成因

漏洞成因这块我不打算花太多时间讲,因为我发现,V8更新的太快了,你花大量时间来分析这个版本的代码,分析这个漏洞的相关代码,但是换一个版本,会发现代码发生了改变,之前分析的已经过时了。所以我觉得起码在初学阶段,没必要深挖到最底层。

和没有对数组的大小进行判断,来看看修复后的代码,多了一个判断:

再去搜一搜源码,发现,说明一个浮点型的数组,最大长度为。

我们再来看看PoC:

我们来算算,的长度为,的为个,然后还push了一个长度为的数组。

通过函数,把变量变成了长度为的变量。

接着再使用添加了3个值,该函数将会执行函数,从而生成了一个长度为的浮点型数组。

该长度已经超过了的值,那么改漏洞要怎么利用呢?

来看看函数:

该函数传入的为数组,其长度为,所以,经过计算后,得到,然后执行,原本以数组的形式储存浮点型,长度为2,但是给其index=7的位置赋值,将会把该变量的储存类型变为映射模式。

这么一看,好像并没有什么问题。但是V8有一个特性,会对执行的比较多的代码进行JIT优化,会删除一些冗余代码,加速代码的执行速度。

比如对函数进行优化,V8会认为x的最大长度为,那么x最后的计算结果最大值为,那么x最后的值不是0就是1,的长度为2,不论对其0还是1赋值都是有效的。原本代码在执行执行的时候,会根据x的值对边界进行检查,但是通过上述的分析,JIT认为这种边界检查是没有必要的,就把检查的代码给删除了。这样就直接对进行赋值,而实际的x值为7,这就造成了越界读写,而index=7这个位置,正好是变量的和位,所以PoC达到了之前分析的那种效果。

知道原理了,那么我们就能对该函数进行一波优化了,我最后的优化代码如下:

最后的值为,修改到了的长度,但是并不会修改到的值,因为中间有个,导致产生了4字节的偏移,所以我们可以让我们只修改test3的长度而不影响到。

根据上述思路,我们对PoC进行一波修改:

接下来只要在exp1的基础上对和进行一波微调,就能形成我们的exp2了:

参考

https://chromereleases.googleblog.com/

https://bugs.chromium.org/p/chromium/issues/list

https://bugs.chromium.org/p/chromium/issues/detail?id=1086890

往 期 热 门

从 0 开始学 V8 漏洞利用之 starctf 2019 OOB(三)

从 0 开始学 V8 漏洞利用之 V8 通用利用链(二)

从 0 开始学 V8 漏洞利用之环境搭建(一)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有