En sårbarhet er identifisert i implementeringen av Kyber-krypteringsalgoritmen, som vant konkurransen om kvanteresistente kryptografiske algoritmer, og som tillater sidekanalangrep å rekonstruere hemmelige nøkler basert på måling av operasjonstiden under dekryptering av kryptert tekst levert av angriperen. Problemet påvirker både referanseimplementeringen av CRYSTALS-Kyber KEM-nøkkelinnkapslingsmekanismen og mange tredjeparts krypteringsbiblioteker som støtter Kyber, inkludert pqcrypto-biblioteket som brukes i Signal messenger.
Sårbarheten, med kodenavnet KyberSlash, er basert på bruken av divisjonsoperasjonen "t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;" i meldingsdekodingsprosessen, der dividenden inneholder den hemmelige verdien "t" av typen "dobbel", og divisoren er den velkjente offentlige verdien KYBER_Q. Problemet er at divisjonsoperasjonstiden ikke er konstant, og i forskjellige miljøer avhenger antallet CPU-sykluser som utføres for divisjon av inngangsdataene. Dermed kan man, basert på endringen i operasjonstiden, få en idé om arten av dataene som brukes til divisjon.
Daniel J. Bernstein, en anerkjent kryptografiekspert, har produsert en fungerende konseptdemonstrasjon av angrepet. I to av tre eksperimenter ble koden kjørt på en Raspberry Pi 2, og den klarte å gjenskape den private Kyber-512-nøkkelen fullstendig basert på dekodingstiden. Metoden kan også tilpasses for Kyber-768- og Kyber-1024-nøkler. For at angrepet skal lykkes, må krypteringsteksten som angriperen leverer, behandles med samme nøkkelpar, og utførelsestiden kan måles nøyaktig.
En annen lekkasje (KyberSlash2) er funnet i noen biblioteker, som også oppstår på grunn av bruk av en hemmelig verdi når man utfører divisjon. Forskjellen fra den første varianten er at den kalles i krypteringsfasen (i poly_compress- og polyvec_compress-funksjonene), og ikke under dekryptering. Den andre varianten kan imidlertid bare være nyttig for et angrep i tilfeller der prosedyren brukes i rekrypteringsoperasjoner, der resultatet av den krypterte teksten anses som konfidensielt.
Sårbarheten er allerede rettet i bibliotekene:
- zig/lib/std/crypto/kyber_d00.zig (22. desember),
- pq-krystaller/kyber/ref (30. desember),
- symbolicsoft/kyber-k2so (19. desember),
- cloudflare/circl (8. januar),
- aws/aws-lc/crypto/kyber (4. januar),
- liboqs/src/kem/kyber (8. januar).
Biblioteker som ikke er sårbare i utgangspunktet:
- boringssl/krypto/kyber,
- filippo.io/mlkem768,
- formosa-krypto/libjade/tree/main/src/krypto_kem,
- kyber/common/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-krystaller/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
Sårbarheten er fortsatt uoppdatert i bibliotekene:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-programvare/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisikkerhet/krystaller-go,
- mupq/pqm4/crypto_kem/kyber* (kun én sårbarhetsvariant fikset 20. desember),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (kun én sårbarhetsvariant fikset 20. desember),
- rustpq/pqcrypto/pqcrypto-kyber (5. januar ble rettelsen lagt til i libsignal, men sårbarheten er ennå ikke fikset i selve pqcrypto-kyber).
Kilde: opennet.ru
