Shield——一个防止在macOS上进行进程注入的应用程序

  • A+
所属分类:安全工具 逆向工程

Shield——一个防止在macOS上进行进程注入的应用程序

最近有开发人员开发了一个基于Apple的Endpoint Security框架的应用程序(该应用程序的代码托管在GitHub上),可以防止macOS上的某些进程注入技术。但由于开发人员至今仍然没有获得生产端点安全性授权,因此无法发布已签名的版本。如果你想使用它,你至少需要获得开发端点安全授权。

在过去的两年中,研究人员开始深入研究macOS安全性问题,随着研究的愈加深入,该研究人员发现除了内存损坏漏洞之外,macOS的首要问题是在其他应用程序的上下文中运行代码。其原因在于macOS的安全模型(实际上也包括* OS),每个应用程序都有一个权限列表,可授予该应用程序各种权限。如果我们仅使用第三方应用程序,则大多数情况是围绕沙盒(例如,访问网络)或在没有沙盒的情况下可以做什么,可以访问哪个隐私(TCC)保护区域,例如摄像机,麦克风,消息等。在TCC的情况下,如果我们不拥有这些权限,即使我们以root身份运行,也无法访问这些资源或位置。

对于Apple二进制文件,有数百种不同的Apple私有权限是第三方应用程序无法拥有的,例如,它们可以控制对SIP保护区域的访问或加载内核扩展的能力。

要添加到此列表中,XPC跨进程通信的基本保护之一是控制谁可以与特定XPC服务进行通信的能力,尤其是在其中一个进程具有特权的情况下。对于苹果公司来说,这通常是通过授权来完成的,而对于第三方而言,这是通过代码签名验证来完成的。在这两种情况下,如果我们都可以代表XPC客户端运行代码,就能够与特权XPC服务进行通信。

该列表可以不停地进行,钥匙串有时还根据代码签名来控制访问。

这意味着,如果我们可以向应用程序中注入代码,则可以获得其权限,这就是为什么过程注入功能在macOS上受到严格控制的原因。苹果公司在保护自己的应用程序方面做得很好,尽管有时他们也会有疏忽,例如CVE-2019-8805 。

不幸的是,第三方应用程序并不是很好。这就导致了大量的XPC漏洞,这些漏洞通常会允许用户将其特权升级到root。绕过TCC进行攻击的场景也很常见,攻击者可以在攻击中访问敏感位置,例如:Microsoft AutoUpdate中的LPE或Zoom程序中的TCC绕过。 

流程注入通常可以归结为以下3种主要情况:

1.通过环境变量进行dylib注入;

2.dylib劫持或代理;

3.通过任务端口注入Shell代码:如果Electron应用程序在macOS上变得非常流行,则可以通过在调试模式下运行Electron应用程序或使用Electron特定的环境变量来注入代码。

巧的是本文的作者也是一位Mac用户,当发现还有攻击者能够执行上述操作来发起攻击时,他就决定编写一个小型应用程序来防止这些攻击。

Shield——一个防止在macOS上进行进程注入的应用程序
开发过程

随着KEXT(kext文件是一个Mac OS X内核扩展,常见于Hackintosh。它们通常用于设备驱动程序,运行于系统的核心基底。)的消失,研究人员决定尝试使用新的Endpoint Security框架。其实必须首先承认,本文的作者不认为自己是开发人员,而且从未真正从事过开发工作,因此可能编写了拙劣的代码,尽管如此,开发人员还是尽最大努力创建了一个可靠的应用程序,以确保可以优化代码。

在这种情况下,我非常地依赖于Patrick Wardle开发的代码,该代码是他的Objective-See工具的开源部分。2018年美国国家安全局前雇员、Digita Security首席研究官Patrick Wardle在苹果最新High Sierra操作系统发现一个关键的零日漏洞,允许安装在目标系统中的恶意应用程序虚拟“点击”安全提示,获得内核访问权限并完全控制电脑。实际上,经过一些修改,研究人员重用了他的过程监控库和来自LuLu的一些代码,这对理解如何创建ES(端点安全)代理以及如何将所有内容组合在一起有很大帮助。

另外,研究人员还花了一些时间研究Stephen Davis的Crescendo代码库。尽管它是用Swift编写的,而我是用Objective-C编写的Shield,但它帮助我了解了ES的其他方面,比如与代理通信,以及如何安装它,如果我们不把它作为守护进程运行,而是作为系统扩展。

经过多次编码,研究人员对编码结果已经足够满意了,且已经向公众发布了。不过研究人员并不有多了解了Objective-C、编码、用Xcode进行项目制作、用Xcode构建应用程序等知识,从研究人员最初将Shield作为ES守护程序运行的最初计划,到现在它作为系统扩展(SE)运行,其中包含主要的应用程序逻辑,这也就是进行保护的地方,在菜单栏中有一个帮助程序可以自动运行它的辅助工具,进而通过主要应用程序来控制SE。

