译文 | CVE-2022-22583技术分析:绕过macOS系统完整性保护(SIP)
2022-2-25 09:0:0 Author: mp.weixin.qq.com(查看原文) 阅读量:51 收藏

开卷有益 · 不求甚解


前言

Perception Point 研究人员在 macOS 中发现了一个漏洞,该漏洞允许攻击者绕过 Apple 的 SIP(系统完整性保护)机制,从而完全控制系统,前提是他们已经设法以高权限实现代码执行。

Perception Point 研究人员在 macOS 中发现了一个漏洞,该漏洞允许攻击者绕过 Apple 的 SIP(系统完整性保护),从而完全控制系统,前提是他们已经设法以高权限实现代码执行。

该漏洞已向 Apple 披露,并于 1 月 26 日在macOS Monterey 12.2、macOS Big Sur 11.6.3和安全更新 2022-001 Catalina的最新安全更新中宣布修复,标识为 CVE-2022-22583。Apple 在三位研究人员之间分享了此 CVE 的功劳:Mickey Jin (@patch1t)、Perception Point 的 Ron Hass (@ronhass7) 和一位匿名研究人员。

本文概述了 SIP 机制和 Perception Point 向 Apple 披露的漏洞详细信息。

什么是 SIP(系统完整性保护)?

SIP(也称为“无根”)是 macOS 中的一种安全机制,由 Apple 在 OS X El Capitan(版本 10.11)中引入,目的是保护整个系统,即使是 root 用户。除其他外,这包括对以下方面的限制:

  • 加载内核扩展(只允许签名的扩展)
  • 篡改关键文件和目录
  • 调试系统进程
  • 以编程方式设置启动盘

这些限制由 macOS 内核 (XNU) 强制执行,并且只能通过物理访问机器(通过启动到恢复操作系统)来禁用。SIP可以被认为是攻击者和系统完全控制之间的最后一道防线。

如前所述,为了真正保护内核,SIP 需要防止对关键文件和目录的修改。一个示例是扩展“AppleKextExcludeList”的内容,它管理排除的内核扩展列表。我们可以通过在“ls”命令中使用标志“-O”来观察 SIP 限制:

但是,Apple 需要“保留自己的权利”来修改系统中的所有文件和目录。例如,这是执行系统更新所必需的。它的工作方式是为所需的可执行文件提供特定的权利。权利只是包含在签名应用程序中的数据片段,让系统知道该应用程序有权执行特定任务。与 SIP 相关的权利包括:

  • com.apple.rootless.install – 解除所有 SIP 的文件系统限制
  • com.apple.rootless.install.heritable – 相同,但子进程也继承此权利

显然,Apple 不允许使用上述权利对任何应用程序进行签名,但系统中有一些 Apple 签名的可执行文件拥有这些权利之一。一个例子是“system_installd”,它是 PackageKit 框架的一部分,负责安装 Apple 签名的包。我们可以使用“codedesign”实用程序观察可执行文件的权利:

如您所见,“system_installd”具有更强的“com.apple.rootless.install.heritable”权利,这将在我们的漏洞中使用。

漏洞

让我们从发现此漏洞的过程开始。2021 年 10 月 28 日,微软发布了一篇博文,详细阐述了他们发现的一个 SIP 绕过漏洞,该漏洞已在 macOS Monterey 12.0.1 中修复,标识为 CVE-2021-30892。微软将此漏洞命名为“shrootless”。

