我在我的应用程序中放置了一个可执行的二进制XXX在MacOS上工作,并对它进行代码签名。我的应用程序将通过端口使用这项服务。
可执行二进制文件XXX将在安装我的应用程序后通过plist文件注册服务,plist文件包含DYLD_LIBRARY_PATH,它告诉可执行二进制文件在哪里找到要使用的dylib。
launchctl加载-wF "$HOME/Library/LaunchAgents/local.plist“
启动本地
这里的问题是:
在我构建了一个应用程序之后,它运行得很好。
但是,当我签名并公证,然后打开我的应用程序使用,它会得到以下错误:
dyld: Library not loaded: @@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib
Referenced from: /Users/buffer/Library/Application Support/XXX
Reason: unsafe use of relative rpath @@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib in /Users/buffer/Library/Application Support/XXX with restricted binary它将使用来自可执行二进制XXX的默认dylib path(@@HOMEBREW_PREFIX@@/opt/libev/lib/libev.4.dylib),而不是我的自定义DYLD_LIBRARY_PATH。苹果已经限制了二进制使用这种不安全的相对路径。
更新:
我的应用程序将启动一个shell脚本来安装可执行的二进制文件XXX和dylib,可执行二进制XXX将注册为一个服务,通过plist启动和停止,如下所示
launchctl加载-wF "$HOME/Library/LaunchAgents/local.plist“
启动本地
我的可执行二进制XXX路径和DYLD_LIBRARY_PATH都位于/ use /buffer/Library/Application Support/myApp/*,它作为应用程序使用的服务单独启动。
我在下面发现了一些情况:
1.I有一个相同的可执行二进制XXX在2018-09-25签署,工作正常.
2.未签署的可执行二进制XXX也运行良好。
3.但是当我现在已经签署了可执行二进制XXX并将它与dylib一起使用时,它会在.上面出现错误。
那么,苹果符号算法是否已经改变并发生了错误呢?下面是我的代码符号命令:
协同设计--强制--选项运行时--签署“开发人员ID应用程序:*”XXX
终于:
我发现了问题,苹果要求开发人员为每个应用程序启用增强的运行时,以实现notrize。如果启用了强化运行时,但没有指定权限,则某些权限将被禁用为默认.。
使用DYLD环境变量的权限已被禁用为默认
您可以查看下面的文档
如果像我一样自定义代码签名工作流,则可以在codesign中指定权限,如下所示,entitlements.plist包含要启用的权限
codesign --force --options runtime --entitlements /Users/buffer/Desktop/entitlements.plist --sign "Developer ID Application: ****" XXX发布于 2019-08-27 07:44:26
从macOS 10.10.4开始,出于安全考虑,您不允许在苹果认为安全的目录之外使用dylib,例如:
/System/
/usr/bin/
/Library/Frameworks/题为"检查门卫符合性“的代码签名文档明确指出:
从macOS 10.10.4开始,网关管理员验证没有库是从应用程序包外部加载的。如果应用程序使用
@rpath或绝对路径链接到应用程序外部的动态库,则网关管理员拒绝应用程序。此限制适用于应用程序的主可执行文件和包中的任何其他可执行文件,包括库。即使路径不存在,这个限制也适用(这通常会导致动态链接器返回到包中的库)。该错误将出现在系统日志中,下面是一个应用程序MyApp.app试图链接到非标准位置/foo中的库libLibrary.dylib的消息
因此,您应该在应用程序中嵌入dylib。
显然,另一种可能的解决方案是使用签名的安装程序在/Library/Frameworks/上安装公共框架,但是这个解决方案是由DTS提供的,显然不是正式文档的一部分。
发布于 2020-03-11 18:56:10
我从Apple了解到,在macOS Catalina10.15.3和更早版本(已经在10.15.4 beta版中修复)中存在一个已知的bug,其中一个经公证的命令行应用程序与其包外的.dylib链接(以及命令行应用程序通常不在包中)仍然无法通过网关管理员检查,当在命令行可执行文件上设置隔离标志时触发。
为了解决这个问题,Apple DTS建议:
最简单的解决方法是使用强化的运行时和库验证标志对工具进行签名。 也就是说,从以下内容更改对
codesign的调用:% codesign -s …stuff… -o runtime …stuff… helloworld对此:% codesign -s …stuff… -o runtime,library …stuff… helloworld显式设置库标志将禁用此守护者检查,并允许您的工具在macOS 10.15上运行。{0,1,2,3}。一旦10.15.4被发布并被广泛采用,请注意移除此标志。
https://stackoverflow.com/questions/57667467
复制相似问题