当前位置: 首页 > 科技观察

CVE-2022-22583和CVE-2022-32800技术分析,你看懂了吗?

时间:2023-03-12 22:06:54 科技观察

在本文中,我们将详细介绍如何使用不同方法利用CVE-2022-22583的技术细节。我们还在本报告中讨论了CVE-2022-32800的技术细节。2022年1月26日,Apple修复了PackageKit框架中的系统完整性保护(SIP)绕过漏洞,编号为CVE-2022-22583。在PerceptionPoint发表了关于该漏洞及其利用细节的文章后,我们确定我们利用该漏洞的方法与他们的不同。在深入挖掘CVE-2022-22583之后,我们还发现了一个新漏洞CVE-2022-32800。这篇文章讨论了我们如何使用不同方法利用CVE-2022-22583的技术细节。有关SIP和特殊守护程序服务权利的更多详细信息,请参阅我们上个月的文章。我们还讨论了在2022年社区安全大会的力量(POC2022)期间向Apple披露的15多个严重SIP旁路漏洞中的几个。CVE-2022-22583CVE-2022-22583安全漏洞我们通过进程监控发现了该漏洞。当我们将苹果签名的软件安装包(PKG)文件安装到根卷时,我们注意到以下脚本是由特权“system_install”服务生成的:因为“system_installd”服务具有特殊的“com.apple.rootless.install.heritable"权限,所以这两个脚本将在SIP旁路上下文中执行。在看到位于“/tmp/PKInstallSandbox.l57ygT”目录中的这两个脚本后,我想到了以下问题:我们可以修改临时位置中的脚本吗?谁创建了带有随机后缀的临时文件夹“PKInstallSandbox”?新创建的文件夹是否受SIP保护?在这些问题的启发下,我们开始了调查。通过逆向调试,我们发现临时文件夹是由“-[PKInstallSandboxprepareForCommitReturningError:]”函数创建的:“prepareForCommitXXX”函数的实现在第16行,调用了另一个函数“-[PKInstallSandbox_createDirectory:uniquifying:error:]”,该函数在内部调用API“mkdtemp”来创建文件夹,没有任何限制。“_createDirectory:uniquifying:”函数的实现在看到“PKInstallSandbox.XXXXXXX”文件夹未受保护后,最初认为它可以被利用和操纵。但是,我们无法直接修改文件夹中的脚本。这是因为子文件夹“Scripts”受到限制,它已从受限沙箱路径中移出,如上面第25行所示。至少有两种不同的方法可以克服这一特殊挑战并利用这一安全漏洞。漏洞1:使用装载技巧第一个漏洞使用装载技巧。PerceptionPoint在他们的文章中对此进行了详细讨论。根据调查,挂载技巧可以通过以下方式实现:创建一个虚拟图像文件并将其挂载到“/private/tmp”;使用安装后脚本安装苹果签名的包;等待安装程序完成提取脚本目录,并收集提取路径的随机部分;卸载图像文件,这将恢复到“/private/tmp”解压前的内容;创建一个脚本目录(使用我们之前获得的随机路径),并将我们想要的任何脚本放入其中。PerceptionPoint文章还指出,此处讨论的漏洞利用具有时间依赖性,可能并不总是成功。漏洞2:使用符号链接我们的漏洞使用了另一种方法:符号链接。此漏洞是通过监视“/tmp/PKInstallSandbox.XXXXXXX”目录的创建并将其替换为指向另一个“/tmp/fakebox”位置的符号链接以将受限脚本重定向到那里来实现的;一旦脚本位于“/tmp/fakebox”中,删除符号链接并重新创建相同的“/tmp/PKInstallSandbox.XXXXXXX”目录,然后将有效负载脚本放入“/tmp/pKInstallSandox.XXXXXXX/scripts/pkgid.XXXXXX/”目录;等待负载脚本执行;此漏洞利用的完整概念验证已上传到GitHub。我们的概念验证演示也可以在下图中看到。使用符号链接的漏洞演示即使我们是root用户,我们也不能在受限目录“/Library/Apple”中创建文件,因为启用了SIP状态。但是借助漏洞利用,我们可以在SIP绕过上下文中执行任意命令,并成功地在受限目录中创建文件。Apple的CVE-2022-22583补丁“installd”服务以及“system_installd”服务的运作方式有点令人困惑。在下图中,我们可以看到第17行和第18行的补丁代码区分了这两种服务:CVE-2022-22583的补丁对于Apple签名的包,补丁使用“OpenPath”并且其自身受保护的沙箱路径有限.对于其他包,它仍然使用“/tmp”目录中的随机路径。安装沙箱在介绍CVE-2022-32800之前,我们需要了解一些与“安装沙箱”相关的概念。SandboxRepository首先,让我们看一下“SandboxRepository”,它是由“-[PKInstallSandboxManager_sandboxRepositoryForDestination:forSystemSoftware:create:error:]”函数返回并创建的目录。“_sandboxRepositoryForDestination:XXX”函数的实现简而言之,SandboxRepositories有四种类型:安装目标是根卷“/”:a.对于Apple签名的pkg:/Library/Apple/System/Library/InstallerSandboxes/.PKInstallSandboxManager-SystemSoftware;b..Otherpkg:/Library/InstallerSandboxes/.PKInstallSandboxManager;安装目标不是根卷:a。对于苹果签名的pkg:$targetVolume/.PKInstallSandboxManager-SystemSoftware;b.其他pkg:$targetVolume/.PKInstallSandboxManager;需要注意的是,TheSandboxRepository只有在applesignedpackage安装到rootvolume时才会受到限制。SandboxPathSandboxPath用于存放安装时的脚本、payload等文件。它是“SandboxRepository”中的一个目录,由“[PKInstallSandboxManageraddSandboxPathForDestination:forSystemSoftware:]_block_invoke”方法创建:实现“addSandboxPathForDestination:XXX”函数有四种类型的沙箱路径,每种都有一个通用的唯一标识符(UUID)名称,表示它们具体的沙箱状态:UUID.sandbox:创建的第一个状态;UUID.activeSandbox:激活状态,正在使用;UUID.trashedSandbox:去激活状态,丢弃;UUID.orphanedSandbox:isolated状态,如果磁盘空间不足会清理;PKInstallSandbox“PKInstallSandbox”是一个Objective-C类名,用于抽象和封装:通过“-[PKInstallSandboxinitWithSandboxPath:installRequest:error:]”方法初始化“PKInstallSandbox”的新实例,具体取决于沙盒路径和安装请求。请注意,该实例是可序列化的,并且该类实现了“NSSecureCoding”协议。“system_installd”服务可以通过“-[PKInstallSandboxManagersaveSandboxAsStaged:]”方法将实例保存或序列化到沙箱路径中名为“SandboxState”的文件中:“saveSandboxAsStaged”函数“PKInstallSandbox”实例的实现也可以稍后通过“-[PKInstallSandboxManager_sandboxAtPath:matchingRequest:forUse:]”方法从“SandboxState”文件恢复或反序列化:“sandboxAtPath:matchingRequest:XXX”函数的实现注意第57行有一个检查需要恢复安装请求匹配从挂载客户端传递的挂载请求在深度上是相等的。这项检查对我们的开发计划提出了一个小挑战。安装前,“system_installd”服务需要根据“-[PKInstallSandboxManagersandboxForRequest:created:error:]”函数中的安装请求获取“PKInstallSandbox”实例。该函数的核心逻辑如下:首先,它会从“sandboxRepository”中枚举所有后缀为“.ssandbox”的文件夹,然后从内部的“SandboxState”文件中恢复“PKInstallSandbox”实例。枚举所有带有“.ssandbox”后缀的文件夹接下来,如果它找不到与安装请求匹配的“PKInstallSandbox”实例,那么它会枚举所有带有“.activeSandbox”后缀的文件夹并尝试从这些位置恢复它们。枚举所有后缀为“.activeSandbox”的文件夹最后,如果仍然匹配不到这样的沙箱,则创建一个新的“沙箱路径”,并构造一个新的“PKInstallSandbox”实例。创建新的“沙盒路径”和实例CVE-2022-32800漏洞详情CVE-2022-32800漏洞允许攻击者劫持SIP绕过原语的“SandboxState”文件。“SandboxState”文件存储在“SandboxPath”中,该路径位于“SandboxRepository”中。在正常情况下,“沙盒存储库”仅限于Apple签名的包。但是,如果安装目标是DMG(磁盘映像)卷,则“沙盒存储库”不受任何限制。“SandboxState”文件也是如此。因此,我们可以制作一个特制的“SandboxState”文件,在反序列化期间劫持新的“PKInstallSandbox”实例。然后可以控制“PKInstallSandbox”实例的所有成员变量。漏洞利用有多种方法可以利用此漏洞。例如,在下图中,我们劫持了成员“_cleanupPaths”以获得删除任意SIP保护路径的原语。安装完成后,无论成功与否,都会调用“-[PKInstallSandboxManager_removeSandbox:]”函数移除沙箱,移除“_cleanupPaths”成员指定的所有文件和文件夹。“_removeSandbox”功能的实现可以在GitHub上找到该漏洞的完整概念验证,也可以在此处查看演示视频。Apple的CVE-2022-32800补丁Apple修复了macOS12.5中的安全漏洞。该补丁位于“-[PKInstallSandboxManager_sandboxAtPath:matchingRequest:forUse:]”函数中:CVE-2022-32800补丁正如我们在第38行检查中看到的,它在内部调用了“PKSIPFullyProtectedPath”函数:“PKSIPFullyProtectedPath”的实现function对于Apple签名的包,需要信任或限制“SandboxState”文件。安全建议为了成功保护系统免受攻击,用户必须定期更新他们的操作系统。定期应用安全补丁将防止攻击者利用漏洞提升权限并发起恶意攻击。关于此处讨论的漏洞,CVE-2022-22583已于2022年1月修补,CVE-2022-2-32800已于2022年7月修补。最终用户可以受益于TrendMicroAntivirusforMac和TrendMicroProtectionSuite等安全解决方案,这有助于检测和阻止利用此类漏洞的攻击。本文翻译自:https://www.trendmicro.com/en_us/research/22/l/a-technical-analysis-of-cve-2022-22583-and-cve-2022-32800.html