未だ残るビットコインフルノードの脆弱性とは

未だ残るBitcoinフルノードの脆弱性
2018年9月18日、Bitcoin Coreの脆弱性、CVE-2018-17144が報告され、フルノードのDoS(サービス拒否攻撃)を引き起こしうる問題が含まれていたことが判明している。ビットコインでは、そうした脆弱性を持つノードはどれくらい放置されているのだろうか。その詳細を調査した。

脆弱なノードはどれくらいあるのか? その脆弱性とは

ビットコインでは、脆弱性を持つノードはどれくらい放置されているのだろうか。この点について、有名な Bitcoin Core 開発者であるLuke Dashjr氏が分析結果を公開している。

記事執筆時点(5/11)で、たった32.75%のフルノードがアップデート済みとなっており、全体としては70%近くが脆弱という結果が示されている。なぜこのような結果になっており、脆弱性が残っているにもかかわらず、注意喚起されていないのだろうか。

bitnodeによれば、現時点で全世界におけるフルノードは 9540前後となっている。このうち大多数はアップデート済みのバージョンであり、このウェブサイトによれば、70%以上が比較的新しいバージョン(0.16.3以降)で動作していることがわかる。

しかし、カナダのBullBitcoinのCEOを務めるFrancis Pouliot氏によれば、フルノードは全体で10万に達するという。あくまで観測されている範囲で「リッスン」しているノードだけがカウントされる傾向にあり、その数が約1万と報告されている、というのだ。

thenextwebの記事において、Dashjr氏も「リッスンしているというのは、つまりポートがオープンになっているかどうか、というようなことだ。リッスンしているノードだけを見ても、あまり意味がある情報とは言えない。そこには、リッスンしていないノードが含まれていないからだ」と述べている。

Bitcoinを脅かす脆弱性「CVE-2018-17144」とは?

2018年9月18日、Bitcoin Coreの脆弱性、「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など一部のバージョンでのみ動作するため、大多数のハッシュレートを管理するマイナープールなどが最新バージョンを使っている限り、起こりえないと言っていい。

もし読者の方々にフルノードをお持ちの方がいたら、バージョンを忘れていないか、確認して頂きたいと願うばかりだ。

坪 和樹

Twitter:https://twitter.com/TSB_KZK

Linkedin:https://www.linkedin.com/in/tsubo/

プロフィール:AWSで働くエンジニア、アイルランド在住。MtGoxやThe DAO では被害を受けたが、ブロックチェーンのセキュリティに興味を持ち続けている。セキュリティカンファレンスでの講演、OWASP Japanの運営協力やMini Hardeningといったイベント立ち上げなど、コミュニティ活動も実績あり。


画像はShutterstockのライセンス許諾により使用

telegramテンプレ
▶️本日の速報をチェック
お問い合わせ 広告掲載はこちら