概述
正如我们所期待的那样,在WWDC 2019上,发布了关于下一版本Apple桌面操作系统macOS 10.15 Catalina的主要展示。考虑到在此前的几个正式版本中接连发现的安全问题,包括令人震惊的严重漏洞,以及重复出现的内置Mac安全工具安全机制绕过问题,Catalina在安全性方面得到了Apple工程师的重点关注,这一点也就显得不足为奇了。在macOS 10.15版本中,我们发现了一些重大的改进,可能将会影响部署安全解决方案的企业和开发人员。在这篇文章中,我们对目前新版本操作系统中所公开的安全机制进行了总结,同时深入解读这些改进会如何影响到最终用户。中国菜刀
一、告别Kexts,迎接SystemExtensions
从macOS 10.15 Catalina开始,安全供应商就被要求迁移到新的终端安全(EndpointSecurity)和系统扩展(SystemExtensions)框架,并且不再使用现在已经正式弃用的内核扩展。在Catalina版本中,Apple已经引入了系统扩展来取代内核扩展。这一思路旨在为开发人员提供类似的功能,从而完全在用户空间运行代码,而不再是直接在内核中。
重要的是,与去年Apple改变Safari扩展(Safari Extensions)的方式相同,系统扩展必须作为主机应用程序的一部分,不允许使用独立存在的系统扩展。这样的要求具有以下优点:由于系统扩展本身在主包(Host Bundle)之中,因此不需要安装应用程序或包。同样,卸载过程也非常便捷,因为只需要将应用程序移动到“废纸篓”即可停用系统扩展,当然,在这里已经删除的应用程序需要是最新并且唯一的应用。
“立即生效”可能会影响企业的工作流程,为其带来一个重要的变化,特别是对于使用MDM或托管配置文件的场景。尽管内核扩展在macOS Catalina上仍然可用,但现在,一旦安装任何新的kexts后,都需要重新启动。
由于kexts被弃用,一些云存储提供商(例如:Google、Dropbox、OneDrive、BoxDrive)的FileProvider API也随之需要进行更新。
这个新的API将帮助云存储提供商由内核扩展转换到最新的方式,同时保证其服务仍然能够集成在Finder中。无需内核扩展,现在这些提供商可以通过Mac的App Store交付他们的应用程序。
对于企业来说,弃用内核扩展是一个非常大的变化,但从长远来看,是一个非常不错的改进。实际上来说,开发人员比企业要承受更大的挑战,除非运行的是自定义内核的扩展。对于目前依赖于kexts提供服务的任何人来说,仍然具有一段窗口期,可以尝试弃用旧的机制,并使用新的终端安全(EndpointSecurity)和系统扩展(SystemExtensions)框架。我们都希望,Apple公司在关上了一扇窗的同时,能够用这项新技术为我们开启一扇通往光明的大门。
二、新的文件系统分区结构
在macOS Catalina中,Apple推出了一种新的文件系统分区结构。新的文件系统分区结构将一个分区作为包含操作系统本身的专用“只读”系统卷,并且与所有用户数据完全分开。除了经过Apple签名的代码(例如:系统更新)之外的任何内容都无法覆盖操作系统文件。这样的机制,基本上使系统完整性保护到达了一个新的水平。现在,整个分区都是封闭的,而不再仅仅是在未受保护的分区中仅仅保护特定位置的内容。
由于在改动后,安装路径不再像之前那么明显,因此可能会存在一些初步的混淆。例如,用户数据位于何处?在此前版本中,用户数据位于/Users/<username>。但在Catalina新版本中,用户数据将位于/System/Volumes/Data/Users/<username>。传统意义上的根目录/,现在将作为一个系统专用的卷。奇热看片
对于企业来说,最开始要习惯修改后的路径命名约定可能会有一些困难,但从安全性原则上来看,将系统和用户数据的分区之间划分出明确的界限可能是一个良好的举措。这样一来,会使系统恢复和备份变得更加直接。Apple在先前的展示中表示,如果在安装第三方更新后出现问题,macOS Recovery将能够更轻松地从快照恢复。我们可以肯定,这一功能是依赖于新的磁盘分区方案。
三、Gatekeeper
在新版本操作系统之中,Gatekeeper的安全性也有所加强。现在,它已经不再仅局限于对应用程序源的检查。在macOS 10.14及更早版本中,Gatekeeper根据源管理下载,会区分为“仅来源于App Store”和“来源于App Store和受信任的开发人员”这两个类别。在macOS Catalina中,这两个类别仍然存在(实际上,通过命令行的方式,还可以选择第三个类别“运行任何来源的应用程序”),但改进后的Gatekeeper会不定时执行恶意内容扫描和签名验证,以检查代码是否被篡改。
重要的是,Apple表示他们将会扫描所有软件,无论是否隔离,都会对其进行恶意内容的检查。实际上,这一机制是否适用于未从Bundle运行的代码(例如:通过Curl下载的脚本和二进制文件)仍然有待观察。目前,根据前期的一些线索来判断,可能并非如此。有关扫描的确切工作方式和实际扫描内容的详细信息,将随着Catalina版本的正式发布而公开。它是否会比Xprotec更为强大,我们希望是如此。
对于企业来说,Gatekeeper是非常受欢迎的。但在此前,我们一直抱怨该机制容易被绕过。我们真正希望看到的是管理员权限被应用到Gatekeeper所依赖的隔离位,但在初始测试版本中没有提及到这一点。针对那些担心会运行未经签名的代码的安全人员来说,Apple目前仍然没有计划阻止用户在macOS上运行未经签名的代码。
四、Notarization
随着对Gatekeeper的更改,我们发现在macOS 10.14的升级之后,目前已经将Notarization变为强制性。Notarization是一组自动扫描机制,在开发人员构建应用程序的发布版本时运行。Catalina的改进意味着开发人员无法在没有进行Notarization的情况下构建并发布应用程序,以在10.15版本的操作系统中使用。
对于企业来说,新的方式仍然没有充足的效力证明。尽管Apple的意图非常好,但这一自动扫描的过程缺乏透明度,也就意味着我们很难知道Apple的Notarization实际上阻止了多少恶意内容(如果存在)。更糟糕的是,由于经过Notarization的应用程序在安装之后可以轻松进行更新,从而给应用程序增加了包含恶意代码的可能性,因此开发人员会认为,上述这些额外的环节是在给合法应用程序和合法开发者带来额外的负担,而不是阻止恶意软件开发人员。如果能在Gatekeeper中对重新扫描的周期进行调整,可能会有助于改善这一点,但在具体实践中,仍然是有待观察。
五、弹出更多的用户提示
在macOS Catalina中,Apple进一步扩展了代码尝试访问某些位置和功能时可以生成的用户提示的数量和范围。
为了防止攻击者通过fdesetup(一种可能的勒索软件攻击途径)使用密钥启用FileVault,Apple推出了一个新的提示,需要用户同意才能使用FileVault以预先定义的方式加密驱动器。
现在,对用户的桌面和文档文件夹的预先定义访问也需要用户的批准,同样,访问下载文件夹、iCloud、已安装的卷、云存储文件夹(例如:Dropbox、OneDrive等)也是如此。与Mojave版本一样,可以在“系统首选项 – 隐私”窗口中查看并管理已经允许的应用程序列表。
用户提示信息类似于“某APP想要访问Desktop文件夹中的文件”的形式,并且具有“不允许”(Don’t Allow)和“确定”(OK)这两个选项,点击确定选项后不需要输入系统密码。
此外,针对通常用于系统管理目的的其他目录,还有进一步的控制机制,包括:/usr/lib/cron(通常被广告恶意软件用于添加持久性)、/private/var/at和/private/var/rc等等。
例如,如果尝试安装新的Cron任务,则会产生一个警报,通知用户该程序正在尝试编写Crontab并希望获得Mac管理员的权限。
% crontab: installing new crontab
该命令应该会生成用户提示。如果用户单击“不允许”(Don't Allow),那么该命令将会失败,并且显示“该操作不被允许”的错误。
% crontab: tmp/tmp.1095: Operation not permitted
我们在这里讨论的是提示信息,因此有一点需要特别提及,就是当用户尝试从之前未曾下载过任何内容的站点下载时,Safari也会弹出额外的提示。如果用户允许从该站点下载,则该网站将被添加到Safari的网站首选项中,位于侧栏的新“下载”项中。
在macOS Catalina中,受到TCC读保护的其他区域包括:
· /Library/DirectoryServices/PlugIns
· /Library/Preferences/DirectoryService/DirectoryService.plist
· /private/etc/passwd
· /private/etc/master.passwd
· /private/etc/auto_master
· /private/etc/exports
在10.14 Mojave版本中,如果应用程序的代码尝试访问用户的摄像头或麦克风,会产生一个用户提示。这一机制在macOS 10.15 Catalina版本中已经扩展到屏幕录制和键盘输入监控。显然,这是新版本为键盘记录恶意软件和间谍软件设置的一道额外的障碍。
最后,全盘访问(Full Disk Access)提示新增了“废纸篓”(Trash)文件夹,一旦程序或代码尝试移动或读取用户已删除的文件,则会产生一个提示。
对于企业来说,看到Apple能积极主动地阻止像Cron这样的持久性机制,是非常开心的。但是,依赖于用户提示,实际上是一种有缺陷的方式。正如我们在过去所指出的那样,如果用户经常被要求对访问常规文件和文件夹的行为进行确认,他们很可能会形成一种不假思索点击“同意”的习惯,并将其转换为肌肉记忆,从而失去这一提示本身的意义。
用户对于提示信息的疲劳感无疑是一大问题,并且能够直接破坏该保护的价值所在。更重要的是,如果用户企业依赖于大量自动化脚本,那么在升级到10.15版本之后,可能会出现大规模的故障,并且需要对脚本进行大量重写工作。对于使用MDM和托管配置文件的企业来说,TCC白名单将优先考虑需要处理的事项。
六、对脚本语言的支持
提到脚本语言,如果你还在期待着macOS 10.15中加入对Python 3或更新版本的Bash的支持,那么会发现Apple给出了不太一样的惊喜。在测试版本发行说明中,Apple表示:
macOS中包含脚本语言(例如:Python、Ruby和Perl)运行时,从而实现与旧版本软件的兼容。默认情况下,macOS的后续版本将不包括脚本语言运行时,可能需要用户安装其他软件包。如果需要使用的软件依赖于脚本语言,建议开发者在应用程序中捆绑运行时。(49764202)
建议不要使用Python 2.7,因为此版本包含在macOS中,用于与旧版本软件兼容。在后续版本的macOS中将不包含Python 2.7。建议用户从终端内运行Python 3。(51097165)
另外一个意想不到的改变,是Apple已经将终端的默认Shell从Bash更改为Zsh。但如果用户需要,还是可以将默认值更改回Bash。
对于企业来说,如果企业中使用了Python,那么很可能已经安装了自己的Python 3运行时,并自行管理这些依赖项。尽管我们认为Apple在默认情况下不仅仅运用最新的Python实现方案,这一点并不值得认同,但我们不认为这样的改变会导致重大问题。对于调整为Zsh,这是意料之外的,但可能只是因为Apple的工程师最喜欢这种Shell。
七、激活锁以及其他安全功能
在macOS Catalina中,还有一些其他值得注意的改进,我们可以快速盘点一下。首先,32位进程将不再受到支持,Apple也在此前的很长一段时间中持续提醒我们这一点。事实上,应该很少有人(特别是开发人员)会对这一点改进感到惊讶。但是,如果有人仍然依赖于32位应用程序,那么最好的选择就是,不要升级到Catalina版本。
对于配备T2的Mac,激活锁(Activation Lock)可以在Mac上与iOS兼容。这允许用户在Mac被盗的情况下,擦除(或重新激活)Mac,从而允许计算机无法被窃贼操作,并且只能被合法用户恢复。同样,新的FindMy功能允许通过附近的其他Apple设备来定位Mac,即使在主机未启动的情况下也是如此。
此外,我们还需要快速了解一下与Apple本地邮件客户端“邮件”(Mail)安全性相关的改进。在macOS 10.15 Catalina中,只需要单击发件人姓名,并选择“阻止联系人”(Block Contact)即可阻止特定发件人。我们认为,这是帮助减少企业垃圾邮件和其他无实际需要邮件的一个好方法。同时,取消订阅垃圾邮件或发送频率过高的邮件也变得更加容易,因为“邮件”中包含一个内联按钮,可以自动将“取消订阅”邮件发送给特定的服务方。
总结
在macOS新版本Catalina中,我们发现Apple在安全性方面做出了一些重大的改变。现在,要定论这些改变将如何发挥作用,以及这些改进是否能给恶意软件作者带来任何真正的障碍还为时尚早。我们推测,与Mojave版本一样,依赖于用户提示将无法解决恶意软件带来的危险。改进后的Gatekeeper和Notarization机制的有效性,实际上取决于其实施细节,我们后续将会持续关注这一点。
参考文章
我们要感谢以下参考文章及其作者,对本文的撰写做出了贡献。