Как macOS определяет статус подписи приложения, загруженного из Интернета?

8

Я загрузил приложение из Интернета с помощью Safari. После его запуска macOS уведомляет, что приложение от неизвестного разработчика.

Как macOS может определить эту информацию? Где хранятся метаданные подписи для приложения?

Novellizator
источник
Если я понимаю ваш вопрос, вы получаете это предупреждение, потому что приложение, загруженное в Safari, не было подписано разработчиком, известным Apple. Вы спрашиваете, где программа xyz находится на вашем компьютере?
Jake3231,

Ответы:

13

Информация хранится в расширенных атрибутах, а дополнительная информация может быть встроена в приложение.

Расширенные атрибуты

Эта информация о карантине хранится как расширенный атрибут . Используйте xattrинструмент для просмотра атрибутов, связанных с файлом или приложением.

Атрибут, вызывающий это сообщение com.apple.quarantine.

См. Как удалить «расширенные атрибуты» для файла в Mac OS X? и приложение не может быть открыто, потому что оно от неизвестного разработчика для более подробной информации.

Гейткипер и кодовые подписи

Расширенный атрибут используется Gatekeeper в macOS и обсуждается в разделе Как установить (восстановить) атрибут com.apple.quarantine?

Дополнительная цифровая подпись, встроенная в приложение, используется для определения разработчика приложения. Если подпись не найдена, macOS представляет приложение от неизвестного разработчика.

Грэм Милн
источник
5
Это не совсем правильно. Данные карантина используются для отслеживания источника загруженного файла, но подпись находится в другом месте.
duskwuff -неактив-
1
@duskwuff правильно. Карантин вызывает всплывающее окно "XXX был загружен из Интернета, вы уверены, что хотите открыть его?"
Бармар
1
Не все файлы и приложения имеют кодовую подпись. Многих приложений нет, поэтому в этих случаях нет встроенной подписи. Это будет иметь место для сообщений «неопознанного разработчика».
Грэм Милн
7

Фактически сообщение «Неопознанный разработчик ...» является результатом сочетания обеих задач: проверки атрибута com.apple.quarantine и ресурсов для подписи кода (в * / Contents / _CodeSignature / CodeResources), в то время как фактический статус подписи равен определяется исключительно * / CodeResources .

Вы можете получить расширенный атрибут, введя:

$ xattr -p com.apple.quarantine /Applications/*.app

Доступ к информации для подписи кода осуществляется путем ввода:

$ codesign -dvvv /Applications/*.app

Пример:

$ codesign -dvvvv /Applications/Google\ Chrome.app/
Executable=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Identifier=com.google.Chrome
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=273 flags=0x800(restrict) hashes=3+3 location=embedded
OSPlatform=36
OSSDKVersion=658432
OSVersionMin=657664
Hash type=sha256 size=32
CandidateCDHash sha1=bc8e3dffe7d9d5242e09ea80a220ed365d46fdf2
CandidateCDHash sha256=d7ae6211906bb17d593ce9c215d190a81f37e658
Hash choices=sha1,sha256
Page size=4096
CDHash=d7ae6211906bb17d593ce9c215d190a81f37e658
Signature size=8949
Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=20. Mar 2018 at 07:23:20
Info.plist entries=36
TeamIdentifier=EQHXZ8M8AV
Sealed Resources version=2 rules=7 files=203
Internal requirements count=1 size=240

Наиболее важной частью является цепочка сертификатов (и цепочка доверия):

Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA

Здесь видны три разных авторитета:

  1. Корневой сертификат: Apple Root CA
  2. Промежуточный сертификат разработчика Apple: Центр сертификации ID разработчика
  3. Сертификат разработчика: Google, Inc. (EQHXZ8M8AV)

Это означает, что приложение подписано сертификатом разработчика, опубликовано и подписано промежуточным органом Apple по разработке, который сам публикуется и подписывается корневым центром сертификации Apple.

Эта цепочка квалифицирует Google (или точнее: команду / подразделение Google, Inc. (EQHXZ8M8AV)) как разработчика, идентифицированного Apple.

Вы также можете кодировать приложения либо самостоятельно, либо с помощью сертификата кодирования от другого промежуточного / корневого органа, но это не побеждает Gatekeeper.

Теперь возможны четыре перестановки при условии, что включен Gatekeeper (но без учета самоподписания / подписи пришельцев):

  • Нет атрибута com.apple.quarantine / нет сертификата Apple Developer (Пример: установлен бочковый бочонок Apache CouchDB )
  • Нет атрибута com.apple.quarantine / сертификата Apple Developer (пример: установлен Google Chrome для brew cask )
  • Атрибут com.apple.quarantine / сертификат Apple Developer отсутствует (пример: Apache CouchDB устанавливается путем загрузки zip-файла с веб-сайта и копирования разархивированного приложения в / Applications / )
  • Атрибут com.apple.quarantine / сертификат разработчика Apple (пример: Google Chrome устанавливается путем загрузки dmg с веб-сайта и копирования приложения в / Applications / )

В первых двух случаях приложение просто запустится. В третьем случае вы получите сообщение Unindentified Developer . Вы можете решить эту проблему, удалив расширенный атрибут xattr -d com.apple.quarantine *(= case 1). В четвертом случае вы получите "* был загружен из Интернета, вы уверены, что хотите открыть его?"

klanomath
источник
5

Как macOS может определить эту информацию? Где хранятся метаданные подписи для приложения?

Подпись хранится в самом двоичном файле приложения с некоторыми дополнительными данными в комплекте приложения (в файле Contents/_CodeSignature/CodeResources).

Вы можете получить некоторую информацию о подписи, используя утилиту командной строки codesign- например:

# codesign -dv /Applications/Preview.app
Executable=/Applications/Preview.app/Contents/MacOS/Preview
Identifier=com.apple.Preview
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=21314 flags=0x0(none) hashes=659+5 location=embedded
Platform identifier=4
Signature size=4485
Info.plist entries=35
TeamIdentifier=not set
Sealed Resources version=2 rules=13 files=2077
Internal requirements count=1 size=68
сумеречный
источник