【发布时间】:2016-03-08 06:48:16
【问题描述】:
我有一个由 launchd 在 OS X 的根上下文中启动的进程(启动守护进程)。该进程是代码签名的。不过,如果我损坏了二进制文件,它会再次加载。为了破坏二进制文件,我在十六进制编辑器中打开可执行文件,并查找和替换任何字符串。有没有办法阻止这个进程在它被损坏时启动?
【问题讨论】:
标签: objective-c xcode macos security launchd
我有一个由 launchd 在 OS X 的根上下文中启动的进程(启动守护进程)。该进程是代码签名的。不过,如果我损坏了二进制文件,它会再次加载。为了破坏二进制文件,我在十六进制编辑器中打开可执行文件,并查找和替换任何字符串。有没有办法阻止这个进程在它被损坏时启动?
【问题讨论】:
标签: objective-c xcode macos security launchd
Apple 提供了code signing framework,允许可执行文件检查自己的签名并测试应用程序是否被篡改。
首先通过调用SecCodeCopySelf获取代码对象,然后使用检索到的SecCodeRef调用SecCodeCheckValidity或SecCodeCheckValidityWithErrors。
如果遇到有效性问题,由您的应用程序退出。由于它在根上下文中运行,它还可以从 launchd 中卸载自身。
请注意,验证应用程序所需的时间取决于其大小和文件数量。一个非常大的应用程序包,例如 XCode,可能需要大约 3 分钟,尽管一个小的应用程序几乎不会被注意到。
【讨论】:
通常OS X的Gatekeeper不会阻止你执行一个没有代码签名或错误签名的二进制文件,只要你在下载后已经删除了隔离属性来批准它(“xxx是从互联网下载的应用程序……”)。此外,如果您似乎是故意执行它(右键单击、打开或在终端中执行),它也会停止运行。在某些东西被批准运行后,GateKeeper 就完成了。
坦率地说,这是一个很好的保护措施,但非常薄弱。与 iOS 完全不同。
出于您的目的,您可能需要查看Ostiarius。这是最近发布的工具,它会导致 OS X 内核拒绝执行任何未签名(或修改)的二进制文件,以及来自 Internet 的运行期间。您可以使用xattr 将隔离属性添加到您的二进制文件中,这样它就会受到影响。
并且/或者,在调用它的启动脚本中,使用codesign -dv 在您愿意启动之前自己检查签名。您还可以将应用程序沙箱化,以确保如果它被劫持,它将无权做任何事情。
因为这是一个已启动的过程,同一位安全研究人员还有另一个名为 BlockBlock 的免费工具可能会让您感兴趣。我相信它会阻止二进制文件在您批准之前被替换。
坦率地说,这家伙所做的一切都非常酷。可能想看看其余的。
【讨论】:
sudo xattr -w com.apple.quarantine "0002;56dffb86;Safari;0EC7F021-2F3C-43CC-BC47-7981517CD429" /usr/local/bin/ffmpeg,然后运行/usr/local/bin/ffmpeg,如果只是在控制台运行它不会被删除。