Objective-C 中的 NSBundle 沙盒
Posted
技术标签:
【中文标题】Objective-C 中的 NSBundle 沙盒【英文标题】:NSBundle sandboxing in Objective-C 【发布时间】:2012-03-12 04:44:43 【问题描述】:奇怪的标题,我知道。我真正想问的是“我可以为 NSBundles 创建一个 TrustedBSD MAC 框架或 ios 沙箱吗?”我有一个非常动态的应用程序,其中模块可以随时“插入”或“取消插入”到“交换机”。操作它的用户在另一台计算机上,可能在数英里之外。用户无法知道交换机模块如何兼容并且在他们不在时不会破坏系统。我知道 iOS 沙盒和 TrustedBSD(以及 Lion 的 Seatbelt.framework)可以为进程执行此操作,但我如何为捆绑代码执行此操作?
我想到的事情:
对所有 posix 调用和 ObjC 消息传递进行静态二进制分析(似乎不可能,因为二进制文件是......此时的二进制文件,而不是代码)。
在运行时跟踪 ObjC 消息并记录它们,在一次杂散调用后锁定模块。 (这不会影响 POSIX 调用或任何 C 调用,也不会影响汇编,并且至少已经发送了一个调用)。
使用 XPC 创建一个沙盒外部进程并在那里加载模块,并使用 PDO 将交换机调用路由到该进程(非常可行,但我需要雪豹兼容性)。
有什么想法吗?我意识到捆绑包一旦加载,最终会成为您应用程序的一部分,因此这会在安全性实施方面增加更多问题。
【问题讨论】:
【参考方案1】:在您将包加载到您的流程中的那一刻,您就可以完全控制您的流程。 (这是因为一个包可以包含在初始化时运行的代码,甚至在你调用它的任何函数之前。)
在运行时跟踪消息毫无意义,因为恶意包可以在触发之前简单地禁用负责消息跟踪的代码。 (毕竟它在同一个内存空间中运行,而且它不需要使用任何 ObjC 消息来执行此操作。)
简而言之:不要加载您不信任的包。如果您必须使用不受信任的捆绑包,请使用某种形式的沙盒(无论是 XPC 还是其他)。
【讨论】:
我完全理解这一点,这就是为什么我要问,是否可以这样做? (我在这里尽量避免使用 XPC 或 PDO,因为我已经有很多很多的因子 PDO 可执行文件。)以上是关于Objective-C 中的 NSBundle 沙盒的主要内容,如果未能解决你的问题,请参考以下文章
NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?