2

我有一个正在处理的 OSX 应用程序。它不是沙盒(它是一个内部应用程序,可以防止沙盒)。

在某些时候,我的应用程序启动了一个辅助应用程序,实际上只是一个命令行应用程序。我希望能够剥夺这个应用程序除了将文件写入 TMPDIR 之外的任何功能。我正在尝试遵循最小特权原则

我正在使用的当前代码是:

NSTask* task = [NSTask new];
NSBundle* thisBundle = [NSBundle mainBundle];
[task setArguments:@[a, b, c]];
[task setLaunchPath:[thisBundle pathForAuxiliaryExecutable:@"MyProgram"]];
[task launch];

这可能与 NSTask 吗?如果不是,我可以使用什么机制以非常低的权限启动 MyProgram?

4

1 回答 1

2

最好的工具称为 XPC。它在 10.7 中有点弱,但在 10.8 中却非常强大。它的全部目的是让您以这种方式分割您的程序,同时使 IPC 非常容易。一些文档:

XPC 在 10.8 中的一大变化是他们添加了NSSecureCoding. 他们修改了编译器以将类信息注入协议定义中,以便可以更安全地完成对象编组。这意味着当你说一个 ObjC 协议传递一个NSString时,他们实际上可以检查该对象是否是一个NSString. (在 10.8 之前,对象中没有类信息Protocol。您只能检查参数是否应该是“对象”。)

谁在乎?好吧,假设我劫持了你的低权限任务并欺骗它返回一个NSSomethingElse而不是一个NSString(也许我只是覆盖了isa修改它的类的指针)。假设NSSomethingElse有一种length方法对我作为攻击者有用。现在,当您的高权限任务调用[returnedValue length]时,它将运行错误的方法。或者,也许NSSomethingElse没有length方法,所以我可以强制高权限任务抛出“不实现选择器”异常,这对我也很有用。有了NSSecureCoding,这种攻击就难多了。它可以自省返回的对象,注意它不是一个NSString,并拒绝将它返回给调用代码。

即使没有NSXPCConnection.

于 2012-09-20T14:20:35.233 回答