Dans la mise en œuvre de l'algorithme de cryptage Kyber, qui a remporté le concours des algorithmes cryptographiques résistants aux attaques par ordinateur quantique, une vulnérabilité a été identifiée, permettant des attaques canalisées pour reconstituer des clés secrètes en se basant sur la mesure du temps des opérations lors du déchiffrement du texte chiffré fourni par l'attaquant. Ce problème concerne à la fois l'implémentation de référence du mécanisme d'encapsulation de clés CRYSTALS-Kyber KEM ainsi que de nombreuses bibliothèques de cryptage tierces prenant en charge Kyber, y compris la bibliothèque pqcrypto utilisée dans l'application Signal.
L'essence de la vulnérabilité, qui a reçu le nom de code KyberSlash, réside dans l'utilisation de l'opération de division dans le processus de décodage du message « t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1; », où le dividende contient la valeur secrète « t » de type « double », et le diviseur est la valeur publique bien connue KYBER_Q. Le problème est que le temps de l'opération de division n'est pas constant et, dans différents environnements, le nombre de cycles CPU nécessaires pour la division dépend des données d'entrée. Ainsi, sur la base de la variation du temps des opérations, il est possible de déduire la nature des données utilisées lors de la division.
Daniel Bernstein, un expert reconnu en cryptographie, a réussi à préparer une démonstration fonctionnelle prouvant la faisabilité de l'attaque en pratique. Dans deux des trois expériences réalisées, en exécutant le code sur une carte Raspberry Pi 2, il a pu reconstituer entièrement la clé privée Kyber-512 sur la base de la mesure du temps de décodage des données. La méthode peut également être adaptée pour les clés Kyber-768 et Kyber-1024. Pour qu'une attaque soit réussie, il est nécessaire que le texte chiffré fourni par l'attaquant soit traité en utilisant la même paire de clés et qu'il soit possible de mesurer précisément le temps d'exécution de l'opération.
Dans certaines bibliothèques, une autre vulnérabilité a été détectée (KyberSlash2), qui survient également en raison de l'utilisation d'une valeur secrète lors de l'exécution d'une division. Les différences par rapport à la première version se situent lors de l'appel pendant l'étape du chiffrement (dans les fonctions poly_compress et polyvec_compress), et non lors du déchiffrement. La deuxième version peut être utile pour une attaque uniquement dans les cas où la procédure est utilisée dans des opérations de re-chiffrement, où la sortie du texte chiffré est considérée comme confidentielle.
La vulnérabilité a déjà été corrigée dans les bibliothèques :
- zig/lib/std/crypto/kyber_d00.zig (22 décembre),
- pq-crystals/kyber/ref (30 décembre),
- symbolicsoft/kyber-k2so (19 décembre),
- cloudflare/circl (8 janvier),
- aws/aws-lc/crypto/kyber (4 janvier),
- liboqs/src/kem/kyber (8 janvier).
Les bibliothèques initialement non affectées par la vulnérabilité :
- 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.
La vulnérabilité reste non corrigée dans les bibliothèques :
- antontutoveanu/crystals-kyber-javascript,
- Argyle-Software/kyber,
- debian/src/liboqs/unstable/src/kem/kyber,
- kudelskisecurity/crystals-go,
- mupq/pqm4/crypto_kem/kyber* (20 décembre, seule 1 version de la vulnérabilité a été corrigée),
- PQClean/PQClean/crypto_kem/kyber*/aarch64,
- PQClean/PQClean/crypto_kem/kyber*/clean,
- randombit/botan (20 décembre, seule 1 version de la vulnérabilité a été corrigée),
- rustpq/pqcrypto/pqcrypto-kyber (5 janvier, la correction a été ajoutée dans libsignal, mais dans pqcrypto-kyber la vulnérabilité n'est pas encore corrigée).
Source : opennet.ru
