U implementaciji algoritma enkripcije Kyber, koji je pobijedio na natjecanju kriptoalgoritama otpornih na kvantno hakiranje, otkrivena je ranjivost koja omogućuje napade putem vanjskih kanala za rekonstrukciju tajnih ključeva temeljenih na mjerenju vremena operacija tijekom dešifriranja enkriptiranog teksta koji napadač pruži. Problem se odnosi i na referentnu implementaciju mehanizma inkapsulacije ključeva CRYSTALS-Kyber KEM, kao i na mnoge neovisne knjižnice za enkripciju koje podržavaju Kyber, uključujući knjižnicu pqcrypto korištenu u aplikaciji Signal.
Bit ranjivosti, koja je dobila kodno ime KyberSlash, leži u korištenju operacije dijeljenja tijekom dekodiranja poruke: "t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;", gdje je u dijeljenju tajna vrijednost "t" tipa "double", a dijeljenik je javno poznata vrijednost KYBER_Q. Problem je u tome što vrijeme operacije dijeljenja nije konstantno i u različitim okruženjima broj CPU ciklusa potrebnih za dijeljenje ovisi o ulaznim podacima. Stoga se na temelju promjene vremena operacija može dobiti uvid u prirodu podataka koji se koriste pri dijeljenju.
Daniel Bernstein, poznati stručnjak za kriptografiju, uspio je pripremiti radnu demonstraciju dokaza mogućnosti provedbe napada u praksi. U dva od tri provedena eksperimenta, izvršavajući kod na ploči Raspberry Pi 2, potpuno je rekonstruiran privatni ključ Kyber-512 na temelju mjerenja vremena dekodiranja podataka. Metoda se također može prilagoditi za ključeve Kyber-768 i Kyber-1024. Za uspješnu provedbu napada potrebno je da se zadanom enkriptiranom tekstu obradi korištenjem iste para ključeva i da se točno mjeri vrijeme izvršenja operacije.
U nekim bibliotekama otkrivena je još jedna ranjivost (KyberSlash2), koja također proizlazi iz korištenja tajne vrijednosti tijekom izvođenja dijeljenja. Razlike od prvog varijante svode se na poziv u fazi šifriranja (u funkcijama poly_compress i polyvec_compress), a ne tijekom dešifriranja. U tom slučaju, druga varijanta može biti korisna za napad samo u slučajevima korištenja procedure u operacijama ponovnog šifriranja, gdje se izlaz šifriranog teksta smatra povjerljivim.
Ranjivost je već ispravljena u bibliotekama:
- zig/lib/std/crypto/kyber_d00.zig (22. prosinca),
- pq-crystals/kyber/ref (30. prosinca),
- symbolicsoft/kyber-k2so (19. prosinca),
- cloudflare/circl (8. siječnja),
- aws/aws-lc/crypto/kyber (4. siječnja),
- liboqs/src/kem/kyber (8. siječnja).
Biblioteke koje prvotno nisu bile podložne ranjivosti:
- 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.
Ranjivost ostaje neispravljena u bibliotekama:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20. prosinca ispravljen je samo 1 varijanta ranjivosti),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20. prosinca ispravljen je samo 1 varijanta ranjivosti),
- rustpq/pqcrypto/pqcrypto-kyber (5. siječnja ispravka je dodana u libsignal, ali u samom pqcrypto-kyber ranjivost još nije ispravljena).
Izvor: opennet.ru
