Vulnérabilité dans les implémentations de l'algorithme de chiffrement post-quantique Kyber

Dans la mise en œuvre de l'algorithme de chiffrement Kyber, qui a remporté le concours des algorithmes cryptographiques résistants à la force brute sur un ordinateur quantique, une vulnérabilité a été identifiée qui permet aux attaques par canal secondaire de recréer des clés secrètes basées sur la mesure du temps des opérations lors du décryptage du texte chiffré fourni par l’attaquant. Le problème affecte à la fois l'implémentation de référence du mécanisme d'encapsulation de clé CRYSTALS-Kyber KEM et de nombreuses bibliothèques de chiffrement tierces compatibles Kyber, y compris la bibliothèque pqcrypto utilisée dans le messager 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 « t = (((t < 1) + KYBER_Q/2)/KYBER_Q) & 1; » dans le processus de décodage d'un message , dans lequel 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 d'une opération de division n'est pas constant et que, dans différents environnements, le nombre de cycles CPU effectués pour la division dépend des données d'entrée. Ainsi, en fonction de l'évolution des temps de fonctionnement, on peut se faire une idée de la nature des données utilisées en division.

Daniel J. Bernstein, un expert reconnu dans le domaine de la cryptographie, a pu préparer une démonstration concrète prouvant que l'attaque pouvait être menée dans la pratique. Dans deux des trois expériences menées, lors de l'exécution de code sur la carte Raspberry Pi 2, il a été possible de recréer complètement la clé privée du Kyber-512 en mesurant le 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 mener à bien une attaque, il est nécessaire que le texte chiffré spécifié par l'attaquant soit traité à l'aide de la même paire de clés et que le temps d'exécution de l'opération puisse être mesuré avec précision.

Une autre fuite (KyberSlash2) a été identifiée dans certaines bibliothèques, qui se produit également en raison de l'utilisation d'une valeur secrète lors de la division. Les différences avec la première option se résument à l'appel au stade du chiffrement (dans les fonctions poly_compress et polyvec_compress), et non lors du décryptage. Cependant, la deuxième option peut être utile pour une attaque uniquement dans les cas où la procédure est utilisée dans des opérations de recryptage dans lesquelles 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-cristaux/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).

Bibliothèques non initialement affectées par la vulnérabilité :

  • ennuyeuxssl/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-cristaux/kyber/avx2,
  • pqclean/crypto_kem/kyber*/avx2.

La vulnérabilité n'est toujours pas corrigée dans les bibliothèques :

  • antontutoveanu/cristaux-kyber-javascript,
  • Argyle-Software/kyber,
  • debian/src/liboqs/unstable/src/kem/kyber,
  • kudelskisecurity/cristaux-go,
  • mupq/pqm4/crypto_kem/kyber* (Le 20 décembre, une seule version de la vulnérabilité a été corrigée),
  • PQClean/PQClean/crypto_kem/kyber*/aarch64,
  • PQClean/PQClean/crypto_kem/kyber*/clean,
  • randombit/botan (Le 20 décembre, une seule vulnérabilité a été corrigée),
  • rustpq/pqcrypto/pqcrypto-kyber (un correctif a été ajouté à libsignal le 5 janvier, mais la vulnérabilité n'a pas encore été corrigée dans pqcrypto-kyber lui-même).

Source: opennet.ru

Ajouter un commentaire