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

1

Leyendo el documento del desarrollador sobre Code Signing , es Dice en la sección Digital Signatures and Signed Code :

  

Para crear una firma digital, el software de firma calcula un especial   tipo de suma de comprobación denominada hash (o compendio) basado en un dato o   codifica y encripta ese hash con la clave privada del firmante. Esta   hash cifrado se llama una 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 el   firma, obteniendo así el hash original calculado por el firmante.   Si los dos hashes coinciden, los datos no se han modificado desde que fue   firmado 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 para cada segmento   (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   las firmas se almacenan en un archivo llamado _CodeSignature / CodeResources   dentro del paquete.
  •   

Después de un poco de violín, sé lo siguiente:

  • Dentro del binario, obtuve el CodeDirectory ( 0xfade0c02 ) que contiene todos los hashes SHA-1 o sumas de comprobación del paquete, por ejemplo. Info.plist etc.
  • Dentro del paquete, obtuve el directorio _CodeSignature con el archivo CodeResources , que, como se menciona en el párrafo citado arriba, debe contener todas las firmas. Sin embargo, el CodeResources solo 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 en realidad son CMS Signatures ( 0xfade0b01 ) que sí contienen firmas de certificados . Buscando CMS , obtengo Sintaxis de mensajes criptográficos , que se utiliza para firmar datos.

Ahora el párrafo me dice que algunos hash deben almacenarse como una firma (hash cifrado) en el archivo binario o en el archivo CodeResources .

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

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

    
pregunta polym 12.02.2016 - 23:49

1 respuesta

2

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

Tengo OS X 10.10 instalado en un disco externo con el nombre de volumen "Steelhead3". Ingresé 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". Luego, edité "/ Volumes / Steelhead3 / Applications / Utilities / Boot Camp Assistant.app/Contents/Info.plist" e hice un pequeño cambio con respecto al modelo de Mac que puede instalar Windows USB.

En este punto, vuelvo a ejecutar los siguientes comandos.

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

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

Parece que la única diferencia es un cambio de 20 bytes en el archivo binario ejecutable. Supongo que aquí es donde se almacena el hash. Todos los demás archivos se mantuvieron sin cambios.

    
respondido por el David Anderson 21.02.2016 - 22:31

Lea otras preguntas en las etiquetas