- 未だ残るBitcoinフルノードの脆弱性
- 2018年9月18日、Bitcoin Coreの脆弱性、CVE-2018-17144が報告され、フルノードのDoS(サービス拒否攻撃)を引き起こしうる問題が含まれていたことが判明している。ビットコインでは、そうした脆弱性を持つノードはどれくらい放置されているのだろうか。その詳細を調査した。
脆弱なノードはどれくらいあるのか? その脆弱性とは
ビットコインでは、脆弱性を持つノードはどれくらい放置されているのだろうか。この点について、有名な Bitcoin Core 開発者である分析結果を公開している。
記事執筆時点(5/11)で、たった32.75%のフルノードがアップデート済みとなっており、全体としては70%近くが脆弱という結果が示されている。なぜこのような結果になっており、脆弱性が残っているにもかかわらず、注意喚起されていないのだろうか。
PSA: a lot of people believe there are about 10,000 Bitcoin nodes. This is incorrect, this number is the amount of *listening* nodes.
The total number of Bitcoin full nodes now exceeds 100,000. pic.twitter.com/VYziaKCYzg
CVE-2018-17144」が報告された。フルノードのDoS(サービス拒否攻撃)を引き起こしうる問題が含まれていたためだ。技術的には、以下のような問題があったとアナウンスされている。
Bitcoin Core 0.14では、2012年に追加された1つのトランザクション内に同じインプットを2回使用していないかチェックする初期のリレー前ブロックの検証中に、コストのかかるチェックを回避する最適化が追加された。
UTXOの更新ロジックはそのような条件が0.14で違反されていないことをチェックするのに十分な知識を持っているが、完全なエラー処理ではなくサニティチェックアサーションでのみ行う(ただし0.8以前このケースを2回完全に処理した)。
したがって、Bitcoin Core 0.14.Xでは、ブロック内の単一のトランザクション内でトランザクションアウトプットを二重使用しようとすると、報告されていたようにアサーションエラーとクラッシュが発生する。
Bitcoin Core 0.15では、未使用のトランザクションアウトプットの追跡を簡略化し、リソース枯渇攻撃への脆弱性を修正するための、より大きな再設計の一環としてアサーションが僅かに変更された。アウトプットが未使用から使用済みにマークされたか検証する代わりに、存在するかどうか検証するだけになった。
したがって、Bitcoin Core 0.15.X, 0.16.0, 0.16.1および0.16.2では、使用されているアウトプットを同じブロック内に作成されたブロック内の単一のトランザクション内で二重使用しようとすると、同じアサーションエラーが発生する(0.16.3のパッチに含まれているテストケースに存在する)。
ただし、前のブロックで二重使用されたアウトプットが作成された場合でも、エントリーはDIRTYフラグがセットされたままCCoin mapに残っており、使用済みとマークされているため、アサーションは発生しない。これによりマイナーがBitcoinの供給量を増やすことが可能になり、増やした値で二重使用する可能性がある。
問題となるのは、9/20に開示された「0.15」における問題だった。簡単に言えば、条件を満たすことでコインを増殖させることができるというものだ。
実際、YentenやBitzenyといったビットコインからフォークしたコインでは対応が遅れたため、攻撃者が脆弱性を利用してコインを増殖させるというインシデントが発生してしまった。
この脆弱性はBitcoin Coreバージョン 0.16.3および 0.17.0rc4で修正されており、公式アナウンスによれば、過半数以上のフルノードが脆弱性に対応済みだと考えられてきた。しかし、詳しく調査してみると、古いバージョンのノードが多数放置されている実態が浮かび上がってきた。
くすぶり続けるリスク
脆弱なフルノードが多数残っているということは、時価総額が最も高いビットコインでさえ、攻撃のリスクを抱えているということだ。ただし、攻撃が即座に可能だ、というわけではない。
前述のYentenやBitzenyとは異なり、ビットコインのハッシュレートは非常に高い。したがって、一部のフルノードをDoS攻撃でクラッシュさせたとしても、51%攻撃を成功させるためのハードルは高いままだろう。
また、増殖に関しても同様だ。0.15など一部のバージョンでのみ動作するため、大多数のハッシュレートを管理するマイナープールなどが最新バージョンを使っている限り、起こりえないと言っていい。
もし読者の方々にフルノードをお持ちの方がいたら、バージョンを忘れていないか、確認して頂きたいと願うばかりだ。