¿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?

Novellizator
fuente
Si entiendo su pregunta, recibirá esta alerta porque una aplicación que descargó en Safari no fue firmada por un desarrollador conocido por Apple. ¿Estás preguntando dónde se encuentra el programa xyz en tu computadora?
Jake3231

Respuestas:

13

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

Atributos extendidos

Esta información de cuarentena se almacena como un atributo extendido . Use la xattrherramienta 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" en un archivo en Mac OS X? y la aplicación no se puede abrir porque es de un desarrollador no identificado para más detalles.

Gatekeeper y firmas de código

Gatekeeper utiliza el atributo extendido en macOS y se describe en Cómo configurar (restaurar) el atributo com.apple.quarantine?

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

Graham Miln
fuente
55
Esto no es muy correcto. Los datos de cuarentena se utilizan para rastrear la fuente de un archivo descargado, pero la firma está en otro lugar.
duskwuff -inactive-
1
@duskwuff es correcto. La cuarentena provoca la ventana emergente "XXX se descargó de Internet, ¿está seguro de que desea abrirlo?"
Barmar
1
No todos los archivos y aplicaciones tienen código firmado. Muchas aplicaciones no lo son, por lo que en esos casos no existe una firma incorporada. Este será el caso de los mensajes de "desarrollador no identificado".
Graham Miln
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 el estado de firma real es 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 desarrollo intermedia de Apple, que a su vez es publicada y firmada por la CA raíz de Apple.

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

También puede codificar aplicaciones 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 la firma automática / firma alienígena):

  • Sin atributo com.apple.quarantine / sin certificado de desarrollador de Apple (Ejemplo: brew cask instalado Apache CouchDB )
  • Sin atributo com.apple.quarantine / un certificado de desarrollador de Apple (Ejemplo: brew cask instaló Google Chrome )
  • Un atributo com.apple.quarantine / sin certificado de desarrollador de Apple (Ejemplo: Apache CouchDB instalado descargando el archivo 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 descargando el dmg del sitio web y copiando la aplicación en / Aplicaciones / )

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

klanomath
fuente
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 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
duskwuff -inactive-
fuente