Signing del codice: dove si trova l'hash crittografato di un blob firmato?

1

Leggendo il documento dello sviluppatore su Code Signing , dice nella sezione Digital Signatures and Signed Code :

To create a digital signature, the signing software computes a special type of checksum called a hash (or digest) based on a piece of data or code and encrypts that hash with the signer’s private key. This encrypted hash is called a signature.

To verify that signature, the verifying software computes a hash of the data or code. It then uses the signer’s public key to decrypt the signature, thus obtaining the original hash as computed by the signer. If the two hashes match, the data has not been modified since it was signed by someone in possession of the signer’s private key.

Signed code contains several digital signatures:

  • If the code is universal, the object code for each slice (architecture) is signed separately. This signature is stored within the binary file itself.
  • Various components of the application bundle (such as the Info.plist file, if there is one) are also signed. These signatures are stored in a file called _CodeSignature/CodeResources within the bundle.

Dopo qualche giocherellando, conosco il seguente:

  • All'interno del file binario, ho ottenuto CodeDirectory ( 0xfade0c02 ) contenente tutti gli hash SHA-1 o checksum del pacchetto, ad es. Info.plist ecc.
  • All'interno del pacchetto, ho ottenuto la directory _CodeSignature con il file CodeResources , che - come menzionato nel precedente paragrafo citato - dovrebbe contenere tutte le firme. Tuttavia, CodeResources contiene solo hash SHA-1 codificati base64 di diversi file.
  • All'interno del binario, ho alcuni certificati, che posso estrarre usando codesign -d --extract-certificates <binary> - generando codesign0 , codesign1 ecc. Questi certificati sono in realtà CMS Signatures ( 0xfade0b01 ) che contengono le firme dei certificati . Ricerca CMS Ottiene Sintassi dei messaggi crittografici , che viene utilizzata per firmare i dati.

Ora il paragrafo mi dice che alcuni hash devono essere memorizzati come firma (hash crittografato) nel binario o nel file CodeResources .

Sospetto che codesign utilizzi uno dei certificati / CMS Signatures per estrarre la chiave pubblica, quindi decrittografi una firma (hash crittografato) e confronta l'output con l'hash originale di un determinato file, ad es. Info.plist .

Quindi la mia domanda è: dove si trova questa firma (hash crittografato)? È la firma all'interno di un certificato / CMS Signature ? O è altrove?

    
posta polym 12.02.2016 - 23:49
fonte

1 risposta

2

Ecco il test di base che ho fatto.

Ho OS X 10.10 installato su un disco esterno sotto il nome del volume "Steelhead3". Ho inserito i seguenti comandi.

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

Ho quindi fatto una copia della cartella "Boot Camp Assistant.app". Successivamente, ho modificato "/ Volumes / Steelhead3 / Applicazioni / Utility / Boot Camp Assistant.app/Contents/Info.plist" e ho apportato una piccola modifica al modello di Mac che può rendere il programma di installazione USB di Windows.

A questo punto rendo i seguenti comandi.

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

Da qui ho avviato Windows e ho utilizzato l'applicazione Windiff.exe per confrontare i file. Mi aspettavo di vedere la modifica apportata ai file "Info.plist", cosa che ho fatto. Inoltre, i file "/ Volumes / Steelhead3 / Applicazioni / Utility / Boot Camp Assistant.app/Contents/MacOs/Boot Camp Assistant" sembravano essere cambiati. Poiché si tratta di un file binario, ho prima convertito le versioni precedenti e successive in caratteri esadecimali, quindi è stato utilizzato Windiff.exe per trovare le differenze. Di seguito sono le uniche differenze.

Sembra che l'unica differenza sia una modifica di 20 byte nel file binario eseguibile. Presumo che questo è dove l'hash è memorizzato. Tutti gli altri file sono rimasti invariati.

    
risposta data 21.02.2016 - 22:31
fonte

Leggi altre domande sui tag