Каковы ограничения для специальной подписи кода?

14

Можно подписать код или приложения "ad-hoc", используя codesign. Страница man рассказывает нам о специальной подписи кода:

Если в качестве идентификатора используется одна буква «-» (тире), выполняется специальная подпись. Специальная подпись вообще не использует идентификационные данные и идентифицирует ровно один экземпляр кода. Существенные ограничения применяются к использованию специального подписанного кода; обратитесь к документации перед использованием.

(Акцент добавлен мной)

Я хотел узнать больше и попытался найти указанную документацию, но не смог найти никаких подробностей. Я нашел техническую заметку под названием «Глубина входа в код для macOS» , но в ней вообще не упоминается временная подпись.

Что это за «существенные ограничения» и где они документированы?

not2savvy
источник

Ответы:

9

По сути, специальная подпись в этом контексте означает, что двоичный файл подписан без каких-либо криптографических доказательств вообще.

По существу, двоичные файлы обычно подписываются путем добавления так называемой CMS (криптографическое сообщение), где хэш CodeDirectory - это сообщение, которое подписано удостоверением подписи. Это означает, что посторонний может убедиться, что код действительно был подписан кем-то, кто держит закрытый ключ для этой личности.

При запуске программ система macOS может проверить, что эти подписи действительны, и что она доверяет удостоверению подписи - и если это так, запустите программу. Это основы функциональности GateKeeper.

Специальные подписанные двоичные файлы сильно отличаются, поскольку они не содержат таких CMS. Вместо этого он просто содержит значение хеш-кода SHA-1 CodeDirectory без какого-либо криптографического доказательства его достоверности и не содержит пути сертификатов / идентификаторов для проверки.

CodeDirectory - это объект, который описывает конкретный экземпляр статического кода, имея хеш-значения для различных частей кода, из которых сделано приложение. Убедившись, что CodeDirectory не изменен путем проверки криптографической подписи и что различные биты кода приложения соответствуют значениям хеш-функции, хранящимся в каталоге, вы можете убедиться, что код не был подделан.

Без криптографического доказательства эта «нетронутая» проверка не может быть выполнена обычным способом.

Вместо этого проверяются специальные двоичные файлы со знаком, сравнивая хеш-значение SHA-1 со списком «известных хороших» хеш-значений, хранящихся в статическом доверительном кеше внутри ядра.

По сути, это означает, что «существенные ограничения», налагаемые на любое приложение, которое вы сами подписываете, заключаются в том, что оно нигде не пройдет никакой проверки. Это в основном то же самое, что и не подписанный двоичный файл.

Однако, если вы Apple, вы можете создавать приложения, которые не имеют кодовой подписи обычным способом, а вместо этого явно доверяются ядру. Т.е. если, например, Apple хочет убедиться, что приложение не нарушено при запуске на ранней стадии запуска системы, когда полная проверка подлинности подписи не запущена (или недоступна), они могут использовать специальную подпись. Эти приложения всегда могут быть проверены статическим кешем доверия, независимо от того, хранится ли хранилище сертификатов или что-то в этом роде.

На практике создание специально подписанных двоичных файлов имеет практическую ценность только для разработчиков Apple.

Вы можете найти небольшую документацию по специальной подписи в разделе для разработчиков Apple. Например:

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

Но вы также можете найти фрагменты документов в исходном коде самой утилиты codeign и в исходном коде libsecurity.

jksoegaard
источник
Означает ли здесь «только практическую ценность для разработчиков Apple», «только для разработчиков, работающих в Apple», или «только для разработчиков, работающих на платформах Apple»? Искренне любопытно, поскольку у нас появилась новая проблема, когда цепочка для ключей не может найти ключ, даже если имя указано правильно, и мы рассматриваем возможность перехода на дефис для сборок без релиза.
Трейказ
1
Имеется в виду только для разработчиков, работающих в Apple.
jksoegaard
Обратите внимание, что симулятор iOS также использует подпись adhoc. Подписание Adhoc может быть полезным для разработчиков за пределами Apple, так как оно позволяет приложению запрашивать разрешения, что, я не уверен, возможно без подписи кода (все документы, которые я видел, указывают на отсутствие). На Mac это обычно не проблема, но на iOS многие функции ограничены правами, поэтому тестирование на правильность этой работы желательно для разработчиков iOS.
дойное
@milch Вы смешиваете две несвязанные концепции - «подпись adhoc» (о чем этот вопрос) и «распространение adhoc» (о том, что разработчик iOS часто использует и касается прав и т. д.)
jksoegaard
Я почти уверен, что сборки симуляторов имеют временную подпись (не распространяется). Вы можете проверить это, просмотрев приложение для iOS, созданное для симулятора codesign -dv --verbose=4 /path/to/the.app. Вы получите строку с надписью Signature=adhoc, которая, кажется, указывает на временную подпись. В частности отсутствует другие ключи , которые обычно присутствуют в регулярно подписанном приложении IOS, такие как AuthorityиTeamIdentifier
Мильй