【问题标题】:Prevent corrupted executable from launching on OS X防止损坏的可执行文件在 OS X 上启动
【发布时间】:2016-03-08 06:48:16
【问题描述】:

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

【问题讨论】:

    标签: objective-c xcode macos security launchd


    【解决方案1】:

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

    首先通过调用SecCodeCopySelf获取代码对象,然后使用检索到的SecCodeRef调用SecCodeCheckValidity或SecCodeCheckValidityWithErrors。

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

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

    【讨论】:

      【解决方案2】:

      通常OS X的Gatekeeper不会阻止你执行一个没有代码签名或错误签名的二进制文件,只要你在下载后已经删除了隔离属性来批准它(“xxx是从互联网下载的应用程序……”)。此外,如果您似乎是故意执行它(右键单击、打开或在终端中执行),它也会停止运行。在某些东西被批准运行后,GateKeeper 就完成了。

      坦率地说,这是一个很好的保护措施,但非常薄弱。与 iOS 完全不同。

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

      并且/或者,在调用它的启动脚本中,使用codesign -dv 在您愿意启动之前自己检查签名。您还可以将应用程序沙箱化,以确保如果它被劫持,它将无权做任何事情。

      因为这是一个已启动的过程,同一位安全研究人员还有另一个名为 BlockBlock 的免费工具可能会让您感兴趣。我相信它会阻止二进制文件在您批准之前被替换。

      坦率地说,这家伙所做的一切都非常酷。可能想看看其余的。

      【讨论】:

      • 虽然我同意 Patrick 的工具 Ostiarius 很棒,但它并不能解决问题。即使二进制文件可能已损坏,它仍然是签名的,并且 Ostarius 不会验证应用程序的完整性。此外,如果用户之前已经接受了应用程序的执行,那么它的隔离标志就会被移除,而 Ostiarius 仍将允许应用程序运行。
      • 不确定。
      • sudo xattr -w com.apple.quarantine "0002;56dffb86;Safari;0EC7F021-2F3C-43CC-BC47-7981517CD429" /usr/local/bin/ffmpeg,然后运行/usr/local/bin/ffmpeg,如果只是在控制台运行它不会被删除。
      • 考虑 - 如果有人可以修改您的二进制文件,那么任何涉及该程序检查自身和自动中止的解决方案都不会真正起作用。它可以像破解的 Mac App Store 应用程序一样被绝育。
      • 对不起,我没有正确解释。虽然该属性存在,但还有另一个标志,即当用户批准应用程序打开时标记,无论守门员如何。 Ostiarius 的 kext 会检查这一点,如果设置了该标志,则允许它。它记录在 Patrick 的演讲幻灯片 Gatekeeper Exposed。注意幻灯片 58 上的第 2 步 - 忽略“用户批准的”二进制文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多