关于“shrootless”的几句话:微软研究人员注意到,当用户安装一个苹果签名的包时,它会被前面提到的“system_installd”服务自动执行。如果软件包包含任何安装前/安装后脚本,它们也会由“system_installd”执行,从而继承“com.apple.rootless.install.heritable”权利,这有效地允许这些脚本完全绕过 SIP 的文件系统限制。错误在于,如果安装前/安装后脚本之一是 zsh 脚本(即以“#!/bin/zsh”开头),“system_installd”将执行 zsh,而 zsh 又会获取文件“/etc/ zshenv”。此文件不受 SIP 限制,并且可以由 root 自由修改,并且只要安装了带有 zsh 脚本的 Apple 签名包,其中的任何代码都将在此“SIP 绕过上下文”中运行。

为了深入研究这个漏洞,我们需要一个带有一些安装前/安装后脚本的 Apple 签名包。找到候选包后,“可疑包”应用程序可用于检查它:

如您所见,这是一个 Apple 签名的包,其中包含一个 perl 安装后脚本。该脚本实际上执行了更多命令,我们使用命令行实用程序“进程监视器”来检查它的行为。让我们看看它的输出(为了清楚起见,我们省略了一些部分,只留下“ES_EVENT_TYPE_NOTIFY_EXEC”事件):

{"pid":3308,"name":"system_installd"}
{"pid":3321,"name":"perl","arguments":["/usr/bin/perl","/tmp/PKInstallSandbox.QTKhng/Scripts/com.apple.pkg.FxPlugSDK.QCq4LX/postinstall","/private/tmp/FxPlugSDK.pkg","/","/","/"],"ppid":3308}
{"pid":3321,"name":"perl5.30","ppid":3308}
{"pid":3322,"name":"pwd","ppid":3321}
{"pid":3323,"name":"sh","arguments":["sh","-c","logger -p install.info 'Running Install Scripts . . .'"],"ppid":3321}
{"pid":3323,"name":"bash","arguments":["sh","-c","logger -p install.info 'Running Install Scripts . . .'"],"ppid":3321}
{"pid":3323,"name":"logger","ppid":3321}
{"pid":3324,"name":"sh",","arguments":["sh","-c","/bin/ls \/private\/tmp\/PKInstallSandbox\.QTKhng\/Scripts\/com\.apple\.pkg\.FxPlugSDK\.QCq4LX\/postinstall_actions\/"],"ppid":3321}
{"
pid":3324,"name":"bash","arguments":["sh","-c","/bin/ls \/private\/tmp\/PKInstallSandbox\.QTKhng\/Scripts\/com\.apple\.pkg\.FxPlugSDK\.QCq4LX\/postinstall_actions\/"],"ppid":3321}
{"
pid":3324,"name":"ls","ppid":3321}

一些东西立即引起了我们的注意:“system_installd”从临时目录“/tmp/PKInstallSandbox.QTKhng/Scripts/com.apple.pkg.FxPlugSDK.QCq4LX”中执行了安装后脚本。显然,“system_installd”首先将脚本提取到一个临时目录中,然后从那里执行它们。此外,在提取和执行之间存在大量时间(对于安装前和安装后脚本,提取可能在安装之前完成)。

我们可以利用它并在没有“system_installd”注意到的情况下简单地交换脚本吗?自然,事情没有那么简单。苹果确实想到了这个漏洞,所以他们把这个临时目录做成了 SIP 限制:

但是,当我们发现“/tmp”目录本身不受SIP限制时,我们非常感兴趣!准确的说,“/tmp”其实是一个符号链接,受限制的,但目录本身不是。

有了这些信息,我们确定了如何在提取和执行之间交换安装后脚本,关键是mount。因为“/private/tmp”不受 SIP 限制,我们可以在任何时候将虚拟映像挂载到这个目录上(即使它里面包含一个受限制的目录),并且可以随意更改它的内容。我们可以通过多种方式利用这个想法来交换脚本,但是由于临时目录路径包含一些随机字符,我们选择如下实现漏洞利用:

  1. 创建一个虚拟映像文件并将其挂载到“/private/tmp”。
  2. 使用安装后脚本安装 Apple 签名的包。
  3. 等待安装程序完成脚本目录的提取,并收集提取路径的随机部分。
  4. 卸载映像文件,从而恢复到解压前“/private/tmp”的内容。
  5. 自己创建脚本目录(使用我们之前收集的随机路径)并将我们想要的任何脚本存放在那里。

图 1:漏洞利用流程

我们作为“安装后脚本”放置的任何脚本都从“system_installd”继承“com.apple.rootless.install.heritable”权利,并且能够完全绕过 SIP 限制。

时间问题与此漏洞非常相关——漏洞利用必须成功地在机会窗口中交换脚本。然而,该漏洞利用非常可靠,我们注意到通常需要一两次尝试才能成功,主要是因为我们使用了带有安装后脚本的包,这为我们提供了充足的时间(整个安装时间)。

图 2:漏洞利用演示

苹果是如何解决这个问题的?

在 macOS 12.2 中,Apple 将提取目标更改为新目录:“/Library/Apple/System/Library/InstallerSandboxes”。此路径中的所有目录都受到限制,除了第一个目录(“/Library”)。尽管看起来与之前的情况相似,但 Apple 通过在启用 SIP 时阻止挂载到“/Library”目录的尝试来正确修复了此错误:

Error 0x0   0   0   kernel: (Sandbox) System Policy: diskimages-helpe(725) deny(1) file-mount /Library

供应商沟通

  • 2021-11-05:向 Apple 产品安全报告。
  • 2021-12-02:我们要求对此问题进行更新。
  • 2021-12-03:Apple 建议他们计划解决此问题。
  • 2022-01-14:Apple 建议将在即将发布的安全更新中解决此问题。
  • 2022-01-26:macOS 12.2 发布,解决了报告的漏洞。

译文申明

  • 文章来源为近期阅读文章,质量尚可的,大部分较新,但也可能有老文章。
  • 开卷有益,不求甚解,不需面面俱到,能学到一个小技巧就赚了。
  • 译文仅供参考,具体内容表达以及含义, 以原文为准 (译文来自自动翻译)
  • 如英文不错的,尽量阅读原文。(点击原文跳转)
  • 每日早读基本自动化发布(不定期删除),这是一项测试

最新动态: Follow Me

微信/微博:red4blue

公众号/知乎:blueteams



文章来源: http://mp.weixin.qq.com/s?__biz=MzU0MDcyMTMxOQ==&mid=2247485688&idx=3&sn=c86687448bb830235970ec188ec3031f&chksm=fb35a130cc422826ff618aa766becf9535d310b83d3d853c2a1d049fec64f0fa52ae4cfcf129#rd
如有侵权请联系:admin#unsafe.sh