論文解説: Hijacking Bitcoin: Routing Attacks on Cryptocurrencies

論文解説: Hijacking Bitcoin: Routing Attacks on Cryptocurrencies お知らせ
Table of Contents

この論文[1]では、ルーティング攻撃による暗号通貨の影響についてまとめられている。

暗号通貨に対する既存の攻撃には以下のようなものが挙げられている。

  • 二重使用攻撃
  • Selfish Mining 攻撃
  • Eclipse 攻撃
  • トランザクション展性
  • Sybil 攻撃

ルーティング攻撃は暗号通貨に限らず様々なシステムで見られる攻撃手法だが、暗号通貨ではこれまであまり注目されていなかった。それは、実践的ではないと考えられていたからだ。システムに影響を与えるには多くのネットワーク接続を傍受する必要があり、暗号通貨のような広大なP2Pネットワークを混乱させることは難しいからである。しかし、日常的に発生しているBGPハイジャックやBitcoinノードの集中化によって、この種の攻撃が実践可能な領域になっている。

この論文には2つの攻撃について記載されている。パーティショニング攻撃とディレイ攻撃である。以下では、この2つの攻撃の概要とそれが与える影響について紹介し、最後にこれらの攻撃を防ぐ対策についてまとめる。

パーティショニング攻撃

概要

パーティショニング攻撃はBGPハイジャックを用いて、あるノードの集合を完全にネットワークから分離させる攻撃である。分離させるノードの合計マイニングパワーによって、ネットワークに与える影響の大きさは変化する。具体的には、ゼロ認証トランザクション二重使用やブロックチェーンのフォーク、Selfish Mining 攻撃などが発生する可能性がある。

攻撃手順

まず攻撃者はネットワークから分離させるノードの集合Pを探す(Pは攻撃者の目的によって異なる)。攻撃者は図の右側と左側の集合に分離させることを目標とする。双方のネットワークは青色で示されたBitcoinコネクションでコミュニケーションしている。攻撃者は中央のISP8だと仮定する。
攻撃者はISP(1, 2, 4, 6)に広告しBGPハイジャックを行う。これにより、左右のネットワークを横切るトラフィックが攻撃者を通過するようになる。図で言うと、青線が赤点線になる。
攻撃者を跨ぐような通信があった場合、攻撃者はそのトラフィックを傍受できるためそのパケットを確認し、Bitcoinに関連するパケットであればそれを破棄する。Bitcoin関連のパケットを攻撃者が破棄することで、パケットの到達性がなくなるためネットワークを分断することができる。攻撃中は同じ領域のノード同士でのみ通信が可能になる。



Bitcoinではパケットが暗号化されていないため、攻撃者はパケットを見るとそれがBitcoinに関係するものなのか判断できる。具体的には、ポート番号がデフォルトの8333番を使用していたり、TCPペイロードにBitcoinヘッダーが含まれているかをチェックする。関係のないパケットは正当な宛先にフォワードバックすれば良い。

攻撃者は確実にノードの集合をネットワークから分離するためには情報の漏洩ポイント(完全に分離できておらず、外のネットワークからパケットを受け取っているノード)を特定して排除する必要がある。そのためのアルゴリズムについては割愛する。

ディレイ攻撃

概要

ディレイ攻撃は特定のノード集合への、またはノード集合からのブロック伝搬を遅らせえる攻撃である。パーティショニング攻撃は攻撃対象のトラフィックを完全に傍受する必要があるが、このディレイ攻撃は接続の部分集合を傍受しているだけでも効果的である。また、攻撃者は自然にパケットを傍受しているため、攻撃がバレにくい特徴がある。攻撃者は Bitcoin メッセージを操作することで最大 20 分の遅延を作ることが可能である。攻撃者は標的ノードの50%の接続を傍受することで、最新の Bitcoin ブロックについてその時(稼働時間の) 60 %の確率で知らせないままにする可能性がある。ルーティングレベルでの Bitcoin の集中化のせいでかなりの割合の Bitcoin トラフィックの傍受が実用的である(Hurricane Electric は通常時で Bitcoin 接続の 30 %以上を傍受できる)。なお BIP152[2]の導入によってこの攻撃は現在対策されている。

攻撃手順

