Bitcoin Core の脆弱性 CVE-2024-35202 が FIX:リモート・ノードがクラッシュする恐れ

Bitcoin Core Vulnerability (CVE-2024-35202) Enables Remote Node Crashes

2024/10/13 SecurityOnline — Bitcoin Core に、深刻度が高い脆弱性 CVE-2024-35202 (CVSS:7.5) が発見された。この脆弱性の悪用に成功したリモートの攻撃者は、バージョン v25.0 未満を実行している Bitcoin Core ノードを、クラッシュさせることが可能だとされる。この問題は、cmpctblock メッセージ経由で受信したブロックを、Bitcoin Core が再構築しようとする際に発生する。

通常では、Bitcoin ノードがブロックの通知を受信すると、ノードは自身のメモリプールに保存されているトランザクションや、その他の利用可能なトランザクションを用いて、通知されたブロックを再構築しようとする。また、データが欠落しているために再構築に失敗した場合には、そのノードが getblocktxn メッセージを送信して、ブロックを通知したピアに対して、欠落しているトランザクションを要求する。そのピアは、要求されたトランザクションを blocktxn メッセージで返信する。

Bitcoin Core の compact block プロトコルは、使用帯域幅を削減するために、短縮されたトランザクション識別子 ( short ID) を使用している。これらの short ID は、わずか 6-Byte であるため、異なるトランザクションが同じ short ID を共有するという、衝突の可能性が高くなっている。このような衝突が発生した場合に Bitcoin Core は、フォールバック・メカニズムを使用し、問題を解決するためにフルブロックを要求する。

しかし、Bitcoin のアドバイザリでは、「新しいコンパクト・ブロックを受信するたびに、Bitcoin Core は PartiallyDownloadedBlock インスタンスを作成する。不足しているトランザクションが要求された場合には、対応する blocktxn メッセージが処理されるまで、そのインスタンスは保持される」と説明されている。

脆弱性 CVE-2024-35202 は、同じブロックに対して、2番目の blocktxn メッセージを受信したときに発生する。つまり、FillBlock 関数が2回呼び出されることで、この関数は1回しか呼び出されないという、コードの主要な前提条件に違反することになる。その結果として、ノードがクラッシュする。

脆弱性 CVE-2024-35202 を悪用するのは容易である。ブロックの merkle root と一致しないトランザクションを、意図的に blocktxnメッセージに取り込むことで、ノードをクラッシュさせることが可能となる。Bitcoin の情報開示によると、「攻撃者は、クラッシュを誘発させてラッキーを待つ必要はない。この衝突処理ロジックは、ブロックの merkle root 内でコミットされていないトランザクションを、blocktxn メッセージに取り込むだけで容易にトリガーできるからだ」という。

この脆弱性が浮き彫りにするのは、Bitcoin Core のような洗練され確立されたシステムであっても、トランザクション処理プロトコルの欠陥に対して脆弱になり得ることだ。この脆弱性の悪用に成功した攻撃者は、Bitcoin Core ノードでサービス拒否 (DoS) 攻撃を引き起こし、ネットワークの安定性と機能性を混乱させる可能性を得る。

ノードをリモートでクラッシュさせる能力は、Bitcoin の分散型ネットワークにとって深刻な脅威である。こうしたクラッシュにより、攻撃者による資金へのアクセスやデータ窃取が可能になるわけではないが、攻撃の規模が拡大した場合には、深刻な混乱が引き起こされる可能性が生じる。なぜなら、このクラッシュの影響を受けたノードが再起動を必要とし、取引処理に一時的な遅延が生じる可能性があるからだ。

すでに Bitcoin Core v25.0 以降で、脆弱性 CVE-2024-35202 は修正されている。ユーザーに対して強く推奨されるのは、このバージョンでノードを更新することである。また、この脆弱性の発見/修正をした Niklas Gogge から、パッチも公開されている