V implementaci šifrovacího algoritmu Kyber, který vyhrál soutěž o kryptografické algoritmy odolné vůči kvantovým počítačům, byla odhalena zranitelnost, která umožňuje provádět útoky po bočních kanálech pro rekonstrukci tajných klíčů na základě měření časů operací během dešifrování útočníkem poskytnutého šifrovaného textu. Problém se týká jak referenční implementace mechanismu zabalování klíčů CRYSTALS-Kyber KEM, tak mnoha dalších knihoven šifrování podporujících Kyber, včetně knihovny pqcrypto používané v messengeru Signal.
Podstata zranitelnosti, která dostala kódové jméno KyberSlash, spočívá v použití v procesu dekódování zprávy operace dělení „t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;“, ve které dělenec obsahuje tajnou hodnotu „t“ typu „double“ a dělitel je známá veřejná hodnota KYBER_Q. Problém je ten, že čas operace dělení není konstantní a v různých prostředích počet cyklů CPU prováděných pro dělení závisí na vstupních datech. Takovým způsobem lze na základě změn časů operací získat představu o povaze používaných dat při dělení.
Daniel Bernstein, známý odborník v oblasti kryptografie, dokázal připravit funkční demonstraci důkazu možnosti provést útok v praxi. Ve dvou ze tří provedených experimentů při běhu kódu na desce Raspberry Pi 2 se podařilo zcela obnovit soukromý klíč Kyber-512 na základě měření času dešifrování dat. Metoda může být také přizpůsobena pro klíče Kyber-768 a Kyber-1024. Pro úspěšné provedení útoku je nutné, aby zadaný útočníkem šifrovaný text byl zpracován pomocí stejného páru klíčů a aby bylo možné přesně měřit čas provádění operace.
V některých knihovnách byla odhalena další chyba (KyberSlash2), která také vzniká z použití tajné hodnoty při provádění dělení. Rozdíly oproti první variantě spočívají ve volání na fázi šifrování (ve funkcích poly_compress a polyvec_compress), a nikoli během dešifrování. Přitom druhá varianta může být užitečná pro útok pouze v případech použití procedury v operacích opětovného šifrování, ve kterých je výstup šifrovaného textu považován za důvěrný.
Zranitelnost byla již odstraněna v knihovnách:
- zig/lib/std/crypto/kyber_d00.zig (22. prosince),
- pq-crystals/kyber/ref (30. prosince),
- symbolicsoft/kyber-k2so (19. prosince),
- cloudflare/circl (8. ledna),
- aws/aws-lc/crypto/kyber (4. ledna),
- liboqs/src/kem/kyber (8. ledna).
Knihovny, které původně nebyly náchylné k zranitelnosti:
- 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.
Zranitelnost zůstává neopravená v knihovnách:
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20. prosince byla opravena pouze 1 varianta zranitelnosti),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20. prosince byla opravena pouze 1 varianta zranitelnosti),
- rustpq/pqcrypto/pqcrypto-kyber (5. ledna byla oprava přidána do libsignal, ale v samotném pqcrypto-kyber zatím zranitelnost nebyla opravena).
Zdroj: opennet.ru
