macos – ad-hoc代码签名的限制是什么?

可以使用codesign“ad-hoc”签署代码或应用程序.手册页告诉我们以下关于ad-hoc代码签名的内容:

If identity is the single letter “-” (dash), ad-hoc signing is performed. Ad-hoc signing does not use an identity at all, and identifies exactly one instance of code. Significant restrictions apply to the use of ad-hoc signed code; consult documentation before using this.

(我强调的重点)

我想知道更多,并试图找到所述文档,但我无法找到任何细节.我找到了a technical note called “macOS Code Signing In Depth”,但它根本没有提到临时签名.

这些“重大限制”是什么?它们在哪里记录?

最佳答案
基本上,在此上下文中的临时签名意味着二进制文件在没有任何加密证据的情况下进行签名.

本质上,通常通过添加所谓的CMS(加密消息)来签署二进制文件,其中CodeDirectory的散列是由签名标识签名的消息.这意味着局外人可以验证代码是否确实由持有该身份的私钥的人签名.

运行程序时,macOS系统可以验证这些签名是否有效,并且它是否信任签名身份 – 如果是,则运行该程序.这是GateKeeper功能的基础知识.

临时签名的二进制文件非常不同,因为它们不包含此类CMS.相反,它只是保存CodeDirectory的SHA-1哈希值,而没有任何其有效性的加密证明,也没有要验证的证书/身份路径.

CodeDirectory是一个对象,它通过为应用程序的各种代码片段提供哈希值来描述静态代码的特定实例.通过验证加密签名确保CodeDirectory未被禁用,并且应用程序的各个代码位与存储在目录中的哈希值匹配,您可以确定代码未被篡改.

如果没有加密证明,则无法以正常方式执行此“未经过篡改”的检查.

而是通过将SHA-1散列值与存储在内核内的静态信任高速缓存中的“已知良好”散列值列表进行比较来检查ad-hoc签名二进制文件.

从本质上讲,这意味着对您自行签署的任何应用程序的“重大限制”是它不会在任何地方通过任何类型的验证.它基本上与非签名二进制文件相同.

但是,如果您是Apple,则可以创建未以普通方式进行编码的应用程序,而是由内核明确信任.即例如,如果Apple在系统启动的早期阶段运行时确保应用程序未被禁用,而完整的签名身份验证未启动并运行(或不可用),则可以使用ad-hoc签名.这些应用程序始终可以通过静态信任缓存进行验证,无论您的证书存储库是否已被清除或类似.

实际上,创建临时签名二进制文件对Apple开发人员来说只具有实用价值.

您可以在Apple的开发人员部分找到关于临时签名的小文档.例如:

https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc

但您也可以在codeign实用程序本身的源代码中找到文档片段,也可以在libsecurity的源代码中找到.

转载注明原文:macos – ad-hoc代码签名的限制是什么? - 代码日志