We wdrożeniu algorytmu szyfrującego Kyber, który zwyciężył w konkursie algorytmów kryptograficznych odpornych na brutalną siłę na komputerze kwantowym, zidentyfikowano podatność umożliwiającą atakom typu side-channel odtworzenie tajnych kluczy na podstawie pomiaru czasu operacji podczas deszyfrowania szyfrogram dostarczony przez atakującego. Problem dotyczy zarówno referencyjnej implementacji mechanizmu enkapsulacji kluczy CRYSTALS-Kyber KEM, jak i wielu bibliotek szyfrujących obsługujących Kyber innych firm, w tym biblioteki pqcrypto używanej w komunikatorze Signal.
Luka o nazwie kodowej KyberSlash opiera się na wykorzystaniu operacji dzielenia „t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1;” w procesie dekodowania wiadomości, gdzie dzielna zawiera tajną wartość „t” typu „double”, a dzielnik jest dobrze znaną publiczną wartością KYBER_Q. Problem polega na tym, że czas operacji dzielenia nie jest stały, a w różnych środowiskach liczba cykli procesora wykonywanych dla dzielenia zależy od danych wejściowych. Tak więc na podstawie zmiany czasu operacji można uzyskać wyobrażenie o charakterze danych użytych do dzielenia.
Daniel J. Bernstein, znany ekspert kryptografii, stworzył działający dowód koncepcji ataku. W dwóch z trzech eksperymentów kod był uruchamiany na Raspberry Pi 2 i był w stanie całkowicie odtworzyć klucz prywatny Kyber-512 na podstawie czasu dekodowania. Metodę można również dostosować do kluczy Kyber-768 i Kyber-1024. Aby atak się powiódł, szyfrogram dostarczony przez atakującego musi zostać przetworzony przy użyciu tej samej pary kluczy, a czas wykonania można dokładnie zmierzyć.
Inny wyciek (KyberSlash2) został znaleziony w niektórych bibliotekach, co również ma miejsce z powodu użycia tajnej wartości podczas wykonywania dzielenia. Różnica w stosunku do pierwszej wersji polega na tym, że jest ona wywoływana na etapie szyfrowania (w funkcjach poly_compress i polyvec_compress), a nie podczas deszyfrowania. Jednak druga wersja może być przydatna do ataku tylko w przypadkach, gdy procedura jest używana w operacjach ponownego szyfrowania, w których dane wyjściowe zaszyfrowanego tekstu są uważane za poufne.
Luka została już naprawiona w następujących bibliotekach:
- zig/lib/std/crypto/kyber_d00.zig (22 grudnia),
- pq-crystals/kyber/ref (30 grudnia),
- symbolicsoft/kyber-k2so (19 grudnia),
- cloudflare/circl (8 stycznia),
- aws/aws-lc/crypto/kyber (4 stycznia),
- liboqs/src/kem/kyber (8 stycznia).
Biblioteki, na które początkowo nie wpływa luka:
- nudnessl/krypto/kyber,
- filippo.io/mlkem768,
- formosa-crypto/libjade/tree/main/src/crypto_kem,
- kyber/wspólny/amd64/avx2,
- formosa-crypto/libjade/tree/main/src/crypto_kem/kyber/common/amd64/ref,
- pq-kryształy/kyber/avx2,
- pqclean/crypto_kem/kyber*/avx2.
Luka pozostaje nienaprawiona w bibliotekach:
- antontutoveanu/crystals-kyber-javascript,
- Oprogramowanie Argyle/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/kryształy-go,
- mupq/pqm4/crypto_kem/kyber* (20 grudnia została naprawiona tylko 1 wersja luki),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 grudnia naprawiono tylko 1 lukę),
- rustpq/pqcrypto/pqcrypto-kyber (poprawka została dodana do libsignal 5 stycznia, ale luka nie została jeszcze naprawiona w samym pqcrypto-kyber).
Źródło: opennet.ru
