エクリプス攻撃の概要
P2Pネットワークに対する攻撃の1つです。
P2Pネットワークにおいて複数のネットワークを結び付けるような重要な役割を果たしているノード(あるいはノード群)に対して実行することでネットワークを分断します。攻撃が成功すると、攻撃を受けたノードを通して結びついているネットワークは、攻撃者による恣意的な情報操作を受けることになります。
BitcoinやEthereumで話題となったことからブロックチェーンに対する攻撃手法と思われがちです。これは、ブロックチェーンは基本的にP2Pネットワークをとることから誤りではありません。しかし、攻撃手法としてはP2Pネットワークであることの性質を利用したものであり、ブロックチェーン以前から存在するものです。
以下の内容は、P2Pネットワークをとるブロックチェーンを想定するものとします。また、以下において基本的にノード=ピアと捉えてもらって構いません。
スポンサードサーチ
エクリプス攻撃で生じる問題
攻撃対象となるブロックチェーンによって生じる問題は異なってきますが、主に以下が挙げられるでしょう。
二重支払い
エクリプス攻撃が成功すると、攻撃を受けたノードの接続するノードは、全て攻撃者によってコントロールされます。攻撃されたノードが接続するノードは全て攻撃者のものであるため、操作された情報を与えられ、実際のブロックチェーンの状態を認識できません。これを利用して、攻撃者は二重支払いを起こすことができます。
攻撃者は、攻撃したノードとトランザクションのやりとりをします。このとき、攻撃者⇒攻撃を受けたノードへのトランザクションについては、攻撃を受けたノード用のもの(トランザクションAとする)とそのノードを除くブロックチェーン全体用のもの(トランザクションBとする)を用意します。一方で、攻撃を受けたノード⇒攻撃者へのトランザクション(トランザクションCとする)はそのノードを除くブロックチェーン全体にブロードキャストします。
このとき、攻撃されたノードと、そのノードを除くブロックチェーン全体のそれぞれの視点で見たときの有効なトランザクションは次のようになります。
- 攻撃されたノード視点:A、C(Bの存在を知らない)
- 攻撃されたノードを除くブロックチェーン全体視点:B、C(Aの存在を知らない)
攻撃者は、トランザクションB、Cがブロックに取り込まれたあと、ブロックチェーン全体の状態を攻撃したノードに見せることで、攻撃したノードに対して発行したトランザクションAを無効にすることができる一方で、トランザクションBは有効のままとすることができます。
こういった事態を防ぐためにトランザクションのコンファメーション作業があるのですが、0コンファメーションだけでなくNコンファメーションを要する設定であっても、エクリプス攻撃によって攻撃者の有するハッシュパワーが高い場合は無効にされる可能性があります。
セカンドレイヤへの攻撃
仕組みとしては二重支払いと同じで、攻撃者がノードの接続先を占有することで行われます。二重支払いでは「ブロックチェーンの状態を誤認」させましたが、セカンドレイヤへの攻撃では「セカンドレイヤの状態を誤認」させます。
例えば、Lightning Networkのペイメントチャネルが実際はclose状態であるのにopenのように見せかけて、攻撃者がペイメントチャネルを介してコインを送り、のちに無効化したりします。
ブロックレースにおける工作行為
エクリプス攻撃を受けたネットワークのハッシュパワーが攻撃者に渡ることにより、マイナーのリソースを浪費させることができます。
エクリプス攻撃を受けたマイナーが見つけたブロックに攻撃者のハッシュパワーを向け、ブロックチェーンを伸ばします。競合するブロックが見つかったら(=ブロックチェーンの分岐が起こったら)、攻撃者のハッシュパワーでマイニングしていたブロックをエクリプス攻撃を受けたマイナーと受けてないマイナーの両方へ流します。通常、攻撃を受けていないマイナーのハッシュパワー>攻撃を受けたマイナーのハッシュパワーなので、攻撃を受けたマイナーが正と思っていたチェーンの再編成が起こり、攻撃を受けたマイナーが費やしたハッシュパワーは無駄になってしまいます。
マイニングパワー(ハッシュパワー)の分散
エクリプス攻撃を受けたネットワークのハッシュパワーがブロックチェーン全体のハッシュパワーから差し引かれることになります。ハッシュパワーによりセキュリティを担保しているPoW型のブロックチェーンでは、これにより51%攻撃の実行コストが下がり、リスクが高まります。
セルフィッシュマイニング(Selfish Mining)/Block Withholding Attack
エクリプス攻撃を受けたネットワークのハッシュパワーは攻撃者のコントロール下にあります。この性質を利用することで、ブロックのマイニング報酬を最大化したり、場合によっては二重支払いを引き起こしたりすることができます。
エクリプス攻撃が成功したノードを含めて攻撃者の有するハッシュパワーが十分に大きい場合、攻撃者は単独でより長いチェーンを形成できる可能性が高まります(十分に大きいとは必ずしも51%以上のハッシュパワーを占めることを指しません)。
このとき、攻撃者はマイニングしたブロックをブロードキャストせずに意図的に保留しておき、隠れて独自にチェーンを伸ばします。ブロックチェーンの原則として「複数のチェーンがある場合最も長いチェーンが正当」とみなされますので、攻撃者のチェーンがそれまで正当とみなされているチェーンより長くなった段階でいつでも隠していたブロックを一気にブロードキャストすることで、攻撃者のチェーンを正当なものとすることができます。
これにより、攻撃者は複数ブロックのマイニング報酬を手にすることができます。また、それまで正当とされていたブロックが全て無効になるので、無効になるブロックと攻撃者のブロックに同じアドレスから異なるアドレスへのトランザクションを忍ばせておくことができれば、二重支払いを引き起こすこともできます。
エクリプス攻撃の条件
攻撃対象が接続するピアを全て攻撃者のピアで置き換えなくてはいけません。その観点から、基本的には以下のような条件が求められます。
ピアのアイデンティティを攻撃者が容易に作ることができること。
攻撃対象のピアの接続先を全て攻撃者のピアで置き換えるためには、まず、攻撃者が十分な数のピアを予め作っておく必要があります。ピアのアイデンティティの作成にかかるコストは、攻撃者の攻撃実行コストに直結します。
ピアの接続先をインバウンドコネクションのみで埋めることができること。
インバウンドコネクション(他者から接続されたコネクション)で埋めることができれば、攻撃者が一方的に情報を流すことができます。アウトバウンドコネクション(自分から接続したコネクション)が必要な場合でも、ピアの選択方法に何らかのバイアスが入り込むなど欠陥がある場合、これを利用してアウトバウンドコネクションを攻撃者のピアで埋められる可能性が高くなります。
ピアの接続先がリブート/消去されるタイミングがあること、あるいは接続先を書き換えることができること。
攻撃対象のピアの接続先が仮に固定だとすれば、攻撃することができません。書き換えることができたり、あるいは接続先が消去されるタイミングがあることが必須です。
エクリプス攻撃の対策例
上述のエクリプス攻撃の条件から、例えば次のような対策が打てます。
- 物理的なリソース等、容易には準備できないものと組み合わせてピアのアイデンティティの作成を難しくすること
- ピアのインバウンドコネクションの数に上限を設けること
- アウトバウンドコネクションの数を増やすこと
- 確立できる接続数の上限自体を上げてしまうこと
- ピアの選択方法をより操作の受けにくいものにすること
- 接続先ピアの一部にランダムに選ばれたものを入れること
- リブートなどが行われても、いくつかのインバウンドコネクションを自動的に引き継げるようにすること
以上はBitcoinやEthereumでエクリプス攻撃が話題になった時に挙がった対策の一例ですが、例えばDFINITYなどではそもそも継続的にネットワークの構成を強制的に変更することでこれを防ごうというような考えも出ているようです。確かに、ブロックチェーンの場合、有力なノードに攻撃することができるから攻撃のメリットがあるのであって、ネットワーク構成が変わって有力なノードが必ずしもそうでなくなるとすれば攻撃するメリットがなくなってしまいますね。