P2P・ブロックチェーンへの攻撃手法
管理者のいない分散ネットワークは、中央集権システムとは異なる攻撃にさらされます。代表的な攻撃の仕組みと、それを防ぐための設計上の工夫、そして実際のBitcoin・Ethereumがどう対処してきたかを見ていきましょう。
左: 標的は多様な正常ピアと接続。右: 接続先がすべて攻撃者ノードに置き換えられ、本来のネットワークから隔離されている。
シビル攻撃(Sybil Attack)
シビル攻撃とは、一人の攻撃者が大量の偽のアイデンティティ(偽ノード)を作り出し、ネットワーク内で多数派を装って影響力を不正に握る攻撃です。名前は多重人格を描いた小説「シビル」に由来します。1台の実体が何千ものノードを名乗れてしまえば、「多数決」や「ランダムな相手を選ぶ」といったP2Pの前提が崩壊します。
ここで効いてくるのが分散合意のPoW/PoSです。PoWは「1票を投じるのに現実の計算資源が必要」、PoSは「1票に資産のロックが必要」という仕組みによって、アイデンティティを無限に増やすことを経済的に不可能にします。これがシビル耐性の本質です。アイデンティティの数ではなく、計算力や出資量という「偽造できない希少資源」で発言権を測ることで、シビル攻撃を無力化しています。
一方、明確なシビル耐性を持たないDHT(Kademliaなど)では、攻撃者が特定のID空間に大量のノードを配置し、そのキー領域の検索を乗っ取ったりデータを隠蔽したりできてしまいます。通常のKademliaはノードIDを自己申告できるため、攻撃者は狙った鍵に近いIDを自由に大量生成できてしまうのが弱点です。
これに対処するのがS/Kademlia(Secure Kademliaの拡張)です。ノードIDの生成にcrypto puzzle(計算パズル)を課しIDを公開鍵やIPアドレスから一方向に導出させる点、探索を1経路に頼らず複数の独立経路(disjoint paths)で並行照合し異常を検出する点が核心です。同一IPサブネットからの登録数に上限を設けるのも一般的な緩和策です。
Eclipse攻撃(Eclipse Attack)
Eclipse攻撃は、標的となる1つのノードの接続先を、攻撃者が用意したノードだけで埋め尽くし、正常なネットワークから「隔離(日食=eclipse)」してしまう攻撃です。標的は自分では正常に通信しているつもりでも、見えている世界はすべて攻撃者が用意した偽物です。
シビル攻撃がネットワーク全体の多数派を狙うのに対し、Eclipse攻撃は特定ノードの「視界」だけを支配する点が異なります(多くの場合シビル攻撃で作った偽ノードを土台に行われます)。隔離されたノードには攻撃者が選んだ取引やブロックだけが届くため、以下のような悪用が可能になります。
- 二重支払いへの応用: 標的(例えば商店のノード)に「支払いが確定した」と誤認させて商品を受け取り、実際のネットワークではその取引を無効化する。
- マイニング能力の詐取: 隔離したマイナーの計算力を無駄打ちさせたり、攻撃者に有利なチェーンを掘らせたりする。
- 情報の遮断・改ざん: 標的が本来のチェーンの状態を知ることを妨げる。
- 検閲: 特定のアドレスからのトランザクションだけを標的の視界から隠し、送金が届いていないように見せかける。
対策は「接続先の多様性」を高めることに集約されます。アウトバウンド接続の数を確保し、接続先IPを幅広いアドレス範囲から選び、既知の信頼ノードを固定的に持つ、といった工夫が、実際のBitcoin・Ethereum実装にも導入されています。
Bitcoinでの実装対策
BitcoinのP2Pネットワークでは、2015年発表の研究(Heilmanらによる "Eclipse Attacks on Bitcoin's Peer-to-Peer Network")を契機にピアアドレス管理機構(addrman)が見直されました。主な対策は次の通りです。
- アウトバウンド接続の確保: 自分から能動的に接続する経路を一定数維持し、外部から一方的に接続されるインバウンドだけに依存しない設計にする。
- feeler connection: バックグラウンドで未検証のアドレスへ短時間だけ試験接続し、生存確認が取れたものだけを信頼度の高い「tried」テーブルへ昇格させる仕組み。攻撃者が大量の未検証アドレスを送りつけても、生存確認を経ない限り信頼テーブルには残らない。
- アドレスバケットの分散設計: ピア候補アドレスを送信元IPやネットワークグループ(/16単位など)に基づき複数バケットへ分散させ、単一の攻撃者が特定バケットを独占しにくくする。
- 既知シードノードの併用: 起動直後のルーティングテーブルが空でEclipseされやすい期間を短くするため、信頼できるDNSシードやハードコードされたシードノードを併用する。
Ethereumでの実装対策
Ethereumのノード発見プロトコル(discv4/discv5)もKademlia系のDHTがベースで、同様にEclipse耐性が課題です。同一/24サブネットからの受け入れ数に上限を設けて接続集中を防ぐこと、--bootnodesで起動時に信頼ノードへ確実に接続すること、ノード識別情報(ENR)に署名検証を要求してなりすましのコストを高めることなどが対策です。
ルーティングテーブル汚染とDHTへの攻撃
Eclipse攻撃の一種として、DHTのルーティングテーブル汚染があります。攻撃者は管理下の偽ノード情報を被害ノードのk-バケットやフィンガーテーブルに送り込み、正規のノードを追い出して置き換えます。テーブルが汚染されると検索クエリは常に攻撃者の経路をたどるようになり、特定キー範囲への到達を妨げたり偽の応答を返したりできてしまいます。
- 生存確認を経た置換のみ許可: 多くのKademlia実装では、新しい候補ノードが来ても既存バケット内のノードにpingを送り、応答がある限り古いノードを優先して残す「least-recently-seen」方式を採用する。これにより短時間に大量の偽ノードを送りつける攻撃の効果を弱める。
- 複数経路での検索: 前述のS/Kademliaのように、1つの経路の結果だけを信用せず複数の独立経路の結果を照合する。
- ID生成コストの付与: ノードIDを公開鍵やIPアドレスから一方向に導出し、攻撃者が任意のIDを自由に選べないようにする。
51%攻撃の経済学
51%攻撃は、過半数の計算力(PoW)やステーク(PoS)を握り、取引の巻き戻しや検閲を行う攻撃です。詳細な仕組みは分散合意のPoWの項を参照してください。ここでは「なぜ多くのチェーンで現実的に成立しにくいか」という経済的な側面を見ておきます。
過半数の計算力を得るには、自前で設備を保有・増強する(初期投資が巨大)か、ハッシュレートを貸し借りする市場から借りる(レンタル可能な量には限りがある)かのいずれかです。ネットワーク全体のハッシュレートやステーク総額が大きいチェーンほど攻撃コストは高く、小規模なチェーンほどレンタル市場だけで狙われやすいとされます。
PoSでは不正を行ったバリデータの担保が没収されるスラッシングの設計が多く、攻撃者自身の資産が毀損される抑止力が働きます。攻撃が露見すればチェーンの信頼性が損なわれ、トークンを大量保有する攻撃者自身が最大の被害者になるという「自己抑止」の構造も指摘されます。取引所では、着金確定に必要な承認数(confirmation)を通貨のリスクに応じて引き上げる運用が一般的です。
| 攻撃手法 | 主な標的 | 前提条件 | 主な対策 |
|---|---|---|---|
| シビル攻撃 | ネットワーク全体の多数決 | ID生成が低コスト | PoW/PoS、crypto puzzle |
| Eclipse攻撃 | 特定ノードの接続先すべて | 接続先を占有できること | アウトバウンド多様化、feeler connection |
| ルーティングテーブル汚染 | DHTの検索経路 | 偽情報をバケットに注入 | 生存確認、複数経路での照合 |
| 51%攻撃 | 取引の確定・検閲耐性 | 過半数の計算力/ステーク | スラッシング、承認数引き上げ |
| ルーティング(BGP)攻撃 | インターネット経路そのもの | ISP・経路制御層への介入 | 暗号化、複数経路での接続 |
| DDoS・アンプ攻撃 | ノードの可用性・帯域 | トラフィックの生成・増幅 | レート制限、なりすまし対策 |
DDoSとアンプリフィケーション攻撃
Eclipse攻撃が「標的に見せる情報を操作する」攻撃なのに対し、DDoS(分散型サービス拒否)攻撃は大量のトラフィックや接続要求でノードを埋め尽くし、帯域・CPU・メモリを枯渇させて可用性そのものを奪います。大量の無効なトランザクションやメッセージをブロードキャストしてメモリプールや帯域を消耗させる「スパムトランザクション」もこの一種です。
特に注意が必要なのがアンプリフィケーション(増幅)攻撃です。UDPのようなコネクションレスなプロトコルでは送信元IPを詐称(スプーフィング)できます。被害者のIPを送信元に偽装したリクエストを大量のノードへ送ると、応答はすべて被害者に届きます。応答がリクエストより大きい(増幅率が高い)プロトコルほど少ない攻撃トラフィックで大きな被害を生めるため、UDPベースの発見プロトコルでは正当性確認のハンドシェイクや、検証前に大きな応答を返さない設計が重要です。
- レート制限・接続数の上限: 単一ピアからのメッセージ量やコネクション数に上限を設ける。
- ミスビヘイビアスコアリング: プロトコル違反や過剰な要求を行うピアに「ban score」のような減点を加算し、閾値超えで切断・ブロックする。
- なりすまし対策のハンドシェイク: 送信元IPを検証する往復(チャレンジ・レスポンス)を要求し、スプーフィングへの大きな応答を防ぐ。
- メッセージへのコスト付与: トランザクション中継に手数料や最小限のPoWを要求し、無料でネットワークに負荷をかけられないようにする。
実例に学ぶ防御とよくある誤解
前述のBitcoinのEclipse攻撃対策(addrmanの刷新、feeler connectionの導入)は、研究論文の公開を受けて実装が改善された典型例です。Ethereum Classicのように相対的にハッシュレートが小さいPoWチェーンは過去に複数回51%攻撃を受けており、主要な取引所は入金の承認数を引き上げる運用に切り替えました。いずれも「攻撃が起きうる」前提で設計・運用が更新された事例です。
- 誤解: ノード数が多いほど安全。生成コストがほぼゼロなら数が多くてもシビル耐性は得られない。重要なのは数ではなく「偽造できない希少資源」との結びつきである。
- 誤解: PoWは51%攻撃に絶対安全。ハッシュレートは市場でレンタルでき、ネットワーク全体のハッシュレートが小さいチェーンほど相対的な攻撃コストは下がる。
- 誤解: 通信が暗号化されていればEclipse攻撃を防げる。暗号化は内容の秘匿・改ざん検知には有効だが、「誰と接続するか」という接続トポロジの支配は防げない。対策は接続の多様性の確保にある。
- 実務上の注意: ライトクライアントやモバイルウォレットは接続ピア数が少なく、フルノードよりEclipse攻撃の影響を受けやすい。複数の情報源で残高や着金を確認する運用が有効である。
これらの攻撃研究は、「悪意ある参加者がいても壊れない」ことを前提に設計するというビザンチン耐性の思想を、具体的な実装の積み重ねとして体現したものです。