这是最新 macOS 版本的安全功能。
系统bash
可执行文件已被标记为“受限”,禁用 DYLD_* 功能。要解决此问题,您可以复制bash
并用它来代替。
通过在实现中查找以下细节dyld
,我看到这个限制至少可以追溯到 10.6。
在 macOS 10.13 中dyld
执行 https://opensource.apple.com/source/dyld/dyld-519.2.1/src/dyld.cpp.auto.html这个逻辑在pruneEnvironmentVariables
,带有评论:
// For security, setuid programs ignore DYLD_* environment variables.
// Additionally, the DYLD_* enviroment variables are removed
// from the environment, so that any child processes don't see them.
然而,设置限制的实际逻辑是configureProcessRestrictions
:
// any processes with setuid or setgid bit set or with __RESTRICT segment is restricted
if ( issetugid() || hasRestrictedSegment(mainExecutableMH) ) {
gLinkContext.processIsRestricted = true;
}
...
if ( csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) != -1 ) {
// On OS X CS_RESTRICT means the program was signed with entitlements
if ( ((flags & CS_RESTRICT) == CS_RESTRICT) && usingSIP ) {
gLinkContext.processIsRestricted = true;
}
// Library Validation loosens searching but requires everything to be code signed
if ( flags & CS_REQUIRE_LV ) {
gLinkContext.processIsRestricted = false;
...
正如你所看到的,这取决于,issetugid
, hasRestrictedSegment
,以及CS_RESTRICT
/SIP 权利。您也许可以直接测试受限状态,或者您可以构建一个函数来根据此信息自行测试这些条件。