¿Cuáles son las restricciones de la firma de código ad-hoc?

Es posible firmar código o aplicaciones "ad-hoc" usando codesign. La página de manual nos dice lo siguiente sobre la firma de código ad-hoc:

Si la identidad es la letra única "-" (guión), se realiza la firma ad-hoc. La firma ad-hoc no utiliza una identidad en absoluto e identifica exactamente una instancia de código. Se aplican restricciones significativas al uso de código firmado ad-hoc; consulte la documentación antes de usar esto.

(Énfasis añadido por mí)

Quería saber más y traté de encontrar dicha documentación, pero no pude encontrar ningún detalle. Encontré una nota técnica llamada "Firma de código macOS en profundidad" , pero no menciona la firma ad-hoc en absoluto.

¿Cuáles son estas "restricciones significativas" y dónde están documentadas?

Respuestas (1)

Básicamente, la firma ad-hoc en este contexto significa que el binario se firma sin ninguna prueba criptográfica.

En esencia, normalmente los archivos binarios se firman agregando un llamado CMS (un mensaje criptográfico) donde el hash de CodeDirectory es el mensaje que está firmado por la identidad de firma. Esto significa que una persona externa puede verificar que el código fue firmado por alguien que posee la clave privada de esa identidad.

Al ejecutar programas, el sistema macOS puede verificar que estas firmas sean válidas y que confíe en la identidad de la firma, y ​​si lo hace, ejecute el programa. Estos son los conceptos básicos de la funcionalidad de GateKeeper.

Los binarios firmados ad-hoc son muy diferentes ya que no contienen tal CMS. En su lugar, 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.

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 a partir de las cuales está hecha la aplicación. Si se asegura de que CodeDirectory no esté manipulado mediante la verificación de la firma criptográfica y de que los distintos 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 manipulado.

Sin la prueba criptográfica, esta verificación "no manipulada" no se puede realizar de la manera normal.

En su lugar, los archivos binarios firmados ad-hoc se comprueban comparando el valor hash SHA-1 con una lista de valores hash "bien conocidos" almacenados en la caché de confianza estática dentro del kernel.

En esencia, esto significa que las "restricciones significativas" impuestas a cualquier aplicación que usted mismo firme ad-hoc es que no pasará ningún tipo de verificación en ninguna parte. Básicamente es lo mismo que un binario sin firmar.

Sin embargo, si es Apple, puede crear aplicaciones que no están codiseñadas de la manera habitual y, en cambio, el kernel confía explícitamente en ellas. Es decir, si, por ejemplo, Apple quiere asegurarse de que una aplicación no se altere 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), pueden usar 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á enchufado o algo por el estilo.

En la práctica, la creación de archivos binarios ad-hoc firmados 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 codiseño y en el código fuente de libsecurity.

¿"Solo de valor práctico para los desarrolladores de Apple" aquí significa "solo para los desarrolladores que trabajan en Apple" o "solo para los desarrolladores que trabajan en las plataformas de Apple"? Genuinamente curioso, ya que comenzamos a tener un nuevo problema en el que el llavero no puede encontrar la clave, incluso cuando el nombre es correcto, y estamos considerando cambiar al guión para las compilaciones que no están disponibles.
Significa solo para desarrolladores que trabajan en Apple.
Tenga en cuenta que el simulador de iOS también utiliza la firma adhoc. La firma Adhoc puede ser útil para los desarrolladores fuera de Apple para permitir que la aplicación solicite derechos, lo que no estoy seguro de que sea posible sin una firma de código (todos los documentos que he visto indican que no). En la Mac, esto no suele ser un problema, pero en iOS, muchas funciones están protegidas por derechos, por lo que es deseable que los desarrolladores de iOS prueben que esto funciona correctamente.
@milch Está mezclando dos conceptos no relacionados: "firma adhoc" (que es de lo que se trataba esta pregunta) y "distribución adhoc" (que es lo que los desarrolladores de iOS suelen usar y concierne a los derechos, etc.)
Estoy bastante seguro de que las compilaciones del simulador están firmadas ad hoc (no distribuidas). Puede verificar inspeccionando una aplicación de iOS creada para el simulador con codesign -dv --verbose=4 /path/to/the.app. Obtendrá una línea que dice Signature=adhoc, que parece indicar una firma ad hoc. Notablemente ausentes están otras claves que normalmente están presentes en una aplicación de iOS firmada regularmente, como AuthorityyTeamIdentifier