25 votos

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

Es posible firmar código o aplicaciones "ad-hoc" utilizando 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 ninguna identidad e identifica exactamente una instancia de código. Se aplican importantes restricciones al uso de código firmado ad-hoc; consulte la documentación antes de utilizarlo.

(El énfasis es mío)

Quise saber más y traté de encontrar dicha documentación, pero no pude encontrar ningún detalle. He encontrado una nota técnica llamada "MacOS Code Signing In Depth". pero no menciona en absoluto la firma ad hoc.

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

19voto

Jose Chavez Puntos 645

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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X