本文作者:Peterpan0927(信安之路病毒分析小组成员 & 360 涅槃团队成员)
最近挖了三个 Nday 漏洞,结合在一起能够实现 MacOS 的内核本地提权,就当作一个练手的小项目分享给大家,下面先讲一下这三个小漏洞:
queryCompletion in AVEBridge
由于com.apple.AVEBridge
这个模块中的函数比较少,于是我就写了一个比较小的 C 语言脚本来Fuzz
一下,这个比较简单,所以一下子就找到了:
这里rsi
是我们可控的一个参数,这里相当于我们可以劫持控制流做ROP
进行提权,但还需要一个信息泄漏作为配合。
ReadRegister32
这是我在另一个模块AppleIntelFramebufferAzul
中找到的一个漏洞,因为我的目的很明确,就是需要信息泄漏,所以我就从有类似特征的函数进行入手了,如函数名位Readxxx
,有memcpy
类似的函数。
这个函数也十分简单:
通过逆向和调试我找到了这个函数的最上级调用是从IntelFBClientControl::actionWrapper
函数开始的,通过调试我们发现传到ReadRegister32
的参数a3
是用户空间可控的,且没有做任何边界检查,也就是说这个是一个越界读,并且在它的上级函数中发现:
而这个a5
正好是IOConnectCallMethod
中要传回用户空间的那个outputStruct
的地址,也就是说这是一个信息泄漏
getDisplayPipeCapability
这也是一个信息泄漏的问题,同样在AppleIntelFramebufferAzul
中,首先来看看一部分代码:
其中a2
是我们可控数据且没有做大小检查,a3
是outputStruct
地址,也就是说如果我们进入memcpy
分支,同样可以做到一个信息泄漏。
漏洞利用
这里我用来做提权的有两个漏洞,queryCompletion
我们可以通过参数来控制越界 call,这个的利用就比较简单,直接通过堆喷构造数据然后泄漏kslide
做 ROP 即可,但是我们在10.13
上需要寻找新的gadget
,上一次还用的是project-zero
在pwn4fun
上用的一个,一开始我的思路有问题,总想着有这样一个pattern
但是这样毫无疑问是自己把自己给框住了,事实上可以存在这样的一种pattern
而且我们的出发点可以放在二进制搜索上,直接从切入一段机器码,不需要理会其上下文,比如我们可以在 ida 中搜索:50 5c
然后通过 ida 的undefine
和code
来找到我们需要的gadget
,这样的话很快就能找到了,但是我因为思路问题卡了两天。
接下来就是需要一个 info leak 来泄漏kslide
了。
我一开始找到的一个infoleak
是ReadRegister32
,但是这个限制比较多,只能从一个很
楼主残忍的关闭了评论