ディレイ攻撃は Bitcoin プロトコルの 3 つの面を活用している。

  • Bitcoin ノードがブロックを交換する方法の非対称性
  • 上記のメッセージが改竄に対して保証されていないこと(暗号化されていない、整合性が保証されていない)
  • Bitcoin ノードがピアからブロックを要求した後、別のピアからブロックを再度要求するまでに20分間待機するという性質

攻撃の概略を以下に示す(攻撃者:AS8, 標的:C)。

  1. A と B が C にブロック Xを INV メッセージで広告。A からのメッセージが最初に到達
  2. C は GETDATA メッセージを A に返し、タイムアウトの 20 分まで返事を待つ
  3. 修正された GETDATA を A は受けとり、攻撃者は間接的に A がノード C に送る内容を管理できる

この方法で検知も切断もなく、20 分までブロック伝搬を遅らせることができる。または、攻撃者は BLOCK メッセージを修正する。これらの特徴は、実際の BLOCK もしくは GETDATA メッセージが横切る限り、攻撃者は標的の 1 つの方向でも傍受できれば遅延させることが可能とする。

もし、標的からのトラフィックを傍受できたら、GETDATA の内容を修正することができる。メッセージ長や構造を保持し、TCP と Bitcoin のチェックサムを更新することによって、修正されたメッセージが受け手によって認められ、接続は維持される。もし、攻撃者がノードへのトラフィックを傍受したとき、代わりに標的が無効と見なすような BLOCK メッセージの内容を破損することができる。どちらの場合でも、ブロックの受け手は 20 分間知らされないままである。

標的からのトラフィックを傍受した場合と標的となるノードへのトラフィックを傍受した時の攻撃メカニズムを説明する。前者の方がより効果的である。

標的からのトラフィックを傍受した場合

  1. INV メッセージで入手可能な新しいブロックの告知を受け取った場合、GETDATA メッセージでダウンロードを要求する。上図(左)より、最初に受け取った INV 先のノードに要求を行う
  2. 攻撃者は標的からのメッセージを修正して送信する(Block#42 -> Block#30)
    単にパケットをドロップするよりも、そうすることの利点は、メッセージの長さが変更されないままであるということである。パケットが破棄された場合、攻撃者は接続の両方向を傍受し、後続のすべてのパケットの TCP シーケンス番号を更新して、接続が切断されないようにする必要がある
  3. ブロックを送信しないと標的ノードは20分後に接続を切断する。それを避けるために、異なるGETDATAメッセージを20分以内に送る必要がある
    攻撃者は20分以内に最初の要求したブロックを標的に届けるので切断も、攻撃の検知もされない

標的へのトラフィックを傍受した場合

※ この攻撃が終わる20分後には接続が切断されてしまう。

  1. 攻撃者は GETDATA よりも BLOCK メッセージに焦点を当てている
    素朴な攻撃ではパケットを単にドロップするだけだが、そうするとすぐに TCP コネクションを切断されてしまう。攻撃者にとってより良く単純なアプローチは、パケット長は変えずに BLOCK の内容を壊すことだ。これはチャックサムが違うので、標的に届いた時に捨てられる。著者は標的が同じブロックまたは他のピアからのものであっても、ブロックを再び要求しないことを発見(および検証)している。

INVメッセージの内容を詐称することもできるが、その場合は標的の全接続を攻撃者が管理していないと成功は保証されない。

対策

短期対策

  • ノード接続多様性の増加
    • マルチホームの推奨
    • シングルホーム -> VPNの利用(通信の暗号化)
  • ルーティングピアを選択する
    • 追加のピア
  • 往復時間(RTT)の監視
    • RTTを監視することで攻撃を検知し、追加の接続を始める

長期対策

  • Bitcoin通信の暗号化、MAC(Message Authentication Code)の採用
    • パケット破棄、盗聴、改竄の防止
    • 各メッセージのコンテンツを検証(改竄検知)
  • 異なる制御・データチャンネルの使用
    • 8333を利用して相互接続に用いるTCPポートを交渉する
  • 複数接続からブロックの要求を行う

参考

[1] https://btc-hijack.ethz.ch/files/btc_hijack.pdf
[2] https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki

タイトルとURLをコピーしました