最近,基于开发人员的发展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绕过。
流程注入通常可分为以下三种主要情况:
1.通过环境变量进行dylib注入;
2.dylib劫持或代理;
3.注入任务端口Shell代码:如果Electron应用程序在macOS它变得非常流行,可以通过调整来调整在试验模式下运行Electron应用程序或使用Electron注入特定的环境变量代码。
巧合的是,这篇文章的作者也是一个Mac当用户发现攻击者可以执行上述操作进行攻击时,他决定编写一个小应用程序来防止攻击。
开发过程
随着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。
目前发布的版本只是测试版,因为只有研究人员测试过。虽然这个测试版在过去三个月里没有遇到任何问题,但仍然只有普通用户权限。然而,经过多次努力,研究人员通过代码注入技术成功实现了这一目标#1和#3,阻止dylib劫持仍处于发展阶段。此外,该应用程序还可以防止一些特定的注入。
虽然研究人员试图添加许多注释,但他们以后会为代码创建文档,以便其他人更容易参与。现在,让我们看看如何使用这个程序,它能做什么。
使用方法
这个应用程序没有普通的窗口模式应用程序,只是菜单栏。当我们启动它时,我们会以一个点的形式看到一个新的菜单栏图标。
点击它弹出一些基本控件,如下所示。
在实际操作之前,还需要安装系统扩展。当我们点击相关菜单时,就像安装新的核心扩展一样,我们需要批准安全和隐私。一旦批准,它将被加载,但到目前为止,我不会自动启动ES客户端,所以默认情况下会停止。
如需卸载代理,请单击相关菜单选项。请注意,它不会删除应用程序,只会卸载SE。为此,我们需要重新启动macOS,因为在Catalina中,macOS如果不重新启动就无法完全删除SE。
安装SE之后,我们可以点击“开始”或打开首选并切换“开始/停止”来启动Endpoint Security客户端。按钮的状态是通过SE刷新,但在实践中很少遇到没有正确执行的情况,但重新打开首选有助于:) bug #1。
阻止模式意味着,如果它检测到下一个配置的注入尝试,它将被阻止。如果环境变量通常发生在启动过程中,这意味着作为注入目标的过程无法启动,则将被阻止。如果我们试图注入,我们将收到通知并记录在/ 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/如果转载,请注明原始地址: