首页 > 解决方案 > 设置可执行文件的权利

问题描述

我正在开发一个基于 C 语言的 macOS 程序。我创建了一个名为 MyApp.app 的 macOS 包装应用程序,它应该执行该程序。我想对程序进行沙箱处理并授予它仅访问某些资源的权限。

这就是我对程序和包装应用程序进行代码设计的方式:

codesign -s MyCert -f --keychain login.keychain --timestamp --options=runtime --deep --entitlements ents.plist myprogram

codesign -s MyCert -f --keychain login.keychain --timestamp --options=runtime --deep --entitlements ents.plist MyApp.app

其中ents.plist启用com.apple.security.app-sandbox权利。上述命令不报告任何错误。然后我检查是否真的在应用程序上启用了沙盒,并且它处于打开状态:

asctl sandbox check MyApp.app
/Users/Me/MyApp.app:
        signed with App Sandbox entitlements

至于二进制程序,我得到一个错误:

asctl sandbox check myprogram
asctl: unable to resolve path for application "myprogram"

如果我运行程序并检查进程,它会给我以下信息:

asctl sandbox check -p 16890
/Users/Me/myprogram:
        not signed with App Sandbox entitlements
        running without App Sandbox enabled
        running unsandboxed

如何在二进制可执行程序上启用沙盒?

标签: macosentitlementscode-signing-entitlements

解决方案


为了为命令行实用程序启用 App Sandbox(我假设这是您尝试实现的目标),您不需要包装应用程序/应用程序包。您需要的是信息属性列表 ( Info.plist),它通常位于此类应用程序包中。但是,Info.plist可以将其嵌入到二进制文件中,这样您就可以直接为二进制文件启用沙盒。

首先,您需要创建丢失的Info.plist文件。

第二步取决于您使用的是 Xcode 还是其他构建系统:

如果您使用的是 Xcode,请选择目标配置的GeneralInfo.plist选项卡的Identity部分。在Build Settings选项卡的Packaging部分下,您需要启用Create Info.plist Section in Binary。现在,您可以在Signing & Capabilities选项卡中添加App Sandbox功能。

如果您使用的是另一个构建系统,请确保您传递 -sectcreate __TEXT __info_plist /path/to/Info.plist给链接器并嵌入问题中描述的权利 - 包括沙盒权利 ( com.apple.security.app-sandbox)。

就是这样——你的命令行工具现在应该是沙盒的。

为了检查是否Info.plist正确嵌入到二进制文件中,您可以使用以下命令序列显示嵌入的内容:

objdump -m -section=__info_plist -s /path/to/binary | sed '1,/Contents of (/d'

推荐阅读