CVE-2024-35202 : une faille de sécurité est révélée

Avant Bitcoin Core v25.0, un attaquant pouvait faire planter à distance des nœuds Bitcoin Core en déclenchant une assertion dans la gestion des messages blocktxn. La faille est classée High severity et a été rendue publique le 2024-10-09.

CVE-2024-35202 : une faille de sécurité est révélée

Une faille liée au protocole des blocs compacts

Le problème apparaît lors du traitement d’une annonce de bloc via un message cmpctblock. Bitcoin Core tente alors de reconstruire le bloc annoncé à partir des transactions présentes dans son propre mempool et d’autres transactions disponibles. Si la reconstruction échoue parce qu’il manque des transactions, le nœud les réclame à son pair annonceur via un message getblocktxn, auquel doit répondre un message blocktxn contenant les transactions demandées.

Le protocole des blocs compacts repose sur des identifiants de transaction raccourcis, en l’occurrence des short-ids de 6 octets, afin de réduire la bande passante. Ces identifiants peuvent toutefois entrer en collision, c’est-à-dire qu’une transaction A peut partager le même short-id qu’une transaction B lors de la reconstruction du bloc. Dans ce cas, la collision est détectée car la racine Merkle calculée ne correspond pas à celle annoncée pour le bloc, et le nœud doit alors revenir à une demande de bloc complet.

Le scénario de plantage

Bitcoin Core crée une instance de PartiallyDownloadedBlock à chaque réception d’un nouveau bloc compact. Si des transactions manquent, cette instance est conservée jusqu’au traitement du message blocktxn correspondant. À la réception de ce message, la méthode PartiallyDownloadedBlock::FillBlock est appelée pour tenter de reconstruire le bloc complet.

Dans le cas de collision décrit plus haut, le bloc complet est bien demandé, mais l’instance PartiallyDownloadedBlock et les autres états liés à la requête initiale restent inchangés. Cela laisse la porte ouverte à la réception d’un second message blocktxn pour le même bloc, ce qui déclenche à nouveau FillBlock. Or cette méthode est supposée n’être appelée qu’une seule fois, comme l’indique une assertion, et cette violation provoque le crash du nœud.

L’attaquant n’a même pas besoin de provoquer une collision par hasard : la logique de gestion des collisions peut être déclenchée simplement en incluant dans le message blocktxn des transactions qui ne figurent pas dans la racine Merkle du bloc.

Signalement et correctif

La vulnérabilité a été découverte et signalée par Niklas Gögge, qui a également contribué à sa correction. Selon la chronologie publiée, il a signalé le problème à la liste de diffusion sécurité de Bitcoin Core le 2022-10-05, puis la PR #26898 contenant le correctif a été fusionnée le 2023-01-24.

Le correctif a ensuite été inclus dans la version Bitcoin Core 25.0, publiée le 2023-05-25. La divulgation publique de la faille est intervenue le 2024-10-09.