Quelles sont les restrictions de la signature de code ad hoc?

14

Il est possible de signer du code ou des applications "ad-hoc" à l'aide codesign. La page de manuel nous dit ce qui suit sur la signature de code ad hoc:

Si l'identité est la lettre unique "-" (tiret), une signature ad hoc est effectuée. La signature ad hoc n'utilise pas du tout d'identité et identifie exactement une instance de code. Des restrictions importantes s'appliquent à l'utilisation de code signé ad hoc; consultez la documentation avant de l'utiliser.

(Souligné par moi)

Je voulais en savoir plus et j'ai essayé de trouver cette documentation, mais je n'ai trouvé aucun détail. J'ai trouvé une note technique intitulée "Signature du code macOS en profondeur" , mais elle ne mentionne pas du tout la signature ad hoc.

Quelles sont ces «restrictions importantes» et où sont-elles documentées?

not2savvy
la source

Réponses:

9

Fondamentalement, la signature ad hoc dans ce contexte signifie que le binaire est signé sans aucune preuve cryptographique.

En principe, les binaires sont normalement signés en ajoutant un soi-disant CMS (un message cryptographique) où le hachage de CodeDirectory est le message signé par l'identité de signature. Cela signifie qu'un étranger peut vérifier que le code a bien été signé par une personne détenant la clé privée de cette identité.

Lors de l'exécution de programmes, le système macOS peut vérifier que ces signatures sont valides et qu'il approuve l'identité de signature - et si c'est le cas, exécutez le programme. Ce sont les bases de la fonctionnalité GateKeeper.

Les binaires signés ad-hoc sont très différents car ils ne contiennent pas de tels CMS. Au lieu de cela, il contient simplement la valeur de hachage SHA-1 du CodeDirectory sans aucune preuve cryptographique de sa validité, et aucun chemin de certificats / identités à vérifier.

Le CodeDirectory est un objet qui décrit une instance particulière de code statique en ayant des valeurs de hachage pour différents morceaux de code à partir desquels l'application est créée. En vous assurant que CodeDirectory n'est pas altéré en vérifiant la signature cryptographique et que les différents bits de code de l'application correspondent aux valeurs de hachage stockées dans le répertoire, vous pouvez vérifier que le code n'a pas été altéré.

Sans la preuve cryptographique, ce contrôle "non altéré" ne peut pas être effectué de manière normale.

Au lieu de cela, les binaires signés ad-hoc sont vérifiés en comparant la valeur de hachage SHA-1 à une liste de valeurs de hachage "bonnes connues" stockées dans le cache d'approbation statique à l'intérieur du noyau.

Essentiellement, cela signifie que les «restrictions importantes» imposées à toute demande que vous signez vous-même ad hoc est qu'elle ne passera aucun type de vérification nulle part. Ce sera fondamentalement la même chose qu'un binaire non signé.

Cependant, si vous êtes Apple, vous pouvez créer des applications qui ne sont pas signées de code de la manière habituelle et qui sont à la place explicitement approuvées par le noyau. C'est-à-dire si, par exemple, Apple veut s'assurer qu'une application n'est pas altérée lorsqu'elle est exécutée à un stade précoce du démarrage du système où la vérification complète de l'identité de signature n'est pas opérationnelle (ou n'est pas disponible), elle peut utiliser la signature ad hoc. Ces applications peuvent toujours être vérifiées par le cache de confiance statique, que votre référentiel de certificats soit connecté ou autre.

Dans la pratique, la création de fichiers binaires signés ad hoc n'a qu'une valeur pratique pour les développeurs Apple.

Vous pouvez trouver une documentation mineure sur la signature ad hoc dans la section développeur d'Apple. Par exemple:

https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc

Mais vous pouvez également trouver des extraits de documents dans le code source de l'utilitaire codesign lui-même et dans le code source de libsecurity.

jksoegaard
la source
Est-ce que "uniquement utile pour les développeurs Apple" signifie "uniquement pour les développeurs travaillant chez Apple" ou "uniquement pour les développeurs travaillant sur les plates-formes Apple"? Vraiment curieux, car nous avons commencé à avoir un nouveau problème où le trousseau ne peut pas trouver la clé même lorsque le nom est correct, et nous envisageons de passer au trait d'union pour les versions non publiées.
Trejkaz
1
Désigne uniquement les développeurs travaillant chez Apple.
jksoegaard
Notez que le simulateur iOS utilise également la signature adhoc. La signature ad hoc peut être d'une certaine utilité pour les développeurs en dehors d'Apple pour permettre à l'application de demander des droits, ce qui, je ne suis pas sûr, est possible sans signature de code (tous les documents que j'ai vus pointent vers non). Sur Mac, ce n'est généralement pas un problème, mais sur iOS, de nombreuses fonctionnalités sont bloquées derrière les droits, donc tester que cela fonctionne correctement est souhaitable pour les développeurs iOS.
milch
@milch Vous mélangez deux concepts sans rapport - "signature adhoc" (qui était le sujet de cette question) et "distribution adhoc" (qui est ce que les développeurs iOS utilisent souvent et concernent les droits, etc.)
jksoegaard
Je suis presque sûr que les versions de simulateur sont signées adhoc (non distribuées). Vous pouvez vérifier en inspectant une application iOS conçue pour le simulateur avec codesign -dv --verbose=4 /path/to/the.app. Vous obtiendrez une ligne disant Signature=adhoc, qui semble indiquer une signature adhoc. Les autres clés qui sont généralement présentes dans une application iOS régulièrement signée sont notamment absentes, telles que AuthorityandTeamIdentifier
milch