【问题标题】:Running an OSX Application with Low Privilege以低权限运行 OSX 应用程序
【发布时间】:2012-09-20 13:47:55
【问题描述】:

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

有时我的应用程序会启动auxiliary application,实际上只是一个命令行应用程序。我希望能够剥夺这个应用程序除了将文件写入 TMPDIR 之外的任何功能。我正在尝试关注principle of least privilege

我当前使用的代码是:

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

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

【问题讨论】:

  • 您的 OS X 版本是什么?对于此类工作,在 10.8 中,事情变得容易了。
  • @RobNapier 我的目标是 10.7;但我会对 10.8 的答案非常感兴趣。仅作为内部应用程序;瞄准大众并不是真正的问题。

标签: objective-c cocoa least-privilege


【解决方案1】:

最好的工具叫做 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 的细节,如果您的目标是 10.7+,我还是推荐使用 XPC 进行此类工作。

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2013-03-04
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多