Básicamente, la firma ad-hoc en este contexto significa que el binario está firmado sin ninguna prueba criptográfica.
En esencia, normalmente los binarios se firman agregando un llamado CMS (un mensaje criptográfico) donde el hash de CodeDirectory es el mensaje firmado por la identidad de firma. Esto significa que un extraño puede verificar que el código fue firmado por alguien que tiene la clave privada para esa identidad.
Al ejecutar programas, el sistema macOS puede verificar que estas firmas son válidas y que confía en la identidad de firma, y si lo hace, ejecute el programa. Esto es lo básico de la funcionalidad GateKeeper.
Los binarios firmados ad-hoc son muy diferentes, ya que no contienen dicho CMS. En cambio, simplemente contiene el valor hash SHA-1 de CodeDirectory sin ninguna prueba criptográfica de su validez, y sin ruta de certificados / identidades para verificar.
CodeDirectory es un objeto que describe una instancia particular de código estático al tener valores hash para varios fragmentos de código de los que está hecha la aplicación. Al asegurarse de que CodeDirectory no tenga restricciones verificando la firma criptográfica y que los diversos bits de código de la aplicación coincidan con los valores hash almacenados en el directorio, puede asegurarse de que el código no haya sido alterado.
Sin la prueba criptográfica, esta verificación "sin control" no se puede realizar de la manera normal.
En su lugar, los binarios firmados ad-hoc se verifican comparando el valor hash SHA-1 con una lista de valores hash "conocidos buenos" almacenados en la caché de confianza estática dentro del núcleo.
En esencia, esto significa que las "restricciones significativas" impuestas a cualquier aplicación que usted ad-hoc firme es que no pasará ningún tipo de verificación en ningún lado. Básicamente será lo mismo que un binario sin signo.
Sin embargo, si usted es Apple, puede crear aplicaciones que no estén codificadas de la manera ordinaria, y en su lugar el núcleo confíe explícitamente en ellas. Es decir, si, por ejemplo, Apple quiere asegurarse de que una aplicación no tenga restricciones cuando se ejecuta en una etapa temprana del inicio del sistema, donde la verificación de identidad de firma completa no está en funcionamiento (o no está disponible), puede usar la firma ad-hoc. El caché de confianza estático siempre puede verificar estas aplicaciones, sin importar si su depósito de certificados está alojado o algo así.
En la práctica, la creación de binarios firmados ad-hoc solo tiene valor práctico para los desarrolladores de Apple.
Puede encontrar documentación menor sobre la firma ad-hoc en la sección de desarrolladores de Apple. Por ejemplo:
https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc
Pero también puede encontrar fragmentos de documentos en el código fuente de la propia utilidad de firma de códigos y en el código fuente de libsecurity.
codesign -dv --verbose=4 /path/to/the.app
. Volverá una línea que diceSignature=adhoc
, que parece indicar una firma ad hoc. Notablemente ausentes están otras claves que generalmente están presentes en una aplicación iOS firmada regularmente, comoAuthority
yTeamIdentifier