Qualsiasi meccanismo di auto-verifica incluso nel file eseguibile potrebbe essere sostituito o rimosso dall'attaccante che intercetta il file. Pertanto, dobbiamo lasciare la verifica della firma a un sistema esterno all'eseguibile scaricato, ad esempio il sistema operativo.
Ci sono tre possibili risultati che un sistema di verifica può produrre:
- La firma è sicuramente valida (la firma e i dati corrispondono)
- La firma è sicuramente non valida (la firma e i dati non corrispondono)
- Non è disponibile alcuna firma (l'eseguibile non è firmato)
In Windows, potresti aver visto finestre di conferma pop-up come questa quando provi a eseguire un eseguibile:
Qui, l'eseguibile è stato firmato e Windows ha entrambi
- ha verificato la firma sull'eseguibile e
- ha verificato l'identità del pubblico verificando il proprietario della chiave, utilizzando una catena di attendibilità basata su una delle autorità di certificazione attendibili del sistema operativo.
Sappiamo con certezza crittografica che un'entità chiamata WinZip Computing ha firmato questo eseguibile, esattamente come esiste adesso sul nostro disco fisso. Questo è il caso n. 1, sopra.
Ecco come un utente attento alla sicurezza può verificare che qualcosa è definitivamente non modificato dalla sua pubblicazione originale. Allo stesso modo, il sistema operativo può rilevare molto facilmente il caso n. 2: tenta di verificare la firma e trova una mancata corrispondenza anziché una corrispondenza. In tal caso, il sistema operativo può dire severamente all'utente di non eseguire il software perché è incredibilmente inaffidabile.
Tuttavia, vuoi sapere come impedire a un utente di eseguire qualcosa che ha subito modifiche arbitrarie. È facile per un utente malintenzionato generare il caso n. 3 (nessuna firma): basta sostituire il file eseguibile firmato con un file eseguibile modificato non firmato.
In questo caso, spetta all'utente (o una politica molto severa sul sistema operativo) decidere di non eseguire mai alcun software che non ha una firma. L'utente deve aspettarsi una firma per il proprio software ed essere allarmato in sua assenza (o comunque aspettarsi sempre il peggio e diffidare di qualsiasi software non firmato). Non esiste un modo generale per distinguere tra il software che "dovrebbe" avere una firma ma non lo fa e il software che semplicemente non ha mai ricevuto alcuna firma (ad esempio perché l'editore non si è mai preso la briga di farlo). Un attacco non può simulare un eseguibile modificato in modo che corrisponda alla tua firma, ma può produrre un eseguibile modificato senza firma.
Naturalmente, se il tuo metodo trasmissione fornisce integrità (come fa TLS) puoi essere certo che l'eseguibile che arriva sul computer del client è uguale a quello inviato dal server. Se controlli il server e lo distribuisci utilizzando TLS (ad es. Tramite HTTPS), tu (il distributore) puoi essere sicuro che i tuoi clienti ricevono il tuo software originale. Se firmi anche il tuo software, gli utenti attenti alla sicurezza possono essere sicuri che stiano eseguendo il tuo software originale, ma questo non fa nulla per gli utenti che non conoscono la sicurezza, che non comprendono il significato di una firma crittografica.