マイナーが他のノードのundoデータを破損させ得るバグの詳細を開示します。 このバグを悪用すると、特定のブロックの組み合わせで再編成が発生した場合、 あるいはWindowsおよび32 bitシステムでは影響を受けるブロックが接続された時点で、 ノードをシャットダウンさせることができます。ただし、このバグを実際に悪用することは現実的ではありません。 64 bitシステム向けの修正はBitcoin Coreバージョン29.5、30.4、31.2および32.1でリリースされました。 32 bitシステムおよびブロックをFAT32上に保存しているノードは引き続き影響を受けます。
この問題の重大度は 低 と見なされており、容易に発見可能な脆弱性に分類されています。
詳細
再編成中にブロックを切り離す際、Bitcoin Coreはそのブロックが使用したアウトプットをundoデータから読み取ります。
undoデータはrev*.datファイルに保存され、各ファイルは対応するブロックを格納するblk*.datファイルと対になっています。
ブロックファイルのサイズは128 MiBに制限されていますが、undoファイルにはサイズ制限がなく、
ファイル内の位置は32 bit整数として保存されていました。
マイナーは、undoデータがブロック自体よりもはるかに大きくなる有効なブロックを生成でき、
1つのundoファイルを4 GiB超まで増大させることができます。それを超えると32 bitの位置の情報がオーバーフローし、
新しいundoデータが古いundoデータを上書きする可能性があり、
さらにブロックファイルが確定される際にファイルはオーバーフロー後の長さに切り詰められます。
その後の再編成で影響を受けたブロックが切り離されると、ノードはそのundoデータを読み取れずシャットダウンします。
再起動しても解決せず、復旧には修正済みバージョンでの-reindexが必要です。
Windowsおよび32 bitシステムでは、ファイル位置指定の呼び出しが2 GiBに制限されているため、 undoファイルが2 GiBを超えた時点でノードはundoデータの書き込みに失敗し、再起動のたびにシャットダウンします。 この場合、必要なundoデータは約半分で済み、再編成も不要です。
64 bitシステムでこれを悪用するのは現実的ではありません。関係するトランザクションは非標準であり、 攻撃者はそれらを含むブロックを数千個、すなわちネットワーク全体のブロック生成量のおよそ1か月分をマイニングしなければなりません。 現実的な長さの再編成で済ませるには、さらに攻撃者のブロック約18個が標的ノードのいずれかのブロックファイルのちょうど末尾に 配置される必要があり、そのうえで攻撃者は、その最後の1つだけを置き換える2ブロックの再編成に勝たなければなりません。 ブロックファイルのレイアウトはノードごとに異なるため、すべてのノードに有効な配置は存在せず、 再編成に失敗すれば準備は無駄になります。理論上は、各ノードのファイルをさらに精密に制御できれば、 攻撃者は再編成中にノードに誤ったコインを復元させ、UTXOセットを破損させることも可能です。
この問題は、ブロックファイルおよびundoファイル内の位置を64 bit整数として保存し、 Windowsでは64 bitのファイル位置指定の呼び出しを使用することで修正されました。 位置は可変長整数としてシリアライズされるため、ディスク上のフォーマットは変わりません。
32 bitシステムでは、これらのリリースでも依然として2 GiBに制限された位置指定の呼び出しを使用しているため、 上述の障害の影響を引き続き受けます。ブロックディレクトリがFAT32ファイルシステム上にあるノードも引き続き影響を受けます。 FAT32はファイルサイズを4 GiBに制限しているため、undoファイルがそのサイズに達するとundoデータの書き込みが失敗し、 ノードは再起動のたびにシャットダウンします。この場合、必要なundoデータの量は他の64 bitシステムと同じですが、再編成は不要です。
貢献
この問題は、SpiralにおけるElias RohrerのProject Loupeの一環として実施された、 LLMによる自動スキャンによって発見されました。Loupeの発見はGregory Sandersによって検証され、 Bitcoin Coreチームに報告されました。
タイムライン
- 2026-07-08 - Project Loupeが問題を報告
- 2026-08-21 - L0rincが独立して問題を報告
- 2026-10-23 - Andrew Dormanが独立して問題を報告
- 2026-10-26 - Antoine Poinsotが修正を含むPR #36669をオープン
- 2026-10-26 - PR #36669がmasterにマージされる
- 2026-10-26 - 修正がPR #36658で32.xブランチにバックポートされる
- 2026-10-26 - 修正がPR #36661で31.xブランチにバックポートされる
- 2026-10-26 - 修正がPR #36664で30.xブランチにバックポートされる
- 2026-10-26 - 修正がPR #36666で29.xブランチにバックポートされる
- 2026-10-27 - Bitcoin Core 31.2および32.1が修正と共にリリースされる
- 2026-10-28 - Bitcoin Core 29.5および30.4が修正と共にリリースされる
- 2026-10-28 - 開示
