CVE-2024-52911 : l'interpréteur de scripts peut provoquer un plantage à distance

Bitcoin Core a rendu publique une faille de sécurité affectant les versions 0.14.0 à 29.0, susceptible de provoquer l'accès à de la mémoire déjà libérée lors de la validation d'un bloc spécialement conçu. Classée High, cette vulnérabilité pouvait permettre à un mineur malveillant de faire planter des nœuds victimes, avec un risque théorique d'exécution de code à distance.

CVE-2024-52911 : l'interpréteur de scripts peut provoquer un plantage à distance

Une vulnérabilité lors de la validation des blocs

Selon le détail publié par Bitcoin Core, les données nécessaires à la vérification des entrées de chaque transaction sont pré-calculées puis mises en cache pendant la validation. Dans certains cas, un bloc invalide spécialement façonné pouvait conduire à la destruction de ces données alors qu'une tâche de validation en arrière-plan continuait encore à y accéder.

Le problème repose sur un cas classique de use-after-free, c'est-à-dire l'utilisation d'une mémoire déjà libérée. Bitcoin Core précise qu'un attaquant capable de miner un bloc avec une preuve de travail suffisante aurait pu exploiter ce comportement pour faire planter des nœuds victimes. En raison de la nature de ce type de bogue, un scénario d'exécution de code à distance n'est pas exclu, même si les contraintes sur les données du bloc rendent cette hypothèse peu probable.

Par défaut, la validation des scripts pour les nouveaux blocs est envoyée vers des threads en arrière-plan via un vecteur de fonctions CScriptCheck. Chacune d'elles conserve un pointeur vers un objet PrecomputedTransactionData, qui stocke certaines données nécessaires à chaque entrée de la transaction. Le projet indique qu'une attention particulière doit être portée à la durée de vie de ces objets, car le pointeur ne contient pas les données elles-mêmes.

La sécurité de cette durée de vie est assurée par une classe RAII, CCheckQueueControl. Mais ce contrôle était instancié avant les données pré-calculées, ce qui implique, en C++, une destruction dans l'ordre inverse de la construction. Le vecteur de PrecomputedTransactionData pouvait donc être détruit avant CCheckQueueControl.

Cette situation ne posait pas de problème lorsque le bloc était valide, car CCheckQueueControl::Wait() était alors appelé avant le retour de la fonction. En revanche, en cas de retour anticipé après l'échec d'une vérification séparée, un thread pouvait encore lire les données pré-calculées après leur destruction. Bitcoin Core indique qu'un attaquant pouvait alors viser un plantage de nœuds victimes, au prix d'une preuve de travail valide à l'extrémité de la chaîne.

Découverte et correction

La vulnérabilité a été découverte par Cory Fields (MIT DCI), qui l'a signalée de manière responsable avec un rapport détaillé, un proof of concept de reproduction et une proposition d'atténuation.

La chronologie publiée par Bitcoin Core mentionne une première notification privée le 2024-11-02, puis un correctif discret poussé par Pieter Wuille le 2024-11-06 sur la PR ouverte #31112, en supprimant les retours anticipés. La PR a ensuite été fusionnée le 2024-12-03, avant la publication de Bitcoin Core 29.0 le 2025-04-12 avec le correctif.

Bitcoin Core précise enfin que la dernière version vulnérable, la branche 28.x, est arrivée en fin de vie le 2026-04-19, avant la divulgation publique effectuée le 2026-05-05.