Básicamente, la firma ad hoc en este contexto significa que el binario se firma sin ninguna prueba criptográfica.
En esencia, normalmente los binarios se firman añadiendo un llamado CMS (un mensaje criptográfico) en el que el hash del CodeDirectory es el mensaje que firma la identidad firmante. Esto significa que una persona ajena puede verificar que el código fue efectivamente firmado por alguien que posee la clave privada de esa identidad.
Al ejecutar programas, el sistema MacOS puede verificar que estas firmas son válidas y que confía en la identidad firmante, y si lo hace, ejecuta el programa. Esto es lo básico de la funcionalidad de GateKeeper.
Los binarios firmados ad hoc son muy diferentes, ya que no contienen dicho CMS. En su lugar, simplemente contiene el valor hash SHA-1 del CodeDirectory sin ninguna prueba criptográfica de su validez, y ninguna ruta de certificados/identidades para verificar.
El CodeDirectory es un objeto que describe una instancia particular de código estático al tener valores hash para varias piezas de código de las que está hecha la aplicación. Al asegurar que el CodeDirectory no ha sido manipulado, verificando la firma criptográfica, y que los distintos trozos de código de la aplicación coinciden con los valores hash almacenados en el directorio, se puede comprobar que el código no ha sido manipulado.
Sin la prueba criptográfica, esta comprobación "no manipulada" no puede realizarse de forma normal.
En cambio, los binarios firmados ad hoc se comprueban comparando el valor hash SHA-1 con una lista de valores hash "buenos conocidos" 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 firmes tú mismo ad-hoc es que no pasará ningún tipo de verificación en ningún sitio. Básicamente será lo mismo que un binario no firmado.
Sin embargo, si eres Apple, puedes crear aplicaciones que no estén codificadas de la manera ordinaria, y que en cambio sean explícitamente confiables para el kernel. Es decir, si, por ejemplo, Apple quiere asegurarse de que una aplicación no sea manipulada cuando se ejecuta en una fase temprana del inicio del sistema en la que la verificación de la identidad de la firma completa no está en marcha (o no está disponible), puede utilizar la firma ad-hoc. Estas aplicaciones siempre pueden ser verificadas por la caché de confianza estática, sin importar si su repositorio de certificados está estropeado o algo por el estilo.
En la práctica, la creación de binarios firmados ad hoc sólo 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 se pueden encontrar fragmentos de documentos en el código fuente de la propia utilidad codesign, y en el código fuente de libsecurity.