ビットコインのハッシュレートが急上昇する中、51%攻撃などは非常に非現実的であまり想定する必要はありません。コストとリターンも比較的はっきりしているため、金額によって何承認待つなどの対策を取ることもできます。むしろ、ビットコインはノード間のネットワーク層での攻撃への対策が遅れているという意見も聞こえます。

今日はビットコインのノードが互いに接続する仕組みを説明した上で、MITM攻撃とConnection Slot Exhaustion Attackについて、攻撃手法の概要と提案されている対策を説明させていただきます。

ノード同士が接続する仕組み

ビットコインノードは、P2P通信によって他のノードと繋がっており、このネットワーク上で未承認のトランザクションを伝播したり、ブロックを送受信したりしています。そしてこれらの通信は、LANやISPなどを経由して行われています。

ビットコインノードの同時接続可能数に上限があることをご存知でしょうか。Bitcoin Coreの既定では外部からの接続(Inbound Connections)を最大117接続、自身から外部への接続(Outbound Connections)を最大8接続、合計で最大125接続を維持することができます。

帯域幅を限定するために上限を引き下げたり、特定のノードとしか接続しないように設定することもできます。

名前から受ける印象とは異なり、どちらの種類の接続も機能は同様で、双方向に通信しています。したがって、外部からの接続を受け入れるノード(Reachable Node)は能動的に接続してくるノードやライトノードに接続先を提供しているネットワークへの貢献者と表現されがちですが、Unreachable Nodeもネットワークに貢献しています。

むしろUnreachable Nodeのほうが攻撃されにくいため(攻撃者は接続されることを待つしかない)、セキュリティにはプラスに作用しているという意見もあります。しかしReachable Nodeが少なすぎるとそこに接続が集中してしまうため、多いに越したことはないでしょう。

自宅でフルノードを動かしていても、基本的にはルーターでポート転送の設定を行っていないと外部からの接続を受け入れることはできないと思います。もし受け付けたいなら設定を確認してみてください。
豆知識ですが、Bitnodesなどで「ビットコインのノード数」として数えられるのは外部から認知できるReachable Nodeのみなので、全てのノードを含めるとその5倍ほどあると推定されています。
ノード間の通信を盗聴・改変する攻撃

ビットコインノード間の通信は既定では暗号化されていません。つまり、ネットワーク経路上の主体、例えばプロバイダー(ISP)や公衆Wifiの設置者などが通信内容を覗くとビットコインノードの通信を検出することができます

この場合、例えばトランザクションの配信を妨害したり、マイナーによるブロックの配信を妨害したり、特定のユーザーがビットコインを使用していることを認知することができてしまいます。また単に盗聴される他にも、ISPや公衆Wifiのプロバイダーなどによって内容が一部書き換えられることも想定できます。(署名されたトランザクションは改変できませんが、暗号化もしくは電子署名されていないデータは改変できます)

しかも、これらの攻撃をノードは検知できません。通信経路上で改変されたか、最初からおかしな内容が送信されたかわからないためです。
このような通信経路上の第三者による攻撃をMan-in-the-Middle attack = MITM攻撃と呼びます。

無意味な」接続で邪魔をする攻撃

Connection Slot Exhaustion Attackは、前述したInbound Connectionsという限られた資源を何者かが消費しつくすことでビットコインのユーザビリティを低下させたり、シビル攻撃を仕掛けるための環境を作る攻撃です。

シビル攻撃とは、同一の主体が大量のノード(ネットワークの大半)を作ることによって行う攻撃の総称で、ビットコインにおいてはネットワークを破断させたり、攻撃者がマイニングしたブロックのみを伝播したり、0承認のトランザクションで二重支払いを行ったり、タイミング攻撃でプライバシーを侵害することが考えられます。

攻撃方法は簡単で、大量にノードを作成し、Inbound Connectionsを受け付けない設定にすることで、作成したノード1つあたりネットワーク上の8つのInbound Connectionsを無差別に消費します。Inbound Connectionsが上限に達したノードは、新しい接続を受けるときに既存の接続のどれかを破棄するため、一般のユーザーが別のノードに再接続する必要が生まれます
この時点で、使用可能なInbound Connectionsが需要に対してあまりに足りないとユーザビリティが損なわれます。

そのとき、別に攻撃者の持つノードがInbound Connectionsを受け付けていた場合、多くの一般のノードがこれらの攻撃者のノードに接続することとなり、攻撃者によって作為的に配信される情報を受け取ることとなります

この攻撃は、クラウドなどを利用することで仕掛けるコストが安く済む割に、影響が大きくなる可能性があると考えられます。本記事では、BIP-154が対策の提案に該当します。

対策案:BIP-324, BIP-150, BIP-154

BIP-324 "Version 2 Peer-to-Peer Message Transport Protocol"が提案する変更を加えると、ビットコインノード間のP2P通信を暗号化することによって、盗聴や改変といったMITM攻撃を検知することができるようになります。(暗号化なしではMITM攻撃があったのか、元々送信されたメッセージなのか区別がつきません)
また、ビットコインが使用されていることを検知することが少し難しくなります。(しかし通信内容が見えなかったとしても、通信パターンによって推測することはできると考えられるので完璧ではありません)

BIP-150 "Peer Authentication"は、接続先のノードに任意で認証を行わせることによって、認証した一部のノードを一般のノードより優先することができるようにする方法を提案しています。この機能を使用すると、Connection Slot Exhaustion Attackによって大量の接続が来たとしても、認証したノードとの接続が破棄されることがなくなるので、悪意のあるノードによって他のノードとの接続を全て切られることがなくなります。

BIP-154 "Rate Limiting via peer specified challenges"の提案は、接続を受け入れる際に接続元のノードに一定量のProof of Workを行わせることによって、大量の接続を行う攻撃のコストを上昇させることです。一般のノードにとって他のノードへの接続の負担が大きすぎず、かつ攻撃者がASICを使うことで低コストで解くことができないよう、比較的ASIC耐性のあるアルゴリズムで実現することになっています。
(ただし、このBIPは支持をあまり得られず撤回されてしまいました)

まとめ

ビットコインのベースレイヤーはSegwitの導入以来、これといって派手な変更が行われていない印象があるかもしれませんが、ネットワーク層を含め目立たない部分で改良が重ねられています。それでも、導入されていない優れた提案もたくさんあります。

「国家によるビットコインへの攻撃」を想像したとき、多くの人がまず想像するのは法律での制限や投資の締め付け(税制の改悪などを含む)、トランザクションの追跡によるプライバシーの侵害などですが、ネットワーク層を通して静かに攻撃されることもありえます。あまり派手な側面ではありませんが、ネットワーク層での対策の導入によってビットコインにはもっと強固なものになっていってほしいところです。