- Une erreur de validation incorrecte de points sur la courbe Edwards25519 a été découverte dans la fonction bas niveau
crypto_core_ed25519_is_valid_point() de libsodium
- Cette fonction est censée vérifier qu’un point appartient au groupe cryptographique principal, mais elle laisse passer à tort certains points faisant partie d’un ordre mixte (sous-groupe)
- La cause est une erreur de code dans la validation interne des coordonnées : seul X=0 était vérifié, tandis que la vérification Y=Z était omise, ce qui pouvait conduire à traiter des points invalides comme valides
- Dans la version corrigée, les deux conditions (X=0, Y=Z) sont désormais vérifiées, et les versions 1.0.20 et antérieures ou les versions publiées avant le 30 décembre 2025 sont concernées
- L’API de haut niveau (
crypto_sign_*) n’est pas affectée, et l’utilisation du groupe Ristretto255 est recommandée pour des raisons de sécurité et de performance
Présentation du projet libsodium
- libsodium est un projet lancé il y a 13 ans, dont l’objectif est de rendre la cryptographie simple à utiliser grâce à une API épurée
- Il est conçu pour permettre aux utilisateurs d’effectuer uniquement des opérations de haut niveau, sans avoir à connaître les algorithmes internes
- Le projet accorde une grande importance à la préservation de la compatibilité de l’API, et conserve jusqu’à aujourd’hui une cohérence fondée sur l’API de NaCl
- Certains utilisateurs emploient directement des fonctions bas niveau au-delà des limites indiquées dans la documentation, ce qui conduit de plus en plus à utiliser la bibliothèque comme une boîte à outils cryptographique
Cause du bug découvert
- Fonction en cause :
crypto_core_ed25519_is_valid_point()
- Elle doit rejeter les points qui n’appartiennent pas au groupe principal (d’ordre L) sur la courbe Edwards25519
- Cependant, une partie des points d’ordre mixte (2L, 4L, 8L, etc.) passe la validation
- En interne, pour vérifier l’ordre d’un point, la fonction multiplie celui-ci par L puis vérifie si le résultat est le point neutre (identity)
- Le point neutre s’exprime sous la forme X=0, Y=Z, mais le code existant ne vérifiait que X=0
- En conséquence, des points invalides avec Y≠Z pouvaient être considérés comme valides
- Exemple : pour un point Q du groupe principal, le point Q+(0, -1), obtenu en lui ajoutant un point d’ordre 2, est invalide, mais passait la validation avant le correctif
Contenu de la correction
- Le commit de patch a été modifié comme suit
- Code existant :
return fe25519_iszero(pl.X);
- Code corrigé :
fe25519_sub(t, pl.Y, pl.Z); return fe25519_iszero(pl.X) & fe25519_iszero(t);
- Désormais, les deux conditions X=0 et Y=Z sont vérifiées afin d’assurer une validation correcte
Portée de l’impact
- Les cas suivants peuvent être affectés
- utilisation de la version 1.0.20 ou antérieure ou d’une version publiée avant le 30 décembre 2025
- validation de points d’entrée non fiables avec
crypto_core_ed25519_is_valid_point()
- implémentation directe d’opérations sur la courbe Edwards25519
- Cependant, la plupart des utilisateurs ne sont pas concernés
- l’API de haut niveau (
crypto_sign_*) n’utilise pas cette fonction
crypto_scalarmult_ed25519 ne provoque pas de fuite d’information, même avec une clé publique invalide
- les clés générées par
crypto_sign_keypair et crypto_sign_seed_keypair appartiennent au bon groupe
Mesures recommandées
- Utilisation recommandée du groupe Ristretto255
- il est inclus dans libsodium depuis 2019 et résout les problèmes liés au cofactor
- les points décodés sont automatiquement sûrs, sans validation supplémentaire nécessaire
- il offre des performances supérieures à Edwards25519
- Si une mise à jour est impossible, il est possible d’effectuer la validation à l’aide de la fonction de remplacement au niveau applicatif proposée (
is_on_main_subgroup)
Diffusion du correctif et support
- Le problème a été corrigé immédiatement après sa découverte et est inclus dans toutes les versions stables diffusées après le 30 décembre 2025
- y compris les tarballs officiels, les binaires Visual Studio/MingW, les packages NuGet, les builds Android, le xcframework
swift-sodium, Rust libsodium-sys-stable et libsodium.js
- Une nouvelle point release est également prévue
- Le projet est maintenu par une seule personne, et il est possible de soutenir son amélioration continue via OpenCollective
Aucun commentaire pour le moment.