目前发布的版本只是测试版,因为只有研究人员对其进行了测试,尽管过去3个月这个测试版本并没有遇到任何问题,但仍然只有普通用户权限。不过经过多次努力后,研究人员已经成功地通过代码注入技术实现了#1和#3,阻止dylib劫持仍然在待开发阶段。除此之外,该应用程序还可以防止某些特定的注入。

虽然研究人员尝试了添加许多注释,但稍后还会为代码创建一个文档,以便其他人更容易参与进来。现在,让我们看看如何使用这个程序,它能做什么。

Shield——一个防止在macOS上进行进程注入的应用程序
使用方法

这个应用程序没有一个普通的窗口模式应用程序,它只是菜单栏。当我们启动它时,将看到一个新的菜单栏图标,以一个点的形式显示出来。

Shield——一个防止在macOS上进行进程注入的应用程序

点击它,弹出一些基本控件,如下所示。

Shield——一个防止在macOS上进行进程注入的应用程序

在真正进行实操之前,还需要安装系统扩展。当我们点击相关菜单项时,就像安装新的内核扩展一样,需要在安全性和隐私权方面获得批准。一旦获得批准,它将被加载,但是到目前为止,我不会自动启动ES客户端,因此默认情况下它将停止。

如果要卸载代理,则需要点击相关菜单选项。请注意,它不会删除应用程序,只会卸载SE。为此,我们需要重新启动macOS,因为在Catalina中,macOS如果不重新启动就无法完全删除SE。

安装SE后,我们可以通过点击“开始”或打开首选项并切换“开始/停止”来启动Endpoint Security客户端。按钮的状态是通过SE刷新的,不过在实操中很少遇到没有正确执行的情况,但是重新打开首选项有助于 :) bug #1。

Shield——一个防止在macOS上进行进程注入的应用程序

阻止模式意味着,如果它检测到下一步配置的注入尝试,它将对其进行阻止。如果环境变量通常在启动过程时发生,这意味着作为注入目标的过程无法启动,将被阻止。如果尝试进行注入,我们将收到一个通知,并将其记录到/ Library / Application Support / Shield / shield.log。如果我们关闭这个选项,我们仍然会收到警报和日志。

下一个选项是监控Apple二进制文件的能力,目前这是不可更改的,平台二进制文件将被忽略。造成这种情况的主要原因是,它们会执行大量的task_for_pid调用,仅处理这些操作而没有任何操作就会增加20%的CPU使用率。现在,这些进程很早就被删除了,因此我们不会浪费一点CPU使用率。此时,研究人员采用了一个改进逻辑的任务,这样系统二进制文件也可以被监控。我认为目前这还不是一个大问题,因为如前所述,通常平台二进制文件都能很好地抵御这些攻击。

接下来,我们就可以启用或禁用特定的保护。

撰写本文时,环境变量注入正在监控以下三个变量中的任何一个是否存在:DYLD_INSERT_LIBRARIES、CFNETWORK_LIBRARY_PATH、RAWCAMERA_BUNDLE_PATH和ELECTRON_RUN_AS_NODE。如果其中任何一个出现,应用程序将不会启动。我发现这可能会给Firefox带来某些漏洞。

当一个进程想要获取另一个任务的端口时,则下一个设置用于task_for_pid调用。这将阻止调试,因为调试器将执行此调用。因此,如果你需要调试,可能需要临时关闭该选项。

最后一个特定于Electron应用程序,通常,可以使用——inspect命令行参数在调试模式下启动Electron应用程序,然后向其中注入代码。至此我们也只是检查是否存在此参数,如果是,则将阻止该应用程序。

其实有一个选项可以在启动时自动启动Shield主应用程序(菜单项),这将安装和卸载一个标准的登录项。

要注意的是,由于研发者开发的这个程序还只是一个测试版的程序,因此,其中没有实现自动运行Endpoint Security客户端的功能。即使主应用程序在启动后启动,你也需要启动ES客户端。一旦获得足够的用户反馈,研发者将添加此选项。

所有配置的首选项都保存在/Library/Application Support/Shield/com.csaba.fitzl.shield.preferences.plist中。

参考及来源:https://theevilbit.github.io/shield/

Shield——一个防止在macOS上进行进程注入的应用程序

Shield——一个防止在macOS上进行进程注入的应用程序

本文始发于微信公众号(嘶吼专业版):Shield——一个防止在macOS上进行进程注入的应用程序

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: