Zranitelnost v implementacích postkvantového šifrovacího algoritmu Kyber

Při implementaci šifrovacího algoritmu Kyber, který zvítězil v soutěži kryptografických algoritmů odolných vůči hrubé síle na kvantovém počítači, byla identifikována zranitelnost, která umožňuje útokům postranním kanálem znovu vytvořit tajné klíče na základě měření doby operací během dešifrování šifrovaný text poskytnutý útočníkem. Problém se týká jak referenční implementace mechanismu zapouzdření klíčů CRYSTALS-Kyber KEM, tak mnoha knihoven šifrování s podporou Kyber třetích stran, včetně knihovny pqcrypto používané v programu Signal messenger.

Podstata zranitelnosti, která získala kódové označení KyberSlash, je v použití operace dělení „t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;“ v procesu dekódování zprávy. , ve kterém dividenda obsahuje tajnou hodnotu „t“ s typem „double“ a dělitelem je známá veřejná hodnota KYBER_Q. Problém je v tom, že čas operace dělení není konstantní a v různých prostředích počet cyklů CPU provedených pro dělení závisí na vstupních datech. Na základě změn provozních časů si lze tedy udělat představu o povaze dat používaných při dělení.

Daniel J. Bernstein, známý odborník v oblasti kryptografie, dokázal připravit funkční ukázku důkazu, že útok lze v praxi provést. Ve dvou ze tří provedených experimentů bylo při spouštění kódu na desce Raspberry Pi 2 možné zcela znovu vytvořit soukromý klíč Kyber-512 na základě měření času dekódování dat. Metodu lze také přizpůsobit pro klíče Kyber-768 a Kyber-1024. Pro úspěšné provedení útoku je nutné, aby byl šifrovaný text určený útočníkem zpracován pomocí stejného páru klíčů a aby bylo možné přesně měřit dobu provedení operace.

V některých knihovnách byl identifikován další únik (KyberSlash2), ke kterému také dochází kvůli použití tajné hodnoty při provádění dělení. Rozdíly od první možnosti spočívají ve volání ve fázi šifrování (ve funkcích poly_compress a polyvec_compress), a nikoli během dešifrování. Druhá možnost však může být užitečná pro útok pouze v případech, kdy se postup používá při operacích opětovného šifrování, ve kterých je výstup šifrovaného textu považován za důvěrný.

Chyba zabezpečení již byla v knihovnách opravena:

  • zig/lib/std/crypto/kyber_d00.zig (22. prosince),
  • pq-crystals/kyber/ref (30. prosince),
  • symbolicsoft/kyber-k2so (19. prosince),
  • mračna/kruh (8. ledna),
  • aws/aws-lc/crypto/kyber (4. ledna),
  • liboqs/src/kem/kyber (8. ledna).

Knihovny, které původně nebyly touto chybou zabezpečení ovlivněny:

  • 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.

Chyba zabezpečení zůstává v knihovnách neopravena:

  • 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 verze této chyby zabezpečení),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/clean,
  • randombit/botan (20. prosince byla opravena pouze 1 chyba zabezpečení),
  • rustpq/pqcrypto/pqcrypto-kyber (oprava byla přidána do libsignal 5. ledna, ale zranitelnost ještě nebyla opravena v samotném pqcrypto-kyber).

Zdroj: opennet.ru

Přidat komentář