Quello che stai chiedendo è possibile ma piuttosto difficile. Prima di tutto devi capire alcune idee, quindi eccoci qui.
In primo luogo, schemi di firma. Senza dubbio hai guardato gli schemi di firma digitale sul web e potresti giustamente chiedertelo - quindi perché non firmare semplicemente l'intero file? Bene, la risposta è che, almeno nel caso di RSA, ti apri a attacchi di falsificazione solo chiave esistenziali . Cioè, posso generare firme valide per diverse coppie di messaggi solo conoscendo la tua chiave pubblica.
La soluzione a questo è usare digesti di messaggi - hash, in altre parole. Una funzione hash crittograficamente protetta è quella che non solo ha pre-immagine, ma anche resistenza alle collisioni.
Quindi ora a ciò che tu (e l'NSA e l'intero mondo criminale russo) vuoi fare. Si desidera trasferire un file firmato con una firma digitale valida utilizzando una firma digitale trovata altrove. Va bene. Ci sono due cose che puoi fare:
- Puoi prendere la loro chiave pubblica, generare una coppia di messaggi / firma valida, quindi provare a trovare una pre-immagine dell'hash che funzioni effettivamente. In bocca al lupo. Non ci sono attacchi pre-immagine nemmeno su MD5, che io conosca.
- Puoi provare a trovare una collisione con il valore di hash che hanno usato, e basta inserire la firma alla fine.
Il numero 2 è esattamente ciò che gli autori dei flame malware ha fatto - hanno preso una firma valida e sfruttato una collisione MD5 per renderlo valido.
Con un intero eseguibile che funziona, ti sento dire? Come hai fatto a non segfault ?! Bene, aspetta un minuto. Vedi, le firme digitali supportano l'intera catena di certificati dalle CA radice fino al codice. Ti fidi delle CA radice perché sono nel tuo negozio locale. Ti fidi delle cose che firmano perché le loro firme sono valide. Quelle "cose" possono essere certificati intermedi, che possono quindi firmare altri oggetti. Ti fidi della catena perché quando controlli ogni firma, sono tutte firme valide che possono essere fatte solo con la chiave privata.
Quindi piuttosto che trovare una collisione con l'hash del binario, fallo con un hash di un altro certificato e usa quella collisione per farti generare un certificato che può firmare qualsiasi cosa ed essere valido nella catena.
Purtroppo dal momento che la NSA qualcuno l'ha già fatto con MD5, il mondo ha scoperto il problema. I certificati MD5 appartengono ormai al passato e SHA1 è addirittura in fase di tramonto, ma solo in caso . Per quanto ne so, al momento, nessuno sa come generare collisioni SHA256 valide su richiesta.
Quindi, è necessario a) indirizzare la catena di certificati, poiché i parser ASN.1 sono malvagi e b) interrompere SHA256.
Se vuoi provare a riprodurlo, ti consiglio una copia di Windows XP che accetta ancora i certificati MD5 (non lasciare che faccia l'aggiornamento di Windows), generi alcuni certificati MD5 con openssl e poi prova a riprodurre il risultato della fiamma: )