防止在OS X上启动损坏的可执行文件

时间:2016-03-08 06:48:16

标签: objective-c xcode macos security launchd

我有一个进程(启动守护程序),它由在OS X中的root上下文中的launchd启动。该进程是代码签名的。如果我破坏了二进制文件,它会再次加载。为了破坏二进制文件,我在十六进制编辑器中打开可执行文件,并对任何字符串进行查找和替换。有没有办法阻止这个过程在它被破坏的情况下启动?

2 个答案:

答案 0 :(得分:1)

一般情况下,OS X的Gatekeeper不会阻止您执行未经过代码签名或错误签名的二进制文件,只要您在下载批准它之后已经删除了隔离属性(“xxx是从Intenet下载的应用程序”) ......“)。如果它似乎是故意执行它(右键单击,打开或在终端中执行)它也会停止运行。在批准运行某些东西后,GateKeeper就完成了。

坦率地说,这是一个很好的保护措施,但非常弱的东西。没有像iOS这样的东西。

出于您的目的,您可能需要查看Ostiarius。这是最近发布的工具,它将导致OS X内核拒绝执行任何未签名(或修改)的二进制文件以及来自运行时段的Internet。您可以使用$sessions将隔离属性添加到二进制文件中,以便它受到影响。

和/或在调用它的启动脚本中,在您愿意启动签名之前,使用xattr自行检查签名。您还可以对应用程序进行沙盒处理以确保如果它被劫持,则无权完成所有操作。

因为这是一个启动过程,所以同一个安全研究人员可以使用另一个名为BlockBlock的免费工具。我相信它会阻止二进制文件首先被替换,直到你批准它为止。

坦率地说,这家伙所做的一切都很酷。可能想看看剩下的。

答案 1 :(得分:1)

Apple提供code signing framework,允许可执行文件检查自己的签名并测试应用程序是否已被篡改。

首先通过调用SecCodeCopySelf获取代码对象,然后使用检索到的SecCodeRef来调用SecCodeCheckValiditySecCodeCheckValidityWithErrors

如果您的应用程序遇到有效性问题,可以退出。当它在根上下文中运行时,它也可以从launchd中卸载它。

请注意,验证应用程序所需的时间取决于其大小和文件数。一个非常大的应用程序包(例如XCode)可能需要大约3分钟,尽管一个小应用程序几乎不会引人注意。

相关问题