Recherche. Vulnérabilité
MilkSad : la vulnérabilité « bx seed » (CVE-2023-39910)
Dans le cadre de nos recherches sur l’aléatoire faible : voir la présentation intitulée « L’aléatoire faible dans les portefeuilles cryptographiques ».
Les portefeuilles générés à l’aide de la commande « bx seed » de libbitcoin-explorer tiraient leur entropie d’une horloge, et non d’un véritable générateur aléatoire — ce qui les rend prévisibles et, pour leurs propriétaires légitimes, récupérables.
MilkSad, référencé sous le numéro CVE-2023-39910, constitue l’un des cas les plus flagrants de défaillance liée à un générateur aléatoire faible de toute l’histoire des cryptomonnaies. Il affecte les portefeuilles dont la graine a été générée par la commande « bx seed » de la bibliothèque libbitcoin-explorer. Son nom provient de la mnémonique de la graine la plus faible possible, qui commence par « milk sad… ». Cette page explique la faille et décrit la procédure de récupération pour le propriétaire d’un portefeuille concerné.
En quoi consiste la faille MilkSad ?
Pour créer un portefeuille, il faut un aléa véritable. L’outil « bx seed » a au contraire initialisé un générateur pseudo-aléatoire Mersenne Twister (MT19937) avec l’heure système en secondes — une valeur sur 32 bits. Cela réduit considérablement l’ensemble de l’espace de clés : au lieu d’un nombre astronomique de graines possibles, il n’y en a qu’environ quatre milliards, et en pratique bien moins, car l’heure de création est généralement connue à peu près dans une fourchette. Quiconque connaît approximativement la date de création d’un portefeuille peut régénérer la graine exacte qui a servi à sa création.
Qui est concerné ?
Tout portefeuille dont l’entropie de la graine provenait de « bx seed » est concerné, pendant toute la période où l’outil présentait cette faille (environ de 2011 à 2023). Cela inclut les personnes qui ont utilisé directement « libbitcoin-explorer » et, surtout, toute personne ayant suivi un tutoriel ou un script qui faisait appel à « bx seed » en arrière-plan pour générer une phrase mnémonique. Si votre phrase BIP39 a été créée de cette manière, elle n’a jamais été sécurisée : elle faisait partie d’un petit ensemble dénombrable.
Pourquoi la graine temporelle est fatale
Un Mersenne Twister est déterministe : une même graine produit toujours le même flux. La valeur de la graine est donc le seul élément secret, et dans ce cas précis, cette valeur n’était qu’un horodatage. La reproduction d’un portefeuille se résume alors à : parcourir les secondes candidates dans la fenêtre de création plausible, les passer chacune par le même MT19937 pour produire la même entropie, en déduire la phrase mnémonique et les adresses résultantes, puis les comparer à l’adresse connue. Comme une journée ne compte que 86 400 secondes et une année environ 31 millions, la recherche s’achève rapidement sur du matériel standard. Il s’agit du même type de faille que celui de Randstorm — un aléa prévisible —, mais dans un outil différent.
Comment se déroule le recouvrement pour le propriétaire ?
C’est cette même prévisibilité qui rend MilkSad dangereux qui permet à son propriétaire légitime de récupérer un portefeuille affecté. Si vous avez créé un portefeuille à l’aide d’un outil concerné et que vous avez par la suite perdu la phrase mnémonique, nous pouvons la régénérer : à partir d’une date de création approximative et d’une adresse connue du portefeuille, nous parcourons la plage d’horodatages via la dérivation MT19937 jusqu’à ce que les adresses correspondent, puis nous reconstituons la graine exacte. Nous ne procédons ainsi que pour les portefeuilles dont vous êtes propriétaire et pour lesquels vous pouvez prouver un lien — l’objectif est de restituer les fonds à leur propriétaire, et non de faciliter le vol.
Si vous pensez être concerné(e)
Si l’un de vos portefeuilles a pu être généré à partir d’une graine « bx » ou d’un outil s’appuyant sur celle-ci et qu’il contient encore des fonds, considérez-le comme compromis : transférez les fonds vers un nouveau portefeuille créé avec une graine véritablement aléatoire dès que possible, car n’importe qui d’autre peut également régénérer l’ancien. Si vous en avez déjà perdu l’accès, la récupération est tout à fait possible précisément en raison de cette faille : la méthode qu’utiliserait un pirate est exactement celle qui vous permettra de récupérer vos cryptomonnaies.
Quel était le montant en jeu ?
La conséquence d’un espace de clés de quatre milliards de graines est que les portefeuilles concernés peuvent être vidés en masse par quiconque effectue l’énumération — ce qui a d’ailleurs été le cas pour certains. Comme la faille se trouvait dans un outil en ligne de commande largement utilisé, la vulnérabilité s’est propagée à tous les scripts, tutoriels et projets en aval qui l’utilisaient pour « générer une graine sécurisée ». C’est là le danger insidieux d’un bug lié à un aléa insuffisant : il ne se manifeste pas ouvertement, les portefeuilles semblent normaux, la phrase mnémonique ressemble à n’importe quelle autre série de douze mots, et la faille reste invisible jusqu’à ce que quelqu’un procède à l’énumération de l’espace de graines. Pour un utilisateur, la conclusion pratique est que le solde peut disparaître à tout moment ; il convient donc de vider immédiatement un portefeuille concerné pour transférer ses fonds vers un nouveau portefeuille.
Le hasard faible est un phénomène récurrent
MilkSad n’est pas un cas isolé ; il s’inscrit dans une série d’échecs où le caractère aléatoire d’un portefeuille provenait d’un élément prévisible : une horloge, une particularité du navigateur, un générateur de plateforme défaillant. Randstorm a réduit à néant l’entropie des premiers portefeuilles de navigateur ; la faille SecureRandom d’Android en 2013 a entraîné la fuite de clés via des nonces de signature répétés ; le générateur de la prévente Ethereum de 2014 s’appuyait sur la fonction Math.random du navigateur pour certaines étapes de son processus. Le point commun est que la cryptographie était solide, mais pas la graine, et dans chaque cas, cette même prévisibilité qui a permis le vol permet également la récupération par le propriétaire légitime. Il s’agit là d’un axe central de nos recherches, car une grande partie des cryptomonnaies « perdues » des débuts sont en réalité des cryptomonnaies à aléatoire faible qui n’attendent qu’à être reconstruites.
Transparence et notre travail
MilkSad a été rendu public en 2023 par les chercheurs en sécurité à l’origine de l’alerte publiée sur milksad.info et s’est vu attribuer le numéro CVE-2023-39910 ; c’est à eux que revient le mérite de cette découverte. La contribution de KeychainX porte sur la récupération : nous avons mis au point et exécuté la reconstruction de la graine temporelle pour les portefeuilles affectés, au profit de leurs propriétaires, dans le cadre de nos travaux plus larges sur la récupération en cas de randomisation insuffisante (voir notre étude Randstorm pour le cas étroitement lié des portefeuilles de navigateur). Nous renvoyons à l’avis de sécurité original pour la divulgation technique complète.
Foire aux questions
Qu’est-ce que MilkSad ?
Une vulnérabilité liée à une faible entropie (CVE-2023-39910) dans la commande « bx seed » de libbitcoin-explorer, qui initialisait un algorithme Mersenne Twister avec l’heure système sur 32 bits, rendant ainsi les graines résultantes prévisibles et énumérables.
Cela a-t-il un impact sur mon portefeuille ?
Si votre graine a été générée à l’aide de « bx seed », ou d’un outil/tutoriel qui l’utilisait, alors oui. La sécurité de cette phrase n’a jamais existé ; transférez tous vos fonds vers un portefeuille doté d’une graine correctement aléatoire.
Est-il possible de récupérer un portefeuille MilkSad si j’ai perdu ma phrase de récupération ?
Souvent oui, pour le propriétaire. À partir d’une date de création approximative et d’une adresse connue, nous régénérons la graine en parcourant la plage d’horodatage selon le même processus de dérivation jusqu’à ce que les adresses correspondent.
Qui a découvert MilkSad ?
Les chercheurs à l’origine de l’alerte publiée sur milksad.info l’ont rendue publique en 2023 (CVE-2023-39910). KeychainX intervient dans le cadre de la restauration des données pour les utilisateurs concernés.
Combien coûte la remise en état ?
Rémunération au résultat : un pourcentage de la valeur récupérée uniquement si nous retrouvons le portefeuille, et aucun paiement initial.
Un portefeuille fabriqué avec un outil de mauvaise qualité ?
Si votre seed provient éventuellement de BX Seed et que vous n’y avez plus accès, il est probablement possible de le récupérer. Indiquez-nous le portefeuille concerné et une date approximative : nous vous donnerons une estimation réaliste dans les 24 heures.