¿Cómo identifica macOS el estado de firma de una aplicación descargada de Internet?

8

Descargué una aplicación de Internet usando Safari. Al ejecutarlo, macOS notifica que la aplicación es de un desarrollador no identificado.

¿Cómo puede macOS determinar esta información? ¿Dónde se almacenan los metadatos de firma para una aplicación?

    
pregunta Novellizator 04.04.2018 - 14:37

3 respuestas

13

La información se almacena dentro de atributos extendidos, con información adicional potencialmente incrustada dentro de una aplicación.

Atributos ampliados

Esta información de cuarentena se almacena como un atributo extendido . Use la herramienta xattr para ver los atributos asociados con un archivo o aplicación.

El atributo que causa este mensaje es com.apple.quarantine .

Consulte ¿Cómo elimino los "atributos extendidos" de un archivo en Mac OS X? y para más detalles.

Gatekeeper y firmas de código

El atributo extendido es usado por Gatekeeper en macOS y se explica en Cómo configurar (restaurar) el ¿Atributo com.apple.quarantine?

Se utiliza una firma digital opcional incrustada dentro de una aplicación para determinar el desarrollador de la aplicación. Si no se encuentra una firma, macOS presenta la aplicación como proveniente de un desarrollador no identificado.

    
respondido por el Graham Miln 04.04.2018 - 14:49
7

De hecho, el mensaje "Desarrollador no identificado ..." es el resultado de una combinación de ambas tareas: verificar el atributo com.apple.quarantine y los recursos de firma de código (en * / Contents / _CodeSignature / CodeResources) mientras que el estado real de la firma está determinado únicamente por * / CodeResources .

Puede obtener el atributo extendido ingresando:

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

Se accede a la información de firma de código ingresando:

$ codesign -dvvv /Applications/*.app

Ejemplo:

$ 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

La parte más importante es la cadena de certificados (y la cadena de confianza):

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

Aquí se ven tres autoridades diferentes:

  1. Certificado raíz: Apple Root CA
  2. Certificado de desarrollador de Apple intermedio: Autoridad de certificación de ID de desarrollador
  3. Certificado de desarrollador: Google, Inc. (EQHXZ8M8AV)

Esto significa que la aplicación está firmada con un certificado de desarrollador, publicado y firmado por la autoridad de desarrolladores intermedios de Apple, que a su vez está publicado y firmado por la CA raíz de Apple.

Esta cadena califica a Google (o más exactamente: el equipo / unidad Google, Inc. (EQHXZ8M8AV)) como un desarrollador identificado por Apple.

También puede codificar aplicaciones, ya sea usted mismo o con un certificado de firma de código de otra autoridad intermedia / raíz, pero esto no superará a Gatekeeper.

Ahora son posibles cuatro permutaciones, suponiendo que Gatekeeper esté habilitado (pero sin considerar autofirmación / firma ajena):

  • No hay atributo com.apple.quarantine / no hay certificado de desarrollador de Apple (Ejemplo: brew cask instalado Apache CouchDB )
  • Ningún atributo com.apple.quarantine / un certificado de desarrollador de Apple (Ejemplo: brew cask instalado Google Chrome )
  • Un atributo com.apple.quarantine / ningún certificado de desarrollador de Apple (Ejemplo: Se ha instalado Apache CouchDB descargando el zip del sitio web y copiando la aplicación descomprimida en / Aplicaciones / )
  • Un atributo com.apple.quarantine / un certificado de desarrollador de Apple (Ejemplo: Google Chrome instalado al descargar el dmg desde el sitio web y copiar la aplicación en / Aplicaciones / )

En los dos primeros casos, la aplicación simplemente se iniciará. En el tercer caso, recibirá el mensaje Unindentified Developer . Puede resolver esto eliminando el atributo extendido xattr -d com.apple.quarantine * (= caso 1). En el cuarto caso, obtendrá el "* se descargó de Internet, ¿está seguro de que desea abrirlo?"

    
respondido por el klanomath 04.04.2018 - 23:47
5
  

¿Cómo puede macOS determinar esta información? ¿Dónde se almacenan los metadatos de firma para una aplicación?

La firma se almacena dentro del propio binario de la aplicación, con algunos datos adicionales en el paquete de la aplicación (en el archivo Contents/_CodeSignature/CodeResources ).

Puede obtener información sobre la firma utilizando la utilidad de línea de comandos codesign , por ejemplo:

# 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
    
respondido por el duskwuff 04.04.2018 - 20:51

Lea otras preguntas en las etiquetas