Nell'implementazione dell'algoritmo di crittografia Kyber, vincitore del concorso di crittografia resistente agli attacchi dei computer quantistici, è stata scoperta una vulnerabilità che consente di eseguire attacchi attraverso canali esterni per ricreare chiavi segrete sulla base delle misurazioni temporali delle operazioni durante la decifratura del ciphertext fornito dall'aggressore. Il problema riguarda sia l'implementazione di riferimento del meccanismo di incapsulamento delle chiavi CRYSTALS-Kyber KEM, sia molte librerie di crittografia di terze parti che supportano Kyber, inclusa la libreria pqcrypto utilizzata nell'app di messaggistica Signal.
La vulnerabilità, denominata KyberSlash, si basa sull'uso nella fase di decodifica del messaggio dell'operazione di divisione «t = (((t < 1) + KYBER_Q/2) / KYBER_Q) & 1;», in cui il numeratore contiene un valore segreto «t» di tipo «double», mentre il denominatore è un valore pubblico noto, KYBER_Q. Il problema è che il tempo impiegato per l'operazione di divisione non è costante e, in diversi ambienti, il numero di cicli CPU eseguiti per la divisione dipende dai dati di input. Pertanto, basandosi sulle variazioni del tempo delle operazioni, è possibile ottenere indicazioni sulla natura dei dati utilizzati nella divisione.
Daniel Bernstein, noto esperto nel campo della crittografia, è riuscito a preparare una dimostrazione pratica della possibilità di eseguire un attacco. In due dei tre esperimenti condotti, utilizzando una scheda Raspberry Pi 2, è stato possibile ricreare interamente la chiave privata Kyber-512 basandosi sulla misurazione del tempo di decodifica dei dati. Il metodo può essere adattato anche per le chiavi Kyber-768 e Kyber-1024. Per realizzare con successo l'attacco, è necessario che il cifrario fornito dall'attaccante venga elaborato utilizzando la stessa coppia di chiavi e che sia possibile misurare con precisione il tempo di esecuzione dell'operazione.
In alcune librerie è stata identificata un'altra vulnerabilità (KyberSlash2), causata dall'uso di un valore segreto durante le operazioni di divisione. Le differenze rispetto alla prima variante riguardano la chiamata nella fase di crittografia (nelle funzioni poly_compress e polyvec_compress), e non durante la decrittazione. Tuttavia, la seconda variante potrebbe risultare utile per un attacco solo nei casi in cui la procedura è utilizzata in operazioni di crittografia ripetuta, dove l'output del testo crittografato è considerato riservato.
La vulnerabilità è già stata risolta nelle librerie:
- zig/lib/std/crypto/kyber_d00.zig (22 dicembre),
- pq-crystals/kyber/ref (30 dicembre),
- symbolicsoft/kyber-k2so (19 dicembre),
- cloudflare/circl (8 gennaio),
- aws/aws-lc/crypto/kyber (4 gennaio),
- liboqs/src/kem/kyber (8 gennaio).
Librerie inizialmente non vulnerabili:
- boringssl/crypto/kyber,
- filippo.io/mlkem768,
- formosa-crypto/libjade/tree/main/src/crypto_kem,
- kyber/common/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-crystals/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
La vulnerabilità rimane non corretta nelle librerie:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20 dicembre corretta solo 1 variante della vulnerabilità),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 dicembre solo 1 variante della vulnerabilità è stata corretta),
- rustpq/pqcrypto/pqcrypto-kyber (5 gennaio correzione aggiunta in libsignal, ma la vulnerabilità in pqcrypto-kyber non è ancora stata corretta).
Fonte: opennet.ru
