xiaohui 嘶吼专业版 

MACOS安全更新|第1部分:XPROTECT的更新_Python

研究macOS上的威胁不仅需要了解攻击者在做什么,还需要了解苹果在更新其内置工具(如XProtect、Gatekeeper和MRT.app)方面在做什么。苹果公司以其对安全性的不透明和模糊化的政策而臭名昭著……,并且长期以来一直不愿与广大的安全社区公开共享其威胁情报。鉴于苹果公司庞大的资源以及在审查开发人员和已签名软件方面的特权地位,该公司有一种独特的能力来发现针对其平台的威胁,这是其他安全研究人员所不具备的。因此,重要的是,研究人员必须要利用苹果的安全更新,看看他们可能发现了什么新的威胁,并检查他们自己的解决方案是否已经包含了这些威胁,以防苹果自己的工具无法保护最终用户。

在本文中,我想分享一些示例,告诉你如何了解苹果的更新,以及他们什么时候更新。尽管有一些商业工具和脚本已经或正在尝试解决这些问题,但是“roll your own”检查和通知脚本是一件非常简单的事情,我们将在本文中介绍。稍后,我们将研究如何在涉及到的plist、SQL数据库和二进制文件进行比较,以查看发生了哪些更改,这些应该足以帮助你建立自己的工具,以检查和分析新的Apple安全更新。

MACOS安全更新|第1部分:XPROTECT的更新_Python_02发现macOS安全更新:非常困难

与其他一些平台不同,苹果的安全更新对用户来说是不可见的。它们在没有通知或与用户交互的情况下在后台透明地出现,除非用户碰巧在系统首选项中禁用了这些更新(顺便说一下,不推荐这样做),因为在本文的示例中,它们根本不会发生。

MACOS安全更新|第1部分:XPROTECT的更新_Python_03

在本文的示例中或者如果你只想手动检查发生了什么,你可以从终端运行软件更新检查。尽管软件更新工具并不特别局限于安全更新,但是这里有一些有用的命令可以让你深入研究这些更新。手册页提供了大量信息,但也有一些隐藏的命令,比如它没有提到的background-critical。如果你感兴趣,可以尝试在二进制文件上运行字符串并仔细阅读你的发现的内容。例如:

$ strings -a $(which softwareupdate) | grep -A10 -B10 critical

你还可以通过两种方式检查计算机接收到的早期安全更新的历史记录。在命令行中,你可以探索system_profiler:

$ system_profiler SPInstallHistoryDataType | grep -i -A2 -B2 xprotectMACOS安全更新|第1部分:XPROTECT的更新_Python_04

或者,如果你更喜欢GUI,请查看 opt- > System Information…,然后向下滚动到“安装”。顺便说一句,我认为这是一个漏洞。因为这两个方法对于相同的安装并没有显示出相同的时间戳,即使考虑到这两个方法使用了不同的时区和地区。MACOS安全更新|第1部分:XPROTECT的更新_Python_05

MACOS安全更新|第1部分:XPROTECT的更新_Python_06自动化安全更新检查

尽管这些机制对于它们的预期目标都是很好的,但它们不会帮助我们随时了解变化,除非我们除了不断检查更新之外别无其他事情,而且它们不会为我们提供完善的服务,详细的细节。因为,我们需要查看最新更新中实际发生的变化。幸运的是,我们可以做得更好。我们可以构建一个脚本来提取Apple的软件更新目录,并将其解析为我们感兴趣的特定种类的更新,例如XProtect,MRT和Gatekeeper。

此时,一些读者可能会想:为什么不监控这些文件的本地版本以进行更改呢?实际上,几年前我构建并发布了一个免费的工具,但这种方法有一个问题。苹果并没有平均地分配这些更新。从地理位置上看,不同地区的用户有时几天就能看到这些更新,而且在各种用户论坛上有大量证据表明,有些计算机没有收到更新,而其他计算机却收到了,即使是在同一个网络上。出于这些原因,要发现苹果的安全更新所解决的新威胁,只是等待更新到达你的本地电脑并不是一种特别可靠或准时的方式。

回到我们的脚本,然后,一旦我们构建并测试了它,我们需要处理一些其他的任务。第一种方法是设置调度,以选择的时间间隔运行脚本。第二种方法是实现某种形式的通知,通知我们已经发布了更新。除此之外,我们还需要一些更快速的方法来解析每次更新中发现的差异。这将是本文要讨论主题,现在,让我们看看如何构建一个脚本来查找更改、按时间表运行它并获得更新通知。

MACOS安全更新|第1部分:XPROTECT的更新_Python_07查找苹果的软件更新目录

要构建我们的脚本,首先需要的是苹果软件更新目录的URL。现在,让我们看看softwareupdate实用程序可以告诉我们什么。

然后,在实用程序上运行字符串并将其用于https并不是很有帮助。MACOS安全更新|第1部分:XPROTECT的更新_Python_08

由于我们知道该实用程序在某些情况下必须访问下载服务器,因此可能使用共享库中的代码调用它,让我们检查一下实用程序使用otool和L开关调用哪些共享库。

MACOS安全更新|第1部分:XPROTECT的更新_Python_09

这个私有框架看起来很有用,让我们尝试将其用于网络通话。MACOS安全更新|第1部分:XPROTECT的更新_Python_10

果然,正如你所看到的,URL不止一个,而且确实会不时更改,因此了解如何查找这个目录地址是值得的。此系统上可用的最新版本(安装10.14 macOS)是上面显示的最后一个sucatalog条目,然而,如果我们在10.15 macOS的计算机上运行相同的操作,你会发现我们得到以下内容:

