更多MacOS安装程序漏洞

2021-06-04 04:12:51

回到12月,我们写了关于攻击麦斯科斯安装者。在过去的几个月里,当我的团队看着其他目标时,我们一直关注我们使用经常使用和互动的应用程序的安装。在我们的研究期间,我们注意到了Microsoft团队安装程序和审计过程中的另一个上述缺陷,发现了麦斯卡套装安装程序的另一个广泛缺陷。

令人沮丧的是这些问题的普遍性,我们决定向他们编写并与苹果和微软一起单独报告。我们写信给Apple,建议实施类似于他们为CVE-2020-9817所做的解决方案,并解释了所发现的额外LPE机制。我们写信给Microsoft建议修复其安装程序中的缺陷。

两家公司都拒绝了这些提交和建议。您可以找到对这些缺陷的完整解释以及概念证据,可以集成到您现有的开发后武库中。

要从上一个博客中重新回顾,MacOS安装程序具有各种便利功能,允许开发人员自定义其应用程序的安装过程。最值得注意的是这些功能是预装和PostInstall脚本。这些是在对给定系统上复制到其最终目的地之前和之后运行的脚本。

如果安装程序本身需要升高的权限,例如设置用于自动updater服务的系统级启动守护程序,则安装程序将提示用户升高到root权限的权限。还有无人值守安装的情况自动执行此操作,但我们不会在这篇文章中覆盖。

这里讨论的主要问题是在这些脚本 - 以root身份运行 - 读取和写入正常的,低特权用户控制的位置时发生。

2020年7月,NCC集团发布了CVE-2020-9817的咨询。在此咨询中,他们讨论了一个问题,其中提取到安装程序Sandbox目录的文件保留了较低特权用户的权限,即使安装程序本身以root权限运行。这意味着任何本地攻击者(代码执行本地,不一定是物理访问)都可以在安装过程中修改这些文件并可能升级到root权限。

NCC集团承认,各个开发商可以减轻这些问题,但选择向Apple报告该问题,以建议更全面的解决方案。 Apple似乎已同意,提供了HT211170的修复,并为CVE标识符分配了。

Apple的解决方案很简单:修改了将文件提取到安装程序沙箱,以获取安装程序当前运行的用户的权限。这意味着较低的特权用户在安装过程中将无法修改这些文件,并影响root执行的操作。

与Sandbox问题类似,如我们之前的博客文章所指出的那样,开发人员在安装过程中使用其他更少安全的目录并不罕见。我们遇到的最常见的目录适用于此账单是/ TMP和/应用程序,这两者都有标准用户的读/写访问。

让我们使用Microsoft团队作为又一个例子。在团队的安装过程中,应用程序内容正常移动到/应用程序。 PostInstall脚本创建一个系统级启动守护程序,该守护程序指向teamsupdaterdaemon应用程序(/ applications / microsoft teams.app/contents/teamsupdaterdaemon.xpc/contents/macos/teamsupdaterdaemon),其将使用root权限运行。问题是,如果本地攻击者能够在安装之前创建/应用程序/ Microsoft团队目录树,则在安装过程中,它们可以使用自己的自定义有效载荷覆盖TeamSupdaterDaemon应用程序,这将作为启动守护程序运行从而给予攻击者根权限。这是可能的,因为安装脚本确实将此文件的写入权限更改为root toot,因此由于/应用程序的开放性质,提前创建此目录树。

#准备步骤在安装/ tmp❯❯❯mkdir -p之前“/ applications / microsoft teams.app/contents/teamsupdaterdaemon.xpc/contents/macos/”#就在安装之前,使这个正在运行。 Itegartant,但它适用于示范目的。 #有效载荷可以是什么。但是,它不会产生一个GUI,所以需要自定义滴管或其他应用程序。 / tmp❯❯❯真实; do ln -f -f-s / tmp / payload“/ applications / microsoft teams.app/contents/teamsupdaterdaemon.xpc/contents/macos/teamsupdaterdaemon”;完成#运行安装程序。等待队伍DaterDaemon被召唤。

以上在PostInstall脚本中使用的文件路径中的任意有效载荷创建了一个符号链接以创建启动守护程序。在安装过程中,此目录由较低特权用户拥有,这意味着在安装脚本更改权限以仅允许root来修改它们之前,它们可以修改此处的文件短段。

在我们向Microsoft的报告中,我们建议在创建启动守护程序条目或使用预安装脚本之前验证TeamSupdaterDaemon的完整性以验证/应用程序/ Microsoft团队目录上的权限。

Microsoft团队漏洞分类团队在过去几年的漏洞披露的漏洞中得到了批评。我们预计他们最近的纳入PWN2OWN展示了这一领域的巨大改进,但遗憾的是,他们在本公开中的通信以及我们最近对其产品的其他披露表明这并非如此。

根据我们的披露报告,Microsoft表示这是一个非问题,因为/应用程序需要root权限写入。我们指出,这不是真的,如果是,它将意味着任何应用程序的安装都需要提升的特权,这显然不是这种情况。

我们收到了一个响应,说明他们会再次审查信息。几天后,我们的票被关闭,没有理由或答复给出。在一些潜水之后,分类团队终于指出,他们仍然无法确认/应用程序可以写入没有root权限。微软已表示他们没有计划为此问题发布任何立即修复。

苹果的回应是不同的。他们表示,他们没有考虑这一安全问题,这类问题的减轻者最好留给个别开发人员。虽然这是一个完全有效的回复,我们了解他们的立场,但我们要求有关CVE-2020-9817的治疗差异的信息。苹果没有提供理由或解释。

