2 votos

Firma de códigos: ¿Dónde está el "hash cifrado" de un blob firmado?

Leer la documentación del desarrollador sobre Firma de códigos , dice en la sección Digital Signatures and Signed Code :

Para crear una firma digital, el software de firma calcula un tipo de suma de comprobación llamada "hash" (o compendio) basada en un fragmento de datos o código y encripta ese hash con la clave privada del firmante. Este hash cifrado en cifrado se llama firma.

Para verificar esa firma, el software de verificación calcula un hash de los datos o el código. A continuación, utiliza la clave pública del firmante para descifrar la firma, obteniendo así el hash original calculado por el firmante. Si los dos hashes coinciden, los datos no han sido modificados desde que fueron firmados por alguien en posesión de la clave privada del firmante.

El código firmado contiene varias firmas digitales:

  • Si el código es universal, el código objeto de cada trozo (arquitectura) se firma por separado. Esta firma se almacena dentro de el propio archivo binario.
  • Varios componentes del paquete de aplicaciones (como el archivo Info.plist, si lo hay) también están firmados. Estas firmas de firmas se almacenan en un archivo llamado _CodeSignature/CodeResources dentro del paquete.

Después de algunos toqueteos, sé lo siguiente:

  • Dentro del binario, tengo el CodeDirectory ( 0xfade0c02 ) que contiene todos los hashes o sumas de comprobación SHA-1 del paquete, por ejemplo Info.plist etc.
  • Dentro del paquete, tengo el _CodeSignature con el directorio CodeResources que, como se menciona en el párrafo citado, debe contener todas las firmas. Sin embargo, el CodeResources sólo contiene hashes SHA-1 codificados en base64 de varios archivos.
  • Dentro del binario, tengo algunos certificados, que puedo extraer usando codesign -d --extract-certificates <binary> - generando codesign0 , codesign1 etc. Estos certificados son en realidad CMS Signatures ( 0xfade0b01 ) que sí contienen firmas de certificados. Buscando CMS Me sale Sintaxis de los mensajes criptográficos que se utiliza para firmar los datos.

Ahora el párrafo me dice que hay que almacenar algún hash como firma (hash encriptado) en el binario o en el CodeResources archivo.

Sospecho que codesign utiliza uno de los certificados/ CMS Signatures para extraer la clave pública, luego descifra una firma (hash cifrado) y compara el resultado con el hash original de un archivo determinado, por ejemplo Info.plist .

Así que mi pregunta es: ¿Dónde está esta firma (hash encriptado)? ¿Es la firma dentro de un certificado/ CMS Signature ? ¿O es en otro lugar?

3voto

David Anderson Puntos 2189

Aquí está la prueba básica que hice.

Tengo OS X 10.10 instalado en un disco externo bajo el nombre de volumen "Steelhead3". He introducido los siguientes comandos.

cd "/Volumes/Steelhead3/Applications/Utilities"
sudo codesign -fs - "Boot Camp Assistant.app"

Luego hice una copia de la carpeta "Boot Camp Assistant.app". A continuación, edité la carpeta "/Volumes/Steelhead3/Applications/Utilities/Boot Camp Assistant.app/Contents/Info.plist" y realicé un pequeño cambio con respecto a los modelos de Mac que pueden realizar el instalador USB de Windows.

En este punto volví a ejecutar los siguientes comandos.

cd "/Volumes/Steelhead3/Applications/Utilities"
sudo codesign -fs - "Boot Camp Assistant.app"

Desde aquí arranqué con Windows y utilicé la aplicación Windiff.exe para comparar los archivos. Esperaba ver el cambio realizado en los archivos "Info.plist", y así fue. Además, los archivos "/Volumes/Steelhead3/Applications/Utilities/Boot Camp Assistant.app/Contents/MacOS/Boot Camp Assistant" parecían haber cambiado. Como se trata de un archivo binario, primero convertí las versiones anteriores y posteriores a caracteres hexadecimales, y luego se utilizó Windiff.exe para encontrar las diferencias. A continuación se muestran las únicas diferencias.

enter image description here

Parece que la única diferencia es un cambio de 20 bytes en el archivo binario ejecutable. Supongo que es donde se almacena el hash. Todos los demás archivos no han cambiado.

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