CVE-2019-25220 : un spam d'en-têtes provoque un déni de service mémoire

Avant Bitcoin Core v24.0.1, des attaquants pouvaient inonder les nœuds avec des chaînes d’en-têtes à faible difficulté et provoquer un crash à distance de leurs pairs. Le problème a été classé en High severity, et Bitcoin Core indique qu’une protection a depuis été intégrée.

CVE-2019-25220 : un spam d'en-têtes provoque un déni de service mémoire

Une faille liée au stockage des en-têtes

Bitcoin Core conserve les en-têtes de la blockchain en mémoire, ce qui le rend vulnérable à une attaque par déni de service si un nœud télécharge et stocke des chaînes d’en-têtes extrêmement longues, même lorsqu’elles sont de faible difficulté. Une fois construite, une telle chaîne pouvait ensuite être réutilisée pour faire tomber n’importe quel nœud du réseau.

Le risque était connu depuis longtemps. Le système de checkpoints — des points de validation prédéfinis — servait justement à compliquer la tâche d’un attaquant, en l’obligeant à démarrer son attaque au dernier checkpoint plutôt qu’au bloc génésis. Mais selon Bitcoin Core, la baisse progressive des coûts liés au hashrate a réduit l’efficacité de cette mesure au fil du temps.

L’attaque a été redécouverte et signalée en janvier 2019 par David Jaenson, qui proposait d’introduire de nouveaux checkpoints comme solution pratique. Cette approche laissait toutefois les nœuds en IBD — la synchronisation initiale de la blockchain — sans protection avant la réception des blocs de checkpoint, et elle supposait aussi l’adoption régulière de logiciels mis à jour.

Une correction dans Bitcoin Core

Le sujet a ensuite attiré davantage d’attention après la publication, en octobre 2019, du texte « Chain width expansion » par Braydon Fuller sur la mailing list bitcoin-dev. Le projet n’a pas retenu la méthode proposée, en raison de préoccupations sur la convergence du réseau lorsqu’on limite le nombre de chaînes parallèles.

Bitcoin Core précise qu’à l’époque, le coût informatique pour créer une immense chaîne d’en-têtes à faible difficulté équivalait à environ 32.28% du coût de minage d’un bloc en pointe, soit environ 4.12 BTC, le bloc reward étant alors d’environ 12.77 BTC. En février 2022, ce coût était tombé à environ 14.73%, soit environ 1.07 BTC. Sans correction, il aurait atteint 4.44% en septembre 2024, soit environ 0.14 BTC.

La protection a finalement été intégrée dans la PR #25717 : le nœud vérifie d’abord qu’une chaîne présentée dispose d’assez de travail avant de l’enregistrer en mémoire. Avec cette modification, Bitcoin Core n’a plus besoin de s’appuyer sur les checkpoints pour se protéger contre les attaques connues.

Chronologie et attributions

Bitcoin Core attribue le mérite de la redécouverte de l’attaque, de l’estimation de son coût et des propositions de modification à David Jaenson et Braydon Fuller. Le travail de recherche d’une correction et son implémentation reviennent à Suhas Daftuar et Pieter Wuille.

La publication publique a eu lieu le 2024-09-18, après la sortie de Bitcoin Core 24.0.1 le 2022-12-12. La dernière version vulnérable de Bitcoin Core, la 23.2, est passée en fin de vie le 2023-12-07.