在我们的研究中,我们还发现了一种绕过网守和包装安装程序的代码签名要求的方法。

根据Gatekeeper文档,从Internet下载或从其他可能不受信任的源创建的软件包应该具有验证的签名,并且应该提示似乎授权安装程序的打开。查看Apple解释的以下报价:

当用户下载并打开应用程序,插件或安装程序包从App Store外部,GateKeeper验证了软件来自所识别的开发人员,由Apple公证,不受已知的恶意内容,而且Hasn' T被改变了。 GateKeeper还请在打开下载的软件之前首次请求用户批准,以确保用户尚未被欺骗到运行的可执行代码,他们认为只是数据文件。

在从Internet下载包的情况下,我们可以观察到修改包将在打开后触发用户对用户的警报,声称它由于被修改或损坏而导致的签名验证失败。

如果我们复制包并修改它,我们可以修改包含的文件并重新括起来。大多数用户不会注意到安装程序不再签名(安装程序对话框的右侧右手角中的锁定符号将丢失,因为安装程序中使用的资产的其余部分将如预期视图。此新修改的程序包也将在不被捕获或由Gatekeeper捕获或验证的情况下运行(注意:在安装后运行时仍将通过Gatekeeper检查所安装的应用程序。此处呈现的问题对于安装程序来表示脚本。)并可以允许恶意软件或其他一些恶意演员,以实现root的特权升级。此外,该过程可以通过监视.pkg下载并滥用所有.pkg文件遵循相同的一般格式和结构的事实来完全自动化。

以下说明可用于使用Microsoft Teams安装程序演示此过程。请注意,此问题并不特定于此安装程序/产品,可以概括并自动使用任何任意安装程序。

下载时,二进制应该出现在用户的下载文件夹中(〜/下载)。在运行安装程序之前,打开终端会话并运行以下命令:

#重命名包是| mv〜/下载/ teams_osx.pkg〜/下载/ old.pkg#extract包目录pkgutil - 展开〜/ downloads / old.pkg〜/ downloads / elizt#修改安装程序mv〜/下载/提取的后安装脚本/teams_osx_app.pkg/scripts/postinstall〜/下载/提取/ teams_osx_app.pkg / scripts / postinstall.bak echo“#!/ usr / bin / env sh \ n> 〜/下载/ exploit \ n $(cat〜/ downloads / extract / teams_osx_app.pkg / scripts / postinstall.bak)“> 〜/下载/提取/ teams_osx_app.pkg / scripts / postinstall rm -f〜/ downloads / extract / teams_osx_app.pkg / scripts / postinstall.bak chmod + x〜/ downloads / extract / teams_osx_app.pkg / teams_osx_app.pkg / scripts / postinstall#repactage和将安装程序重命名为预期的pkgutil -f --flatten〜/下载/提取〜/​​ downloads / teams_osx.pkg

当用户运行此新创建的包时,它将从最终用户的角度正常运行。但是,安装后,我们可以看到安装期间的PostInstall脚本在安装期间创建了一个新文件,它在〜/ downloads / exproit中包含了root用户运行的id命令的输出,展示了成功的特权升级。

根据提供的步骤,它看起来您报告网守不适用于本地创建的包。这是预期的行为。

我们确认这确实是我们在提供的网守文档上报告和请求的其他信息:

Apple解释说,他们的初始解释是有问题的,但维持该门卫在提供的方案中按预期行事。

从本质上讲,它们说明了所创建的包裹未按网守检查恶意内容,也不需要签名。这意味着甚至可以在本地复制,修改和重新创建要运行的root权限的包甚至可以在本地复制,以绕过安全机制。这允许攻击者对中间人的包裹下载,并在执行所需的包时升级到root权限。

那么,这些缺陷实际上是一个大问题吗?从一个现实的风险的立场,不,不是真的。然而,这只是一个已经填充的后开发后工具箱中的另一个工具,应该指出的是,基于安装的攻击向量正在积极被剥削,就像最近的Solarwinds新闻一样。

然而,从分类角度来看,这绝对是几乎没有原因:

Apple对宏的最后几个迭代筹集了这么多努力进入基线安全措施,似乎对其发展目标似乎适得其反,以忽视这些基本问题(特别是他们已经实施了类似的修复)。

它展示了一些厂商在发出问题上消失而不是解决它们的程度。

我们理解,漏洞分类团队绝对被轰炸,并在披露响应期间没有反应迟钝,过度划分的罐头消息,或者只是给予错误的原因不应该是规范,并且突出了与这些互动时的许多挫折研究人员体验更大的组织。

我们想指出,我们不会责怪任何单一组织或个人在这里,并承认我们在幕后可能会有更大的事情,我们没有枢密。我们的报告或解释也可能是热垃圾,我们的积分没有明确。然而,在任何一种情况下,供应商的通信都应该更好地了解澄清问题所需的信息,以便在只是丢弃之前。

圈出来回到手头的问题,用户可以做些什么来保护自己?每个人都手动审核每个安装人员都是不切实际的。偶尔的Spoto Check与可疑包,它显示了运行安装程序包时执行的所有脚本,从不伤害。但是,一般来说,请注意适当的代码签名(在安装人员的上右侧角落中寻找锁定)。

对于开发人员,在创建分发包时,请特别注意在安装过程中使用的目录和文件。通常,尽可能使用安装程序沙箱是最好的做法。何时不可能,验证文件的完整性以及强制执行目录和正在运行的文件的正确权限是否足以减轻这些问题。

有关这些发现的进一步细节可以在TRA-2021-19,TRA-2021-20和TRA-2021-21中找到。