【问题标题】:How to sandbox a command line tool?如何沙箱化命令行工具?
【发布时间】:2012-10-18 17:04:20
【问题描述】:

我制作了一个简单的 unix 工具,可以从 shell 启动主 cocoa 应用程序。

我需要对它进行沙箱处理,但是当我运行它时,它会因错误“非法指令:4”而崩溃,在 console.app 上我可以看到以下错误消息

沙盒创建失败:容器对象初始化失败:NIL 没有针对 visdiff 的错误描述的容器信息对象

文件已使用 codesign 正确签名。

我已经阅读了Mac OS app, sandbox with command line tool? 的帖子,但没有帮助

【问题讨论】:

  • 您在进行代码设计时是否使用了 --entitlements 参数?
  • 也许需要更多信息。您的工具如何与您的应用程序打包在一起?您如何“从外壳”执行该工具(请提供代码)。您提到的另一个问题(您在哪里遇到问题)没有帮助?

标签: cocoa command-line sandbox


【解决方案1】:

我遇到了这个确切的问题,当我添加一个嵌入式 Info.plist 时它就消失了。

试试这些 clang 标志(假设您在构建目录中有 info.plist):

-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker info.plist

【讨论】:

  • 哇。你拯救了这一天。如果可以的话,我现在会把我所有的 SO 积分都捐给你。谢谢!!!
  • 您在嵌入的 Info.plist 中添加了什么信息?我相信这个 plist 适用于 unix 文件
  • @Swati 无论你喜欢什么信息——通常的 Info.plist 值,就像 Mac OS 应用程序一样。比如CFBundleVersion等等。
【解决方案2】:

控制台应用程序是直接从控制台启动还是从主沙盒应用程序调用?在尝试对某些二进制文件进行沙箱处理时,我收到了类似的错误,我只能通过使用以下权利使其工作:

<dict>                                                                                                                                                                       
  <key>com.apple.security.app-sandbox</key>                                                                                                                                  
  <true/>                                                                                                                                                                    
  <key>com.apple.security.inherit</key>                                                                                                                                      
  <true/>                                                                                                                                                                    
</dict> 

当然,在那之后你只能从已经被沙盒化的父进程调用二进制文件(这就是为什么我问你的二进制文件是如何被调用的:))。

【讨论】:

  • 不,我的命令行工具是从 unix shell 调用的,它完全独立于主沙盒应用程序
【解决方案3】:

虽然@Nick Moore 的回答非常好,但在今天的 Xcode 中的 Packaging - Create Info.plist Section in Binary (CREATE_INFOPLIST_SECTION_IN_BINARY) 下有一个选项。只需将 thue 设置为 Yes。

【讨论】:

    【解决方案4】:

    如果您使用 com.apple.security.inherit 签署可执行文件,它似乎只能由已被沙盒化的另一个应用程序调用。所以你在运行 codesign 之后就不能再从 cmdline 调用它了。

    【讨论】:

    • 是的 - 一旦我用最小的 com.apple.security.app-sandbox + com.apple.security.inherit plist 签署了我的助手可执行文件,这个问题就袭击了我。有解决方法吗?或者我是否需要为每个帮助程序可执行文件添加“真实”权利,就好像它是父应用程序一样,例如com.apple.security.network.client?我担心文件系统权利,因为我的助手可能需要非常广泛的访问权限,远远超出主文件夹的范围。
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多