Comment macOS identifie-t-il l'état de signature d'une application téléchargée sur Internet?

8

J'ai téléchargé une application sur Internet à l'aide de Safari. Lors de son exécution, macOS notifie que l'application provient d'un développeur non identifié.

Comment macOS peut-il déterminer ces informations? Où sont stockées les métadonnées de signature d'une application?

Novellizator
la source
Si je comprends votre question, vous recevez cette alerte car une application que vous avez téléchargée dans Safari n'a pas été signée par un développeur connu d'Apple. Demandez-vous où se trouve le programme xyz sur votre ordinateur?
Jake3231

Réponses:

13

Les informations sont stockées dans des attributs étendus, avec des informations supplémentaires potentiellement intégrées dans une application.

Attributs étendus

Ces informations de quarantaine sont stockées en tant qu'attribut étendu . Utilisez l' xattroutil pour afficher les attributs associés à un fichier ou une application.

L'attribut à l'origine de ce message est com.apple.quarantine.

Voir Comment supprimer les «attributs étendus» d'un fichier sous Mac OS X? et l' application ne peut pas être ouverte, car elle provient d'un développeur non identifié pour plus de détails.

Gatekeeper et signatures de code

L'attribut étendu est utilisé par Gatekeeper sur macOS et est expliqué dans Comment définir (restaurer) l'attribut com.apple.quarantine?

Une signature numérique facultative intégrée à une application est utilisée pour déterminer le développeur de l'application. Si aucune signature n'est trouvée, macOS présente l'application comme provenant d'un développeur non identifié.

Graham Miln
la source
5
Ce n'est pas tout à fait correct. Les données de quarantaine sont utilisées pour suivre la source d'un fichier téléchargé, mais la signature est ailleurs.
duskwuff -inactive-
1
@duskwuff est correct. La mise en quarantaine provoque le popup "XXX a été téléchargé à partir d'Internet, êtes-vous sûr de vouloir l'ouvrir?"
Barmar
1
Tous les fichiers et applications ne sont pas signés par code. De nombreuses applications ne le sont pas, donc dans ces cas, aucune signature intégrée n'existe. Ce sera le cas pour les messages "développeur non identifié".
Graham Miln
7

En fait, le message "développeur non identifié ..." est le résultat d'une combinaison des deux tâches: vérification de l'attribut com.apple.quarantine et des ressources de signature de code (dans * / Contents / _CodeSignature / CodeResources) alors que l'état de signature réel est uniquement déterminé par * / CodeResources .

Vous pouvez obtenir l'attribut étendu en entrant:

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

Les informations de signature de code sont accessibles en entrant:

$ codesign -dvvv /Applications/*.app

Exemple:

$ 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 partie la plus importante est la chaîne de certificats (et la chaîne de confiance):

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

Ici, trois autorités différentes sont visibles:

  1. Certificat racine: Apple Root CA
  2. Certificat de développeur Apple intermédiaire: Autorité de certification ID développeur
  3. Certificat de développeur: Google, Inc. (EQHXZ8M8AV)

Cela signifie que l'application est signée avec un certificat de développeur, publié et signé par l'autorité de développement intermédiaire d'Apple, qui est elle-même publiée et signée par l'autorité de certification racine d'Apple.

Cette chaîne qualifie Google (ou plus exactement: l'équipe / l'unité Google, Inc. (EQHXZ8M8AV)) en tant que développeur identifié par Apple.

Vous pouvez également coder des applications vous-même ou avec un certificat de signature de code d'une autre autorité intermédiaire / racine, mais cela ne surmontera pas Gatekeeper.

Maintenant, quatre permutations sont possibles en supposant que Gatekeeper est activé (mais ne considère pas l'auto-signature / la signature extraterrestre):

  • Aucun attribut com.apple.quarantine / aucun certificat de développeur Apple (exemple: brew cask installé Apache CouchDB )
  • Aucun attribut com.apple.quarantine / un certificat de développeur Apple (exemple: brew cask installé Google Chrome )
  • Un attribut com.apple.quarantine / aucun certificat de développeur Apple (exemple: Apache CouchDB installé en téléchargeant le zip à partir du site Web et en copiant l'application décompressée dans / Applications / )
  • Un attribut com.apple.quarantine / un certificat de développeur Apple (Exemple: Google Chrome installé en téléchargeant le dmg depuis le site Web et en copiant l'application à l'intérieur dans / Applications / )

Dans les deux premiers cas, l'application se lancera simplement. Dans le troisième cas, vous obtiendrez le message Développeur non identifié . Vous pouvez résoudre ce problème en supprimant l'attribut étendu xattr -d com.apple.quarantine *(= cas 1). Dans le quatrième cas, vous obtiendrez le "* a été téléchargé sur Internet, êtes-vous sûr de vouloir l'ouvrir?"

klanomath
la source
5

Comment macOS peut-il déterminer ces informations? Où sont stockées les métadonnées de signature d'une application?

La signature est stockée dans le binaire d'application lui-même, avec quelques données supplémentaires dans le bundle d'application (dans le fichier Contents/_CodeSignature/CodeResources).

Vous pouvez obtenir des informations sur la signature à l'aide de l'utilitaire de ligne de commande codesign- par exemple:

# 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 -inactif-
la source