În implementarea algoritmului de criptare Kyber, câștigător al competiției de criptografie rezistentă la atacurile calculatoarelor cuantice, a fost descoperită o vulnerabilitate care permite efectuarea de atacuri prin canale laterale pentru reproducerea cheilor secrete pe baza măsurării timpului operațiunilor în timpul decriptării textului criptat furnizat de atacator. Problema afectează atât implementarea de referință a mecanismului de încapsulare a cheilor CRYSTALS-Kyber KEM, cât și multe biblioteci software de criptare care suportă Kyber, inclusiv biblioteca pqcrypto utilizată în aplicația de mesagerie Signal.
Esenta vulnerabilității, care a primit numele de cod KyberSlash, constă în utilizarea operației de împărțire în procesul de decodificare a mesajului „t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;”, în care împărțitul conține o valoare secretă „t” de tip „double”, iar împărțitorul este o valoare publică bine cunoscută KYBER_Q. Problema este că timpul de execuție al operației de împărțire nu este constant și, în funcție de mediu, numărul de cicluri CPU necesare pentru împărțire variază în funcție de datele de intrare. Astfel, pe baza modificărilor în timpul operațiilor se poate obține o reprezentare a caracterului datelor utilizate la împărțire.
Daniel Bernstein, expert cunoscut în domeniul criptografiei, a reușit să pregătească o demonstrație funcțională a posibilității de a efectua un atac în practică. În două din cele trei experimente desfășurate pe placa Raspberry Pi 2, s-a reușit reproducerea completă a cheii private Kyber-512 pe baza măsurării timpului de decriptare a datelor. Metoda poate fi de asemenea adaptată pentru cheile Kyber-768 și Kyber-1024. Pentru a efectua cu succes atacul, este necesar ca textul criptat furnizat de atacator să fie procesat folosind aceeași pereche de chei și să fie măsurat cu exactitate timpul de execuție al operației.
În unele biblioteci a fost descoperită o altă vulnerabilitate (KyberSlash2), care apare din cauza utilizării unei valori secrete în timpul procesului de împărțire. Diferențele față de prima variantă se reduc la apelul în stadiul de criptare (în funcțiile poly_compress și polyvec_compress), nu în timpul decriptării. În acest sens, a doua variantă ar putea fi utilă pentru atacuri doar în cazurile în care procedura este utilizată în operațiunile de recriptare, unde output-ul textului criptat este considerat confidențial.
Vulnerabilitatea a fost deja remediată în bibliotecile:
- zig/lib/std/crypto/kyber_d00.zig (22 decembrie),
- pq-crystals/kyber/ref (30 decembrie),
- symbolicsoft/kyber-k2so (19 decembrie),
- cloudflare/circl (8 ianuarie),
- aws/aws-lc/crypto/kyber (4 ianuarie),
- liboqs/src/kem/kyber (8 ianuarie).
Biblioteci care inițial nu erau vulnerabile:
- 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.
Vulnerabilitatea rămâne nerezolvată în bibliotecile:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20 decembrie a fost remediată doar 1 variantă a vulnerabilității),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 decembrie a fost remediată doar 1 variantă a vulnerabilității),
- rustpq/pqcrypto/pqcrypto-kyber (5 ianuarie remedierea a fost adăugată în libsignal, dar în cititorul pqcrypto-kyber vulnerabilitatea nu este încă reparată).
Sursa: opennet.ro
