Когда приложения имеют кодовую подпись, какие части пакета .app охватывает подпись?

13

В Mountain Lion я знаю, что некоторые приложения, включая все приложения в Mac App Store, имеют цифровую подпись разработчика, поэтому, если они будут изменены, подпись не будет совпадать, и это вызовет всевозможные ошибки (и ситуацию будет увеличиваться со следующим выпуском операционной системы ...).

У меня вопрос, какие части пакета .app охватывает подпись? Если что - либо в Appname.app/Contentsизменениях (включая метаданные, как модифицированную дату для Contentsпапки), делает это сломать подпись? Это просто двоичный файл Contents/MacOS? Включены ли в подпись .plists? Resources? Как конечный пользователь, что я могу взломать (если что-нибудь), не нарушая подпись?

Даниэль
источник
Похоже, вам нужно начать тестирование, и сообщите нам!
Адам Дэвис
Я могу, и если никто не знает ответ, я узнаю, но если кто-то уже проверял, мне не нужно изобретать велосипед.
Даниил
1
Это колесо может полностью использовать некоторые улучшения, хотя. Я думаю, что хромовые блесны необходимы, с одной стороны.
Адам Дэвис

Ответы:

14

TL; DR Разработчик должен выбрать, какие части приложения подписаны и не приводит к вмешательству в эти части какие-либо действия при запуске приложения. Вы должны использовать метод проб и ошибок, чтобы выяснить это для каждого отдельного приложения.

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

В руководстве для разработчиков Apple сказано следующее:

Вы должны подписать каждый исполняемый файл в вашем продукте, включая приложения, инструменты, скрытые вспомогательные инструменты, утилиты и так далее. Подписание пакета приложения охватывает его ресурсы, но не его подкомпоненты, такие как инструменты и под-пакеты. Каждый из них должен быть подписан независимо.

Если ваше приложение состоит из большой части пользовательского интерфейса с одним или несколькими маленькими вспомогательными инструментами, которые пытаются представить пользователю одно лицо, вы можете сделать их неотличимыми для подписи кода, предоставив им все один и тот же идентификатор подписи кода. (Это можно сделать, убедившись, что все они имеют одинаковое значение CFBundleIdentifier в их Info.plist, или с помощью параметра -i в команде codeignign назначить один и тот же идентификатор.) В этом случае все компоненты вашей программы имеют получить доступ к тем же элементам цепочки для ключей и проверить, что и та же программа. Делайте это только в том случае, если участвующие программы действительно предназначены для формирования единого объекта без каких-либо различий.

Универсальный двоичный файл (пакет или инструмент) автоматически имеет индивидуальные подписи, применяемые к каждому компоненту архитектуры. Они независимы, и обычно проверяется только собственная архитектура в системе конечного пользователя.

В случае пакетов установки (пакетов .pkg и .mpkg) все неявно подписано: архив CPIO, содержащий полезную нагрузку, архив CPIO, содержащий сценарии установки, и спецификацию материалов, каждый из которых имеет хэш, записанный в XAR заголовок, и этот заголовок в свою очередь подписан. Поэтому, если вы измените скрипт установки (например) после подписания пакета, подпись будет недействительной.

Вы также можете подписать свои плагины и библиотеки. Хотя в настоящее время это не требуется, это будет в будущем, и нет недостатка в наличии подписей на этих компонентах.

В зависимости от ситуации CodeSign может добавить в ваш исполняемый файл Mach-O, добавить в него расширенные атрибуты или создать новые файлы в каталоге Contents вашего комплекта. Ни один из ваших других файлов не изменяется.

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

Система или программа, которая запускает или загружает подписанный код, решает, проверять ли подпись и, если это так, определять, как оценивать результаты этой проверки.

Приложение может разрешить изменения.

Ваша лучшая ставка - это метод проб и ошибок с любым приложением, которое вы пытаетесь изменить. Это может сработать, а может и нет. Нет всегда верного ответа, который можно дать.

Если приложение было подписано, вы можете найти Contents/CodeResourcesфайл или Contents/_CodeSignature/CodeResourcesфайл в комплекте. В этом файле перечислены все подписанные компоненты и их ожидаемые значения хеш-функции в комплекте. Это хорошее место, чтобы начать понимать, какие части приложения разработчик считает достаточно критичными, чтобы следить за изменениями.

Ян С.
источник