最近有开发者基于Apple的EndpointSecurity框架开发了一款应用(该应用的代码托管在GitHub上),可以防止某些进程注入技术。但是,由于开发人员仍未获得生产端点安全性授权,因此无法发布签名版本。如果你想使用它,你至少需要一个开发者端点安全授权。在过去两年中,研究人员开始深入挖掘macOS安全性,随着研究的深入,研究人员发现,除了内存损坏漏洞外,macOS的头号问题是在其他应用程序的上下文中运行代码。这样做的原因是在macOS(实际上也是*OS)的安全模型中,每个应用程序都有一个权限列表,可以向该应用程序授予各种权限。如果我们只使用3rd方应用程序,大多数情况都是围绕沙盒(例如访问网络)或没有沙盒可以做什么,可以访问哪些隐私(TCC)保护区,例如相机、麦克风、新闻等。在TCC的情况下,如果我们没有这些权限,即使我们以root身份运行,我们也无法访问这些资源或位置。对于Apple二进制文件,有数百种不同的Apple专有权限是第三方应用程序无法拥有的,例如,它们可以控制对SIP保护区的访问或加载内核扩展的能力。要添加到此列表,XPC跨进程通信的基本保护之一是能够控制谁可以与特定XPC服务通信,特别是如果其中一个进程具有特权。对于苹果来说,这通常是通过授权来完成的,而对于第三方来说,则是通过代码签名验证来完成的。在这两种情况下,如果我们可以代表XPC客户端运行代码,我们就可以与特权XPC服务进行通信。这个列表可以继续下去,钥匙串有时也会根据代码签名控制访问。这意味着如果我们可以将代码注入应用程序,我们就可以访问它,这就是进程注入在macOS上受到严格控制的原因。Apple在保护其应用程序方面做得很好,尽管有时他们会疏忽,例如CVE-2019-8805。不幸的是,第三方应用程序并不好。这导致了过多的XPC漏洞,这些漏洞通常允许用户将他们的权限提升到root。绕过TCC的攻击也很常见,攻击者可以在其中访问敏感位置,例如:MicrosoftAutoUpdate中的LPE或Zoom程序中的TCC绕过。进程注入一般可以归结为以下3种主要场景:1.通过环境变量注入dylib;2.dylib劫持或代理;3.通过任务端口注入Shell代码:如果Electron应用程序在macOS上变得非常流行,那么可以通过在调试模式下运行Electron应用程序或使用Electron特定的环境变量来注入代码。巧合的是,这篇文章的作者也是Mac用户,当他发现仍有攻击者可以执行上述操作来发起攻击时,他决定编写一个小应用程序来阻止这些攻击。开发过程随着KEXT的消失(kext文件是MacOSX内核的扩展,在Hackintosh中很常见。它们通常用于设备驱动程序,运行在系统的核心基础上。),研究人员决定尝试使用新的端点安全框架。首先必须承认,本文的作者并不认为自己是开发人员,也从未真正从事过开发工作,因此可能编写了糟糕的代码,但开发人员已尽力创建一个可靠的应用程序,以便确保您的代码可以优化。在这种情况下,我严重依赖PatrickWardle开发的代码作为他的Objective-See工具的开源部分。2018年,美国国家安全局前雇员、DigitaSecurity首席研究官帕特里克·沃德尔(PatrickWardle)在苹果最新的HighSierra操作系统中发现了一个严重的零日漏洞,允许安装在目标系统中的恶意应用程序虚拟地“点击”安全提示获取内核访问权限并完全控制您的计算机。实际上,经过一些修改,研究人员重用了他的进程监控库和LuLu的一些代码,这对理解如何创建ES(端点安全)代理以及如何将所有内容组合在一起有很大帮助。此外,研究人员还花了一些时间研究StephenDavis的Crescendo代码库。尽管它是用Swift编写的,而我正在用Objective-C编写Shield,但它帮助我了解了ES的其他方面,比如与代理通信,以及如何安装它,如果我们不将它作为守护进程运行,而是,作为系统扩展。经过多轮编码,研究人员对编码结果感到满意,并向公众发布。然而,研究人员对Objective-C、编码、使用Xcode进行项目生产以及使用Xcode构建应用程序了解不多。从研究人员最初的计划是将Shield作为ES守护进程运行,现在它被用作系统扩展。(SE)run,包含了主应用逻辑,这里是保护发生的地方,在菜单栏中有一个辅助程序自动运行它的辅助工具,然后通过主应用来控制SE。目前发布的版本只是测试版,因为只有研究人员测试过,虽然这个测试版在过去3个月里没有遇到任何问题,但仍然只有普通用户权限。然而,经过多方努力,研究人员已经通过代码注入技术成功实现#1和#3,防止dylib劫持仍在开发中。除此之外,该应用程序还可以防止某些特定的注入。虽然研究人员试图添加许多评论,但后来为代码创建了一个文档,以便其他人更容易做出贡献。现在,让我们看看如何使用这个程序以及它能做什么。如何使用这个应用程序没有正常的窗口模式应用程序,它只是菜单栏。当我们启动它时,我们会看到一个新的菜单栏图标,显示为一个点。点击它,弹出一些基本控件,如下图。在实际运行之前,需要安装系统扩展。当我们点击相关菜单项时,就像是安装了一个新的内核扩展,需要在安全和隐私方面进行审批。一旦获得批准,它将被加载,但到目前为止我不会自动启动ES客户端,所以它默认停止。如果要卸载代理,需要点击相关的菜单选项。请注意,它不会删除应用程序,只会卸载SE。为此,我们需要重启macOS,因为在Catalina中,macOS不重启是无法完全移除SE的。安装SE后,我们可以通过单击“开始”或打开首选项并切换“开始/停止”来启动EndpointSecurity客户端。按钮的状态是通过SE刷新的,尽管在实践中很少会遇到它做得不对的情况,但重新打开首选项会有所帮助:)bug#1。阻塞模式意味着如果它检测到下一个配置的注入尝试,它将阻止它。如果在进程启动时环境变量正常出现,则说明作为注入目标的进程无法启动,将被阻塞。如果尝试注入,我们将收到一条通知,该通知将记录到/Library/ApplicationSupport/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主应用程序(菜单项),它将安装和卸载标准登录项。需要注意的是,由于开发者开发的程序只是测试版程序,并未实现自动运行EndpointSecurity客户端的功能。即使开机后主应用启动,也需要启动ES客户端。一旦获得足够的用户反馈,开发人员将添加此选项。所有配置的首选项都保存在/Library/ApplicationSupport/Shield/com.csaba.fitzl.shield.preferences.plist中。本文翻译自:https://theevilbit.github.io/shield/如有转载请注明原文地址:
