【问题标题】:User with administrator privileges cannot add certificate to System Keychain, MacOS具有管理员权限的用户无法将证书添加到系统钥匙串,MacOS
【发布时间】:2021-04-23 08:23:05
【问题描述】:

我正在尝试开发一个快速命令行工具,它将根 CA 安装到 MacOS 系统钥匙串中。这是完成这项工作的代码块。

    SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData);
    SecKeychainRef keychain = nil;
    OSStatus status = SecKeychainCopyDomainDefault(kSecPreferencesDomainSystem, &keychain);
    if(status != errSecSuccess)
    {
        // log the error
        return;
    }
    
    status = SecKeychainUnlock(keychain, 0, NULL, TRUE);
    if(status != errSecSuccess)
    {
        // log the error
        return;
    }

    status = SecTrustSettingsSetTrustSettings(certificate, kSecTrustSettingsDomainSystem, NULL);

    NSDictionary * addCertificateQuery = @{(id)kSecValueRef: (__bridge id)certificate,
                                           (id)kSecClass:    (id)kSecClassCertificate,
                                           (id)kSecAttrLabel: CERT_ATTRIBUTE_LABEL,
                                           (id)kSecUseKeychain: (__bridge id)keychain,
                                           (id)kSecReturnRef: @YES,
                                            };
    status = SecItemAdd((__bridge CFDictionaryRef)addCertificateQuery, NULL);

当以 root 身份使用 XCode 调试器时,证书已正确添加到系统钥匙串中,但当以 user 身份调试时(user 具有管理员权限)并在收到提示后出于某种原因,具有管理员权限的用户的用户名和密码 SecItemAdd 返回错误 -61: errSecWrPerm (user 没有写入权限)。

我一直试图找到一些文档来解释为什么会发生这种情况,但仍然没有任何线索。所以我的问题是:具有管理员权限的用户无法向系统添加证书是否有特殊原因?在 System 上写入是否只保留给 root?

我也尝试过更改 /Library/Keychains/System.keychain 权限,但结果相同。

【问题讨论】:

    标签: objective-c macos certificate keychain certificate-authority


    【解决方案1】:

    具有“admin”权限的用户仍然只是普通的非 root 用户,但可以作为 root 执行某些操作,例如在“sudo”或 MacOS 授权提示下(这将启用证书添加,但需要用户提示并在 /var/db/auth.db 处注册数据库)。可以使用 AuthorizationExecuteWithPrivileges 弹出授权,一个很好的例子是“security execute-with-privileges”,它会弹出身份验证并使用 /usr/libexec/security_authtrampoline - 一个 Setuid 根二进制文件。

    您对只为 root 保留的 System 进行写入是正确的,并且随着系统完整性保护 (SIP) 以及 MacOS 移动(在 10.15 中)到只读挂载的 root 文件系统,情况变得更加复杂。前者 (SIP) 增加了保护,如果没有适当的 com.apple.rootless.* 权利,您将无法修改文件,即使是 root,而后者 (r/o mount ) 意味着没有任何东西(除了重新安装,和/或持有系统安装程序权利)不会让你写任何东西。

    您指定的“直接”方法修改 /Library/keychains 中的文件将失败,因为请注意钥匙串文件的所有权是 root 的。

    以编程方式添加证书将需要 root 或 com.apple.private.system-keychain 授权(或其同级之一 - 我忘记了 - 请参阅 http://newosxbook.com/ent.jl?ent=com.apple.private.system-keychain&osVer=MacOS13 以获取完整的授权列表)。

    另请注意,弄乱钥匙串可能会产生一些严重影响。这是 macOS 的所有秘密和神圣的东西 - 根证书、密码、Apple ID 等 - 被保存的地方。谨防。一旦安装了根 CA,它就可以被各种应用程序信任(在某种程度上包括代码签名、网站代理,甚至更险恶的用途)。因此,它没有提供给任何用户是有充分理由的 - 因为没有提示的批处理操作可能会偷偷地注入这样的 CA,并为恶意软件开辟途径。

    参考文献:“*OS Internals, Volume III”,第 11 章涉及此内容,第 6 章涉及授权。网址:newosxbook.com

    【讨论】:

    • 感谢您的意见。我们不知道是否需要更多权利,但我们将很快对其进行测试。这是有道理的,因为我们完全希望在解锁 keystone 时出现提升提示来询问用户名和密码,但无论我们尝试什么都不会发生。
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多