2 points par GN⁺ 2026-01-01 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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.

Aucun commentaire pour le moment.