macos - 设置可执行文件的权利
问题描述
我正在开发一个基于 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
如何在二进制可执行程序上启用沙盒?
解决方案
为了为命令行实用程序启用 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'
推荐阅读
- dart - 小部件上的光泽效果
- javascript - 如何使用 jquery 和 css 隐藏和显示侧边栏?
- android - 获取当前用户孩子时出错,firebase
- javascript - Javascript 使用 async/await 传递/链接一个 Promise
- javascript - 用于 Javascript es2015 或 TypeScript(正向和逆向工程)的 UML 类图工具
- eclipse-plugin - 从 Eclipse 中的 checkstyle-plugin 中排除路径
- python - 多输入一输出的 Python 时间序列
- model-view-controller - 多选值未在用户创建时保存
- dart - Dartlang:如何将 int 从网络转换为主机顺序(反之亦然)
- go - Golang 声明插件导出列表