https://swscan.apple.com/content/catalogs/others/index-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog

幸运的是,我不需要运行10.15计算机来下载和解析10.15目录文件,所以我们将使用这个URL,以便我们也可以看到10.15所做的更改。要查看目录的外观,请在终端中切换到一个方便的工作目录,并发出CURL命令下载它,它只是一个大约6MB的ASCII文本文件。

$ curl -sL https://swscan.apple.com/content/catalogs/others/index-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog -o sucatalog_latest

是的,这是一个非常大的文本文件,包含大约90000多行!

$ cat sucatalog_latest | wc -l

- > 90151

这是因为该目录包含了各种各样的软件更新条目,这些软件更新可以追溯到2008年,而且正如其名称所暗示的那样,涵盖了Snow Leopard等版本!让我们看看最近更新的日期:

$ grep -A1 PostDate sucatalog_latest | tail -n 1

->< Date >2019-12-18T19:16:33Z< /date >MACOS安全更新|第1部分:XPROTECT的更新_Python_11

创建一个检查苹果安全更新的脚本

太好了,从现在开始,可以更好地解析它,毫无疑问,一些人将更喜欢使用python、perl或任何他们喜欢的脚本语言。当涉及到这类事情时,我是一个只专注于获得结果的人,而不会关注如何编码。简而言之,我不保证这是解析目录的最佳方法,所以你可以根据自己的用例随意调整或改进这里的思想。

为了创建一个快速、简单的工具来通知我们目录的更改,我们将对最新版本和本地保存的版本进行比较。如果已经从上面拉下了目录,请确保将其重命名为sucatalog,以便与随后的脚本保持一致,并将其保存在〜/ Documents / Security_Updates /中。在该文件夹内,创建另一个名为“ Changes”的文件夹。

脚本首先将当前工作目录更改为Security_Updates文件夹,然后,它将下拉最新的目录副本,并将其与你先前保存的目录副本进行比较。如果有任何更改,我们的脚本将首先将这些内容写入一个名为diff.txt的临时文件。MACOS安全更新|第1部分:XPROTECT的更新_Python_12

作为一项快速检查,我们确保差异(如果有)包含新的PostDate(我们不在乎是否有其他更改不是发布到目录中的新项目)。然后,我们将使用一些正则表达式搜索我们感兴趣的更改类型。如果发现任何更改,我们将拉出URL并将其保存到单独的文件中。MACOS安全更新|第1部分:XPROTECT的更新_Python_13

评估条件之后,我们将清理所有临时文件,并将本地保存的sucatalog副本替换为刚刚下载的副本,以备下次使用。MACOS安全更新|第1部分:XPROTECT的更新_Python_14

MACOS安全更新|第1部分:XPROTECT的更新_Python_15

设定时间表

设置运行脚本的时间表可以很容易,也可以很困难。“正确的”方法可能是将其作为用户启动代理来运行,创建它们并不难,但是很容易在XML中犯一些很难调试的小错误。如果在~/Library/LaunchAgents文件夹中已经有一些代理,你可以使你的工作变得更轻松。如果是,复制其中任何一个,重命名它,然后用自己的值替换标签和适当的项,以删除你不需要的任何项。

至少在我看来,一个更有效的方法是运行cronjob。用一行程序就可以很容易地创建它们,假设你调用脚本suCatalogScript.sh并适当地插入你自己的用户名,下面的命令将安装cronjob,在你登录后,每隔1小时,调用脚本5分钟:

$ echo '05 */1 * * * /Users//Documents/Security_Updates/suCatalogScript.sh' | crontab -

注意:如果你有现有的cron作业,请不要使用此方法,因为它将覆盖它们!相反,使用-e开关编辑crontab。

MACOS安全更新|第1部分:XPROTECT的更新_Python_16设置通知

我们需要设置的最后一件事是通知系统,我们有几个选择。比如,我们可以简单地在suCatalogScript.sh中添加一些osascript,它会弹出一个通知横幅,这当然是最简单的解决方案。

MACOS安全更新|第1部分:XPROTECT的更新_Python_17

或者,你可以选择弹出对话框警告,将上面的osascript替换为下面所示的警告,确保转义所有引号和感叹号(如果使用)。

MACOS安全更新|第1部分:XPROTECT的更新_Python_18

对话框警告相对于显示通知的优势在于,你可以使用任意长的消息,这可能会提醒你查看更改的位置,而且对话框警告不像通知那样容易错过。

就我个人而言,我更喜欢将脚本和通知机制分开,这就是将Latest_Changes.txt文件保存到单独的Changes文件夹的原因。有了专门用于存放该文件的文件夹,我们可以设置一个文件夹操作,该操作将在该文件夹被修改时提醒我们。不久前,文件夹操作还有些不好用,但在macOS的最新版本中,它们变得好用多了。文件夹操作的设置和管理也非常简单。你可以了解他们,并看这里了解如何设置他们。

MACOS安全更新|第1部分:XPROTECT的更新_Python_19总结

在这篇文章中,我们设置了自己的通知系统,这样,我们就可以随时了解苹果什么时候对Gatekeeper、MRT和XProtect做出了更改。但是简单地通知更改只是我们期望功能的一小部分,主要的工作是找出发生了什么变化。对XProtect的属性列表文件、Gatekeeper的SQL数据库和MRT进行去混淆和运行。鉴于不同的文件结构和格式,app的macho二进制包含各种不同的技术,这正是我们在下一篇文章将要讨论的,敬请关注!

本文参考自:https://www.sentinelone.com/blog/macos-security-updates-part-1-discovering-changes-to-xprotect-friends/

MACOS安全更新|第1部分:XPROTECT的更新_Python_20