PackageKit 是一个自由且开源的应用软件套装,旨在为多种不同的软件包管理系统提供一个一致的高级前端。PackageKit是由Richard Hughes所开发。PackageKit框架漏洞虽然经历了很多次修复但都未得到根本解决。在今年9月苹果推送的macOS 12.6更新中,PackageKit漏洞又被修复了一次。
本文介绍了我们对CVE-2019-8561的调查,CVE-2019-8561是存在于macOS PackageKit框架中的一个漏洞,该框架是一个用于安装软件安装包(PKG文件)的组件。我们将详细介绍苹果是如何修复它的,以及这个漏洞又是如何被利用的。
我们还向苹果披露了超过15个关键的SIP绕过漏洞,并在Power of Community 2022安全会议(POC2022)上讨论了其中一些漏洞。
2019年3月25日,苹果对CVE-2019-8561进行了修复,该漏洞可能导致根权限升级、签名绕过,并最终绕过苹果的系统完整性保护(SIP)。
就在信息披露三个月后,研究人员杰伦·布拉德利(Jaron Bradley)在第二次海上目标安全会议上谈到了这一漏洞。在对PackageKit框架进行深入研究之后,我们发现CVE-2019-8561仍然影响着当时苹果桌面操作系统macOS (Monterey)的最新版本。类似于它对macOS 10.14(Mojave)的影响,该漏洞可能被利用以获得特权升级并绕过SIP限制。
苹果于2022年10月24日在macOS 13 (Ventura)中再次修复了该漏洞,即CVE-2022-32895。
SIP是OS X EI Capitan中引入的一个安全特性,旨在保护Mac操作系统不受潜在恶意软件的影响,这些软件可以修改受保护的文件和文件夹。它限制根用户帐户(也称为“无根”帐户),并限制根用户在操作系统受保护的部件上所能执行的操作。
在引入SIP之前,根用户没有权限限制,这意味着他们可以访问设备上的任何系统文件夹或应用程序。但是由于这个安全特性,只有经过apple签名的进程和那些具有特殊权利的进程才能修改受保护的系统文件。这些过程包括苹果软件更新和安装程序。
Mac操作系统通过com.apple.rootless.install和com.apple.rootless.install等特殊授权更新系统文件,其目的是修改系统文件的权限。
这些特殊授权只能由苹果使用,只有少数系统命令与之签署。system_install是这些守护进程服务之一,它负责安装有Apple签名的包。它的核心逻辑在PackageKit框架中实现。由于它的com.apple.rootless.install.heritable的特殊授权,它生成的子进程将在SIP绕过环境中执行。
CVE-2019-8561滥用了典型的TOCTTOU漏洞,TOCTTOU是time-of-check-to-time-of-use的缩写;TOCTTOU可发音为TOCK too。TOCTTOU是指计算机系统的资料与权限等状态的检查与使用之间,因为某特定状态在这段时间已改变所产生的软件漏洞,该漏洞是由安装apple签名PKG文件触发的。
CVE-2019-8561攻击链
1.安装了带有预安装或后安装脚本的Apple签名的PKG文件。
2. system_install守护进程服务将处理安装请求并验证包签名。如果服务确定包没有被苹果签名,它将中止安装过程。
3.一旦服务通过验证,攻击者就可以用恶意的PKG文件替换PKG文件。
4.该服务将在伪造的、未签名的PKG文件中提取并运行恶意的安装前或安装后脚本。
5.生成的脚本将在具有根权限的SIP旁路上下文中执行。
需要注意的是,漏洞本身很容易理解和利用。然而,我们很好奇苹果是如何修复这个漏洞的。
当我们尝试利用当时最新的操作系统macOS Monterey中的老问题时,我们收到了来自“xar_open_digest_verify”函数的错误消息。
调用摘要验证的堆栈
可以看出,目录(toc)摘要与预期不匹配。在从PackageKit框架内的调用堆栈中反转调用方函数之后,我们发现摘要是从安装客户机传递的。它还将返回的可扩展归档格式(XAR)指针缓存到它的成员变量中。因此,当它下次需要访问PKG文件时,它将直接从成员变量返回缓存的XAR指针,而不是再次打开XAR文件。
函数的实现-[PKXARArchive _xar]
此时,修复似乎起作用了,因为它在提取之前验证了摘要。然而,漏洞利用并没有到此为止。
PKG文件可能非常大,因此不建议在一次获取中将其所有内容读入内存。因此,它将按需读取和提取组件。
反转" -[pkextractinstallooperation _extractAllSpecifiersOnceAndReturnFailingSpecifier:andError:] "函数后,我们发现它调用三个不同的方法来提取相应的文件清单(BOM)文件、有效负载和脚本。
_extractAllSpecifiersXXX方法的实现
第一个方法“-[pkextractinstallooperation _extractBomForPackageSpecifier:error:]”将在提取BOM文件之前验证摘要,如上图所示。
第二个方法," -[pkextractinstallooperation _extractScriptsForPackageSpecifier:error:] ",将在内部调用" -[PKLeopardPackage scriptsExtractorWithDestination:error:] "函数。
scriptsExtractorXXX方法的实现
我们还研究了内部函数" -[pkpayloadcopy initWithArchivePath:offset:destination:] "。
initWithArchivePathXXX方法的实现
我们可以在上图中看到,该函数在第20行直接打开PKG文件,查找返回的具有固定偏移量的文件描述符,并将文件描述符放入bomcopy中,并输入“inputFD”。
接下来,我们分析了“-[pkpayloadcopy run]”函数。
-[pkpayloadcopy run]方法的实现
这个函数调用API“BOMCopierCopyWithOptions”来从不可信的“inputFD”中提取信息。
API“xar_open_digest_verify”用于打开不受信任的PKG文件是安全的,而API“open”则不安全。这是一个典型的“双重获取”漏洞,“open”API直接打开不受信任的PKG文件,而没有再次验证摘要,因此PKG文件可能被恶意的文件所取代,这使得旧的漏洞再次被利用。
第三个方法“-[pkextractinstallooperation _extractPayloadForPackageSpecifier:error:]”将在内部调用函数“-[PKLeopardPackage payloadExtractorWithDestination:externalRoot:error:]”。
payloadExtractorXXX方法的实现
在第28行,如果PKG文件中有效负载子路径的偏移值不等于零,则“-[PKLeopardPackage payloadExtractorWithDestination:externalRoot:error:]”函数将调用“-[PKPayloadCopier initWithArchivePath:offset:destination:]”函数。与第二种方法类似,这里还有一个三次提取漏洞。
如果偏移值等于零,它将从一个特殊的外部根路径提取负载,该路径似乎是不受限制的,可以由攻击者控制。这意味着攻击者可以将恶意的有效负载放置在外部根路径中。然而,在撰写本文时,我们无法找到具有外部根路径的Apple签名PKG文件。
与较早的利用相比,新的利用时间窗口期更短。我们需要在提取之后将PKG文件恢复到原始的apple签名文件,以便稍后通过任何可能的验证。还有一个挑战需要克服:新构建的PKG文件中的脚本或有效负载子路径组件的偏移值必须等于原始文件的偏移值。
为了再次利用这个漏洞,我们首先准备了一个精心制作的PKG文件,其中包含我们的有效负载。在扩展原始的apple签名PKG文件之后,我们清理了旧脚本,并将我们的有效负载放入安装后的脚本中。
接下来,为了解决脚本子路径组件的偏移值问题,我们编写了一个Python脚本,在死循环中构建新的PKG文件,直到偏移值满足需求。
一旦精心制作的PKG文件准备好了,就可以通过以下步骤利用该漏洞:
1.安装了带有安装后脚本的Apple签名的PKG文件。
2. system_install守护进程服务将处理安装请求。
3.在函数" -[PKLeopardPackage scriptsExtractorWithDestination:error:] "中,PKG文件将被替换为第8行之后和第16行之前的一个精心制作的文件。
4.在服务调用API“BOMCopierCopyWithOptions”来提取我们精心制作的PKG文件中的恶意脚本后,PKG文件将恢复到原始文件。
5.提取的恶意脚本将由具有根权限的SIP绕过缓解中的system_install生成。
苹果通过以下步骤再次修复了macOS Ventura漏洞:
首先,新的补丁代码通过受信任的XAR指针获得PKG文件子路径的预期校验和属性,该属性由安全API“xar_open_digest_verify”返回。
新的补丁代码获得预期的校验和
然后,它不会直接从“inputFD”中读取,而是使用ObjC类“IASInputStream”的实例来读取“inputStream”。在提取过程中,它将同时更新“inputStream”摘要。
从" inputStream "中提取
提取后,它将检查“inputStream”的实际校验和是否等于预期值。如果是,它将继续安装。否则,它将中止整个过程。
检查真正的校验和
我们认为最好的解决方案是在安装PKG文件之前将其复制到一个安全的地方。应该将apple签名的包复制到受sip保护的位置,其他包应该复制到根拥有的位置。
然而,苹果最新的补丁已经成修复了这个漏洞。
苹果发布了针对该漏洞的补丁,并在今年的macOS Ventura中成功解决了该漏洞。未能更新操作系统的用户容易受到根权限升级、签名绕过和SIP绕过的攻击。因此,用户必须安装所有更新以保证系统安全。
参考及来源:https://www.trendmicro.com/en_us/research/22/k/cve-2019-8561-a-hard-to-banish-packagekit-framework-vulnerabilit.html