Recentemente un gruppo di progetto Evil32 ha annunciato di aver trovato collisioni per tutte le chiavi OpenPGP dai server di chiavi pubblici ( link ).
A cosa si riferisce il termine collisione?
Recentemente un gruppo di progetto Evil32 ha annunciato di aver trovato collisioni per tutte le chiavi OpenPGP dai server di chiavi pubblici ( link ).
A cosa si riferisce il termine collisione?
Si riferiscono a ID della chiave breve, che sono considerati vulnerabili agli attacchi di collisione da un po 'di tempo. Il problema è già referenziato in RFC 4880, OpenPGP, 3.3. ID chiave :
A Key ID is an eight-octet scalar that identifies a key. Implementations SHOULD NOT assume that Key IDs are unique.
Ogni chiave OpenPGP ha un fingerprint allegato, calcolato principalmente dal suo pacchetto di chiavi pubbliche che contiene anche il tempo di creazione. Il calcolo è definito in RFC 4880, OpenPGP, 12.2. ID chiave e impronte digitali .
Esistono ID di chiavi brevi e lunghe, che assomigliano ai 32 bit inferiori dell'impronta digitale. Ad esempio, guardando gli ID della mia chiave OpenPGP:
fingerprint: 0D69 E11F 12BD BA07 7B37 26AB 4E1F 799A A4FF 2279
long id: 4E1F 799A A4FF 2279
short id: A4FF 2279
Le impronte digitali e gli ID delle chiavi sono usati, poiché la condivisione e il confronto di un'intera chiave con solitamente 1024-8096 bit (aggiungendo un po 'di più per intestazioni come la data di creazione) è molto poco pratico.
Mentre gli ID più brevi sono più facili da condividere e confrontare, aumentano anche le possibilità di collisioni. Questo sta crescendo esponenzialmente con la lunghezza, in numeri. Questo è il numero di ID chiave possibili per ciascuna lunghezza:
2^32 = 4294967296
2^64 = 18446744073709551616
2^160 = 1461501637330902918203684832716283019655932542976
La probabilità di collisione è l'inverso dei numeri, essendo la possibilità di generare due chiavi differenti con lo stesso ID.
La ricerca di collisioni per tutti i dati chiave OpenPGP disponibili pubblicamente richiede la ricerca di collisioni per appena 4 milioni di chiavi. Il progetto in realtà si limitava al set strong (che contiene il più grande set di chiavi, che sono tutte collegate insieme, possibilmente con bordi transitori), e questo attualmente contiene circa 55.000 chiavi .
Le collisioni di chiavi sono ancora possibili per ID chiave lunghi e impronte digitali, ma improbabile che sia molto improbabile. Il numero di impronte digitali possibili è addirittura maggiore del numero di possibili UUID e di solito ci si aspetta che questi siano unici. Lo stesso numero di indirizzi IPv6 è disponibile, techtarget.com ha alcuni esempi per ottenere un'impressione di numeri così grandi .
Generare chiavi con sicurezza ragionevole richiede un po 'di tempo, rendendo poco pratico enumerare abbastanza chiavi per trovare quei quattro milioni di collisioni. Ma è per questo che ho già menzionato il tempo di generazione della chiave sopra: con una sola chiave, puoi creare lotti di diverse chiavi OpenPGP da una singola (diciamo, RSA) senza la costosa generazione di chiavi, semplicemente si itera nel tempo. Questo è stato già proposto da Micah Lee nel suo talk su "Trolling the Web of Trust" .
Per quanto riguarda il timestamp UNIX da memorizzare come numero a 32 bit, e assumendo che SHA-1 come una buona funzione di hash abbia una distribuzione quasi uguale dei valori dei risultati, iterazione di una chiave RSA singola con timestamp diversi dovrebbe essere sufficiente per generare tutti i possibili ID della chiave breve (in realtà, dovrai ripetere questo per un numero di tasti). Se vuoi generare solo chiavi ragionevoli create entro un ragionevole lasso di tempo (ad esempio, negli ultimi anni, sicuramente non prima che PGP fosse rilasciato e non in futuro) dovrai usare qualche altra chiave, ma generare un po 'di più chiavi è ancora fattibile in un tempo piuttosto breve.
Openpgp utilizza gli ID chiave per identificare le chiavi. Un "ID chiave" è una parte dell'hash della chiave pubblica. Esistono due tipi: "short" (32 bit) e "long" (64 bit).
Per gli ID delle chiavi brevi è abbastanza facile costruire una nuova chiave che abbia lo stesso ID della chiave breve e gli stessi dettagli visibili dell'utente di una chiave esistente. È pratica comune (cattiva, ma comune) identificare le chiavi con i loro ID di chiave breve.
Se stai costruendo un sistema su openpgp, devi controllare attentamente che gli ID della chiave breve non siano MAI usati come mezzo per indicare quali chiavi sono attendibili.
Anche gpg stesso lo ha incasinato, quando richiedeva una chiave da un server delle chiavi richiedeva un ID chiave breve (anche se l'utente ne aveva specificato uno lungo). Se si utilizza un file "portachiavi" come un elenco di chiavi attendibili per un determinato scopo, ciò rende molto facile finire fidandosi di una chiave generata da un utente malintenzionato.
Anche se hai un gpg aggiornato è quasi certamente una buona idea fare solo "recv" e "aggiorna" le operazioni su un portachiavi dove la presenza di chiavi non fidate non è un problema, quindi ispezionale attentamente prima di copiarle in un Portachiavi "solo chiavi sicure".