临时代码签名有哪些限制?


14

可以使用来对代码或应用“临时”签名codesign。手册页告诉我们以下有关临时代码签名的信息:

如果标识是单个字母“-”(破折号),则执行临时签名。临时签名根本不使用身份,而是仅标识一个代码实例。临时签名代码的使用受到重大限制;使用前请查阅文档。

(重点由我添加)

我想了解更多并尝试查找上述文档,但找不到任何详细信息。我发现了一个技术说明“ macOS Code Signing In Depth”,但根本没有提到临时签名。

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

Answers:


9

在这种情况下,基本上即席签名意味着二进制文件的签名完全没有任何加密证明。

本质上,通常通过添加所谓的CMS(加密消息)来对二进制文件进行签名,其中CodeDirectory的哈希是由签名身份进行签名的消息。这意味着外来者可以验证代码是否确实由持有该身份专用密钥的某人签名。

在运行程序时,macOS系统可以验证这些签名是否有效,并且可以信任签名身份-如果存在,请运行该程序。这是GateKeeper功能的基础。

临时签名的二进制文件有很大的不同,因为它们不包含此类CMS。相反,它仅持有CodeDirectory的SHA-1哈希值,而没有任何加密证明其有效性,也没有验证依据的证书/身份的路径。

CodeDirectory是一个对象,它通过具有构成应用程序的各种代码的哈希值来描述静态代码的特定实例。通过验证密码签名来确保不对CodeDirectory进行篡改,并确保应用程序的各个代码位与目录中存储的哈希值匹配,您可以确定该代码未被篡改。

没有密码证明,这种“不受干扰”的检查将无法以正常方式执行。

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

从本质上讲,这意味着您对自己临时签名的任何应用程序施加的“重大限制”是,它不会在任何地方通过任何类型的验证。它基本上与无符号二进制文件相同。

但是,如果您是Apple,则可以创建不是以常规方式进行代码签名的应用程序,而是由内核显式信任的应用程序。即,例如,如果Apple想要确保在系统启动的早期阶段(完整签名身份验证未启动且未运行(或不可用))运行时不破坏应用程序,则可以使用临时签名。这些应用程序始终可以通过静态信任缓存来验证,无论您的证书存储库是软管连接还是类似的东西。

实际上,创建临时签名的二进制文件仅对Apple开发人员具有实际价值。

您可以在Apple的开发人员部分中找到有关临时签名的次要文档。例如:

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

但是,您也可以在codesign实用程序本身的源代码中以及libsecurity的源代码中找到文档的摘要。


这里的“仅对Apple开发人员具有实际价值”是指“仅对在Apple工作的开发人员”还是“仅对在Apple平台工作的开发人员”?真的很好奇,因为我们已经开始遇到一些新问题,即使名称正确,钥匙串也找不到钥匙,并且我们正在考虑针对非发行版使用连字符。
Trejkaz

1
仅适用于在Apple工作的开发人员。
jksoegaard '18年

请注意,iOS模拟器还使用即席签名。对于Apple以外的开发人员而言,临时签名对于使应用程序能够请求权利可能有一些用处,我不确定没有代码签名(我看到的所有文档都指向否)是否可以实现。在Mac上,这通常不是问题,但是在iOS上,许多功能都隐藏在权利后面,因此,对于iOS开发人员而言,测试此功能是否正常是理想的。
生乳

@milch您正在混淆两个不相关的概念-“临时签名”(这是这个问题的意思)和“临时分发”(iOS开发人员经常使用和关注权利等)
jksoegaard

我很确定模拟器构建是自组织签名的(未分发)。您可以通过检查使用模拟器构建的iOS应用进行检查codesign -dv --verbose=4 /path/to/the.app。您将返回一行Signature=adhoc,似乎表明是自组织签名。值得注意的是不存在其它的键通常存在以规则签署iPhone应用程序,如AuthorityTeamIdentifier
生乳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.