Come abbiamo decifrato una chiave DKIM a 512 bit per meno di 8 euro nel cloud
In un'analisi sui record SPF, DKIM e DMARC dei primi 1 milione di siti web, è emerso un dato sorprendente: oltre 1.700 chiavi DKIM pubbliche risultavano più corte di 1.024 bit. Questo è stato inaspettato, poiché le chiavi RSA di lunghezza inferiore a 1.024 bit sono considerate insicure e il loro utilizzo in DKIM è stato deprecato con l'introduzione dell'RFC 8301 nel 2018.
L'idea di decifrare una chiave
Spinti dalla curiosità, i ricercatori hanno deciso di verificare se fosse possibile decifrare una di queste chiavi. L'obiettivo era estrarre la chiave privata da una chiave RSA pubblica, consentendo di firmare email come se si fosse il mittente originale. Inoltre, si voleva scoprire se le email firmate con questa chiave compromessa avrebbero superato i controlli di verifica DKIM dei principali provider di posta elettronica come Gmail, Outlook.com e Yahoo Mail.
La scelta della chiave
Per l'esperimento, è stata selezionata redfin.com, dopo aver trovato una chiave RSA pubblica a 512 bit su key1._domainkey.redfin.com (ora non più disponibile):
La chiave pubblica, presente nel tag del record DKIM, è codificata in formato ASN.1 DER e ulteriormente codificata in Base64. Per decodificare la chiave e ottenere il modulo (n) e l'esponente pubblico (e), è stato utilizzato un semplice codice Python:
# Codice per decodificare la chiave
Fattorizzazione della chiave
Con il modulo n a disposizione, il passo successivo è stato identificare i due numeri primi, p e q, il cui prodotto è uguale a n. Questo processo, noto come fattorizzazione, può risultare complesso. Fortunatamente, è stato trovato uno strumento open-source potente chiamato CADO-NFS, che offre un'implementazione semplice dell'algoritmo Number Field Sieve (NFS), il metodo più efficiente per fattorizzare grandi numeri.
Poiché la fattorizzazione richiede molta potenza di calcolo e non si voleva occupare i computer per giorni, è stata presa la decisione di noleggiare un server cloud. È stato scelto un server con 8 vCPU dedicate (serie AMD EPYC 7003) e 32 GB di RAM da Hetzner, installando Ubuntu come sistema operativo. La configurazione di CADO-NFS è stata semplice:
# Comandi per l'installazione di CADO-NFS
Per garantire che il server avesse sufficiente memoria per il compito, è stato aggiunto uno spazio di swap di 32 GB:
# Comando per aggiungere swap
La fattorizzazione è stata avviata chiamando lo script con n come input:
# Comando per avviare la fattorizzazione
Il processo ha richiesto circa 86 ore sul server a 8 vCPU, riuscendo a fattorizzare n in p e q:
Creazione della chiave privata
Dopo aver determinato p e q, erano disponibili tutti i componenti necessari per costruire la chiave privata RSA. Questo processo ha coinvolto l'uso di Python e della libreria PyCryptodome:
# Codice per generare la chiave privata
Queste righe di Python producono la chiave privata in formato PEM, pronta per l'uso:
Test della chiave
Integrata la chiave privata RSA nel proprio setup OpenDKIM, si è passati alla fase di test. È stata creata un'email semplice con un indirizzo di mittente security@redfin.com, inviata a vari servizi di hosting email. Sebbene la maggior parte dei provider abbia correttamente identificato la chiave a 512 bit come insicura, tre provider principali — Yahoo Mail, Mailfence e Tuta — hanno riportato un risultato.
Poiché redfin.com ha anche un record DMARC valido, il superamento del controllo DKIM implica che l'email ha superato anche la verifica DMARC, soddisfacendo i requisiti per BIMI.
Conclusioni
Tre decenni fa, decifrare una chiave pubblica RSA a 512 bit era un'impresa realizzabile solo con un supercomputer. Oggi, è possibile farlo in poche ore per meno di 8 euro su un server cloud. E se si dispone di un computer potente a casa con 16 o più core, si potrebbe realizzare questo processo ancora più rapidamente e a costi inferiori.
Non ci sono motivi validi per utilizzare chiavi a 512 o 768 bit al giorno d'oggi. I provider email dovrebbero automaticamente rifiutare qualsiasi firma DKIM generata con una chiave RSA più corta di 1.024 bit. Sono stati avvisati Yahoo, Mailfence e Tuta riguardo ai risultati ottenuti e sono stati condivisi consigli utili con loro.
I proprietari di domini devono anche agire, esaminando le impostazioni DNS per eventuali record DKIM obsoleti che non rispettano il minimo standard di 1.024 bit. Un modo semplice per controllare il tag di un record DKIM è contare i suoi caratteri Base64: una chiave RSA pubblica a 1.024 bit avrà almeno 216 caratteri.