如何对命令行工具进行沙盒隔离?

12

我制作了一个简单的Unix工具,可以从Shell启动主Cocoa应用程序。

我需要对其进行沙箱化,但运行时它崩溃并显示错误“Illegal instruction: 4”,在console.app上,我可以看到以下错误消息:

  

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

该文件已经正确地使用codesign签名。

我阅读了这篇文章Mac OS app, sandbox with command line tool?,但没有帮助。


你在对代码签名时使用了 --entitlements 参数吗? - Marius
也许需要更多的信息。您的工具是如何与应用程序打包的?您如何执行“从shell中”的工具(请提供代码)?您提到的其他问题没有帮助过您(您在哪里遇到了问题)? - Joshua Nozzi
现在有一篇关于此的 developer.apple.com 文章:https://developer.apple.com/documentation/xcode/embedding-a-helper-tool-in-a-sandboxed-app - nishanthshanmugham
5个回答

12

我曾经遇到过这个问题,当我添加了一个内嵌的 Info.plist 时,问题消失了。

尝试使用以下clang标志(假设你的构建目录中有 info.plist 文件):

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


1
哇,你拯救了这一天。如果可以的话,我现在会捐赠我所有的 SO 分数给你。非常感谢! - Lizza
你在嵌入式 Info.plist 中添加了哪些信息?我相信这个 plist 是用于 Unix 文件的。 - Swati
@Swati 无论您喜欢的信息 - 像Mac OS应用程序的常规Info.plist值一样。例如CFBundleVersion等等。 - Nick Moore

4

这个控制台应用是直接从控制台启动的还是从主沙盒应用程序调用的?当我尝试对一些二进制文件进行沙盒化时,我遇到了类似的错误,但我只能通过使用以下权限来使其正常工作:

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

当然,之后你只能从已经进入沙盒的父进程中调用该二进制文件(这也是我问你二进制文件是如何被调用的原因)。

不,我的命令行工具是从Unix shell调用的,它与主沙盒应用程序完全独立。 - dafi

3

虽然 @Nick Moore 的答案完全正确,但在今天的 Xcode 中有一个选项可用于此,在 Packaging - Create Info.plist Section in Binary (CREATE_INFOPLIST_SECTION_IN_BINARY) 下。只需将 thue 设置为 Yes。


0

看起来,如果你用 com.apple.security.inherit 签名一个可执行文件,只有已经被沙盒化的应用程序才能调用它。因此,在运行 codesign 后,你不能再从命令行调用它。


是的 - 当我使用最小的com.apple.security.app-sandbox + com.apple.security.inherit plist签署我的助手可执行文件后,这个问题就立即出现了。有没有解决方法?或者我需要为每个助手可执行文件添加“真正”的权限,就像它是一个父应用程序一样,例如com.apple.security.network.client?我担心文件系统权限,因为我的助手可能需要相当广泛的访问权限,远远超出了主目录的限制。 - chriskilding

0

现在在developer.apple.com上有一篇官方文章,标题为“将命令行工具嵌入沙盒应用程序中”。

https://developer.apple.com/documentation/xcode/embedding-a-helper-tool-in-a-sandboxed-app


在构建命令行工具之后,以下是相关步骤(摘自文章)。

为工具创建一个授权文件:

% /usr/libexec/PlistBuddy -c "Add :com.apple.security.app-sandbox bool true" "ToolC.entitlements"
文件不存在,将创建:ToolC.entitlements
% /usr/libexec/PlistBuddy -c "Add :com.apple.security.inherit bool true" ToolC.entitlements
% cat ToolC.entitlements 
…
<dict>
   <key>com.apple.security.app-sandbox</key>
   <true/>
   <key>com.apple.security.inherit</key>
   <true/>
</dict>
</plist>

按下面所示对工具进行签名:

% codesign -s - -i com.example.apple-samplecode.AppWithTool.ToolC -o runtime --entitlements ToolC.entitlements -f ToolC

...

将 ToolC 可执行文件添加到 Xcode 项目中。在此过程中:

  • 启用“如果需要则复制项目”。
  • 选择“创建组”,而不是“创建文件夹引用”。
  • 取消选中“添加到目标”的所有框。

在应用程序目标编辑器的“构建阶段”选项卡中,将 ToolC 添加到“嵌入式助手工具”构建阶段,确保勾选“复制时代码签名”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接