Bitcoin Core :  : Divulgation de CVE-2024-35202

Avant Bitcoin Core v25.0, un attaquant pourrait écraser à distance les nœuds de nœuds Bitcoin en déclenchant une affirmation dans la logique de gestion des messages BlockTXN.

Ce problème est considéré Haut gravité.

Détails

Lors de la réception d'une annonce de bloc via un message CMPCTBLOCK, Bitcoin Core tente de reconstruire le bloc annoncé à l'aide des transactions dans son propre Mecol ainsi que d'autres transactions disponibles. Si la reconstruction échoue en raison des transactions manquantes, elle les demandera à l'annonce du pair via un message getblocktxn. En réponse, un message BlockTxn est attendu, qui devrait contenir les transactions demandées.

Le protocole de bloc compact utilise des identifiants de transaction raccourcis pour réduire la bande passante. Ces Tides courts sont de 6 octets, ce qui entraîne une petite chance de collisions (c'est-à-dire la transaction A a le même ID court que la transaction B) lors de la reconstruction de bloc. Les collisions seront détectées car la racine Merkle calculée à partir de l'ensemble reconstruit des transactions ne correspondra pas à la racine de Merkle à partir de l'annonce de bloc. Les pairs ne doivent pas être punis pour des collisions car ils peuvent se produire faussement, ils sont donc gérés en se retournant à la demande du bloc complet.

Bitcoin Core créera une instance de partiellement downloadBlock chaque fois qu'un nouveau bloc compact est reçu. Si des transactions manquantes sont demandées, l'instance est persistée jusqu'à ce que le message BlockTxn correspondant soit traité. Lors de la réception du message BlockTxn, partiellement download block :: fillblock est appelé, tentant de reconstruire le bloc complet. Dans le cas de collision décrit ci-dessus, le bloc complet est demandé, mais l'instance partiellement téléchargée ainsi que l'autre État lié à la demande de bloc sous-jacente est restée intacte. Cela laisse la place pour un deuxième message BlockTxn pour le même bloc à traiter et déclenche à rejouer Fillblock. Cela viole l'hypothèse (documentée comme une déclaration d'affirmation) que Fillblock ne peut être appelé qu'une seule fois et provoque le plantage du nœud.

Un attaquant n'a pas besoin d'avoir de la chance en déclenchant une collision, car la logique de gestion des collisions peut facilement être déclenchée en incluant simplement des transactions dans le message BlockTxn qui ne sont pas engagées dans la racine Merkle du bloc.

Attribution

Le crédit va à Niklas Gögge pour avoir découvert et divulgué la vulnérabilité, ainsi que pour résoudre le problème dans https://github.com/bitcoin/bitcoin/pull/26898.

Chronologie

  • 2022-10-05 - Niklas Gögge rapporte le problème à la liste de diffusion de la sécurité de Bitcoin Core.
  • 2023-01-24 - PR # 26898 Le contenu du correctif est fusionné.
  • 2023-05-25 - Bitcoin Core 25.0 est libéré avec le correctif.
  • 2024-10-09 - Divulgation publique.