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

14

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 agregado por mí)

Quería saber más e intenté encontrar dicha documentación, pero no pude encontrar ningún detalle. He encontrado una nota técnica llamada "Profundidad de inicio de sesión de código de macOS" , pero no menciona en absoluto la firma ad-hoc.

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

not2savvy
fuente

Respuestas:

9

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.

jksoegaard
fuente
¿Significa "solo un valor práctico para los desarrolladores de Apple" aquí, "solo para desarrolladores que trabajan en Apple" o "solo para desarrolladores que trabajan en 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 sin lanzamiento.
Trejkaz
1
Significa solo para desarrolladores que trabajan en Apple.
jksoegaard
Tenga en cuenta que el simulador de iOS también utiliza la firma adhoc. La firma adhoc puede ser útil para desarrolladores fuera de Apple para permitir que la aplicación solicite derechos, lo que no estoy seguro es posible sin una firma de código (todos los documentos que he visto señalan que no). En Mac, esto generalmente no es un problema, pero en iOS muchas funciones están protegidas por derechos, por lo que es deseable probar que esto funciona correctamente para los desarrolladores de iOS.
milch
@milch Estás 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 usan a menudo y se refieren a derechos, etc.)
jksoegaard
Estoy bastante seguro de que las compilaciones del simulador están firmadas ad hoc (no distribuidas). Puede verificar inspeccionando una aplicación iOS creada para el simulador con codesign -dv --verbose=4 /path/to/the.app. Volverá una línea que dice Signature=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, como AuthorityyTeamIdentifier
milch