Como o macOS identifica o status de assinatura de um aplicativo baixado da Internet?

8

Eu baixei um aplicativo da Internet usando o Safari. Ao executá-lo, o macOS notifica que o aplicativo é de um desenvolvedor não identificado.

Como o macOS é capaz de determinar essas informações? Onde estão armazenados os metadados de assinatura de um aplicativo?

Novellizator
fonte
Se entendi sua pergunta, você está recebendo este alerta porque um aplicativo que você baixou no Safari não foi assinado por um desenvolvedor conhecido pela Apple. Você está perguntando onde o programa xyz está localizado no seu computador?
precisa saber é o seguinte

Respostas:

13

As informações são armazenadas em atributos estendidos, com informações adicionais potencialmente incorporadas a um aplicativo.

Atributos estendidos

Essas informações de quarentena são armazenadas como um atributo estendido . Use a xattrferramenta para visualizar os atributos associados a um arquivo ou aplicativo.

O atributo que está causando esta mensagem é com.apple.quarantine.

Consulte Como removo os "atributos estendidos" em um arquivo no Mac OS X? e o aplicativo não pode ser aberto porque é de um desenvolvedor não identificado para mais detalhes.

Gatekeeper e assinaturas de código

O atributo estendido é usado pelo Gatekeeper no macOS e é discutido em Como definir (restaurar) o atributo com.apple.quarantine?

Uma assinatura digital opcional incorporada a um aplicativo é usada para determinar o desenvolvedor do aplicativo. Se uma assinatura não for encontrada, o macOS apresentará o aplicativo como sendo de um desenvolvedor não identificado.

Graham Miln
fonte
5
isto não está correto. Os dados de quarentena são usados ​​para rastrear a origem de um arquivo baixado, mas a assinatura está em outro lugar.
duskwuff -inactive-
11
@duskwuff está correto. A quarentena causa o pop-up "XXX foi baixado da Internet, você tem certeza de que deseja abri-lo?"
Barmar
11
Nem todos os arquivos e aplicativos têm código assinado. Muitos aplicativos não são, portanto, nesses casos, não existe assinatura incorporada. Este será o caso das mensagens "desenvolvedor não identificado".
Graham Miln
7

De fato, a mensagem "Desenvolvedor não identificado ..." é o resultado de uma combinação das duas tarefas: verificar o atributo com.apple.quarantine e os recursos de assinatura de código (em * / Contents / _CodeSignature / CodeResources) enquanto o status de assinatura real é determinado exclusivamente por * / CodeResources .

Você pode obter o atributo estendido digitando:

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

As informações de assinatura de código são acessadas digitando:

$ codesign -dvvv /Applications/*.app

Exemplo:

$ 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

A parte mais importante é a cadeia de certificados (e a cadeia de confiança):

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

Aqui três autoridades diferentes são visíveis:

  1. Certificado raiz: CA raiz da Apple
  2. Certificado intermediário de desenvolvedor da Apple: Autoridade de certificação de ID do desenvolvedor
  3. Certificado de desenvolvedor: Google, Inc. (EQHXZ8M8AV)

Isso significa que o aplicativo é assinado com um certificado de desenvolvedor, publicado e assinado pela autoridade intermediária de desenvolvedor da Apple, que é publicada e assinada pela CA raiz da Apple.

Essa cadeia qualifica o Google (ou mais exatamente: a equipe / unidade Google, Inc. (EQHXZ8M8AV)) como um desenvolvedor identificado pela Apple.

Você também pode codificar aplicativos por conta própria ou com um certificado de codificação de código de outra autoridade intermediária / raiz, mas isso não superará o Gatekeeper.

Agora são possíveis quatro permutações, supondo que o Gatekeeper esteja ativado (mas sem considerar a autoassinatura / assinatura alienígena):

  • Nenhum atributo com.apple.quarantine / nenhum certificado de desenvolvedor da Apple (exemplo: barril de fermentação instalado Apache CouchDB )
  • Nenhum atributo com.apple.quarantine / certificado de desenvolvedor da Apple (exemplo: brew cask instalado no Google Chrome )
  • Um atributo com.apple.quarantine / nenhum certificado de desenvolvedor da Apple (exemplo: Apache CouchDB instalado baixando o zip do site e copiando o aplicativo descompactado para / Aplicativos / )
  • Um atributo com.apple.quarantine / um certificado de desenvolvedor da Apple (exemplo: Google Chrome instalado baixando o dmg do site e copiando o aplicativo dentro de / Applications / )

Nos dois primeiros casos, o aplicativo será iniciado simplesmente. No terceiro caso, você receberá a mensagem Unindentified Developer . Você pode resolver isso removendo o atributo estendido xattr -d com.apple.quarantine *(= case 1). No quarto caso, você receberá o "* foi baixado da Internet, tem certeza de que deseja abri-lo?"

Klanomath
fonte
5

Como o macOS é capaz de determinar essas informações? Onde estão armazenados os metadados de assinatura de um aplicativo?

A assinatura é armazenada no próprio binário do aplicativo, com alguns dados adicionais no pacote de aplicativos (no arquivo Contents/_CodeSignature/CodeResources).

Você pode obter algumas informações sobre a assinatura usando o utilitário de linha de comando codesign- por exemplo:

# 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
duskwuff -inactive-
fonte