ブロックチェーンにおける主要な攻撃や問題まとめ

ブロックチェーンへの攻撃や問題についてまとまっている記事が見当たらなかったので説明していきたいと思います。

まだまだ沢山あると思うので紹介していない攻撃がありましたらコメントで教えていただけたら幸いです。
また間違いがありましたら直したいと思うのでご指摘お願いします。

説明する攻撃は
・51%攻撃
・セルフィッシュ・マイニング攻撃
・二重支払い攻撃
・シビル攻撃
・Dos攻撃
・トランザクション展性
・Nothing at Stake問題
・ロングレンジ攻撃
・スケーラビリティ問題
です。

##51%攻撃
Proof of Workにおいては全ハッシュパワーの51%(50%以上)を攻撃者が所有した場合、
Proof of Stakeでは、全コインの51%(50%以上)を攻撃者が所有した場合、
つまり<b>通貨ネットワークの全採掘能力の半分以上を攻撃者が所有した際に起こりうる攻撃</b>で、攻撃者が自分に有利なブロックを他のノードよりも早く繋げていくことが可能になり、下で説明する二重支払い攻撃や特定のアカウントのトランザクションを妨害するといったことをすることで、<b>正常な取引システムが崩壊</b>してしまう攻撃。
Proof of WorkやProof of Stakeは、全採掘能力の半分以上を個人が所有するのは実質的に不可能という根拠に基づいて作られていると考えられますが、ネットワーク全体のハッシュパワーが弱い通貨では起こりうる可能性があります。
51%攻撃を行うと、当然その通貨の信用が急落するので価格も急落します。なので攻撃者に利益が無いので実際には起こらないとされていましたが、2018年5月16日にBitcoin Goldで発生し、約20億円の被害が出ました。
対策方法はありませんが、Asic耐性のあるハッシュは、ネットワーク全体のハッシュパワーが出にくい為、他の通貨からハッシュパワーが流れてきた場合に起こりやすいと考えられます。

##セルフィッシュ・マイニング攻撃(Block withholding attack)
攻撃者があるブロックのマイニングに成功してもそれをブロードキャスト(世界に公開)せずに自分で持ち続け、それに繋がるブロックを自分で次々とマイニングしていくことでチェーンを長くしていき、本流のチェーンの長さを超えたあるタイミングで作ったチェーンをブロードキャストし<b>ブロックチェーンを巻き戻させる</b>攻撃。
巻き戻し自体はブロックチェーンの正しい働きであり不正でもバグでもないですが、この巻き戻しを利用して下で紹介する二重支払い攻撃を使って取引所から不正に利益を得ることが出来ます。
この攻撃はネットワーク全体の33%以上のハッシュパワーを持つことで成功すると言われています。
以前までは、攻撃者は利益をあげることが出来ないので現実的ではないとされていた攻撃ですが、取引所相手に二重支払い攻撃を仕掛けることによって、攻撃者に利益が上がってしまう攻撃となってしまいました。
実際に、モナコインで攻撃が発生し、約1000万円の被害が出ています。

##二重支払い攻撃(Double Spend Attack)
主に上の51％攻撃やセルフィッシュ・マイニング攻撃と共に使用されます。
一度成立した取引を巻き戻し、支払いをなかったことにする攻撃。
ブロックチェーンで攻撃者が利益を得るためにはこの攻撃が基本です。


####例)セルフィッシュ・マイニング攻撃と共に行われる場合
1)とある通貨で攻撃者が3つのウォレットA,B,Cを持っていて、Aには10コイン、B,Cには0コインがあるとし、Bはある取引所のウォレットとする。

2)今、ネットワークにはt-1番目までのブロックが連なったチェーンPがあり、攻撃者がt番目のブロックのマイニングに成功した。この時、攻撃者はt番目のブロックは公開せずに自分でt+1番目以降のブロックをチェーンPよりも早くマイニングし続け、PからフォークしたP'のチェーンを作っていく。

3)本来のチェーンPは他のノードによって伸ばされ続けるが、ここで攻撃者は<b>AからBへ10コイン送金するトランザクション</b>を世界に公開し、そのトランザクションをチェーンPのブロックに取り込ませる。ただし、攻撃者が伸ばすP'のチェーンにはこのトランザクションは含めずに、<b>AからCへ10コイン送金するトランザクション</b>を含めておく。

4)ネットワークではチェーンPで合意が取れているものとなっているので、攻撃者は取引所のウォレットBに10コインが反映されたらすぐにその10コインを売って他の通貨に替えて出金する。

5)出金が完了したら、チェーンPよりも長くなっているチェーンP'のt番目以降のブロックをブロードキャストしていく。ネットワークのノードは最も長いチェーンを正しいものとみなすようになっている為、遅れてきたチェーンP'が正しいチェーンとなる。その際、<b>AからCへ10コイン送金するトランザクション</b>がチェーンP'に先に含まれている為、<b>AからBへ10コイン送金するトランザクション</b>はAに残金がないので送金を行うことができずネットワークから消される。

こうすることで攻撃者はコインを失うことなしに取引所から不正に利益をあげることが出来ます。

対策としては、ブロックの承認数を上げることが挙げられます。
ブロックの承認数を上げることで、攻撃者が正しいチェーンよりも早くチェーンを伸ばし続けることを困難にすることが出来ます。

##シビル攻撃(Sybil Attack)
攻撃者が沢山のID(ユーザ)を作り攻撃すること。
ブロックチェーンではある種の投票によってチェーンが決まりますが、<b>この投票を1IDにつき1票とすると攻撃者が大量のIDを作り出すことによって正しい投票を妨害</b>する事が出来ます。
なので、実際はProof of WorkやProof of StakeのようにハッシュパワーやStakeの量などによって確率的な合意をしています。

##Dos攻撃
ブロックチェーンにおいて、意味のないトランザクションを大量に作り出すことによってネットワークを妨害する攻撃。
対策は、トランザクションに手数料を設けることで攻撃者のトランザクション生成を抑制することが出来ます。

##トランザクション展性(Transaction malleability)
マウントゴックスの事件の際に行われた攻撃。
Bitcoinの脆弱性を突き、<b>トランザクションの取引内容は変えずにトランザクションIDであるトランザクションのハッシュを変える</b>ことで二重支払いを起こす方法です。
ハッシュは変わるが内容は正しい為、同じ内容で異なるIDのトランザクションが存在することになることを利用します。
マウントゴックスの事件の際は、
1)攻撃者がマウントゴックスからBitcoinを引き出すトランザクションを作る

2)攻撃者がその作られたトランザクションのハッシュを変える

3)マウントゴックスはトランザクションIDをDBに保管しておいて、同じIDがブロックの中に入っていたら取引が行われたと判断していたので、ハッシュが変えられたトランザクションが先に承認された場合、実際にはトランザクションは実行されているのにマウントゴックスでは把握できなかった為、何度も自動で再送金のトランザクションを作り出す。

このようにしてマウントゴックスは大量のBitcoinを盗み取られました。

対策としては、BitcoinではSegwitの実装があります。

##Nothing at Stake問題
主に純粋なProof of Stakeで起こりうる問題です。Proof of Stakeではある条件を満たした通貨を一定数保有していることによって採掘に参加することが出来ます。純粋なProof of Stakeは採掘の際に必要となる計算量が少ないので、Proof of Workのように<b>採掘に失敗しても失うものがありません。</b>(Proof of Workでは採掘に失敗し続けると電気代が損失になっていきます。)
なので攻撃を意図していないマイナーであっても、より利益をあげるための最適戦略は<b>フォークした全てのチェーンに対してブロックを生成すること</b>になります。(Proof of Workではフォークした全てのチェーンに対してブロックを生成しようと試みると各ブロックにかけられる計算力が下がる為、逆に成功確率は減ります。)
これによってチェーンが収束しなくなるという問題です。

対策としては、EthereumのSlasherのように二重投票が見つかった場合にデポジットの没収などがあります。


##ロングレンジ攻撃(Long Range Attack)
主に純粋なProof of Stakeで起こりうる問題で、例えば6万ブロック前からチェーンをフォークさせて正しいチェーンを追い抜きネットワークを乗っ取る攻撃。
なぜこんな事が可能なのかというと、純粋なProof of Stakeは通貨の保有量(デポジット)に比例して採掘が簡単になるので、フォークした初めのうちは当然採掘速度が遅いですが、1000、2000...と連続で採掘をしていくにつれ保有数が増え、採掘難易度がとても易しくなっていき、いずれ本流のチェーンを追い抜くという現象が起こるからです。

対策としては、現在のブロックから720ブロック以前のブロックからのフォークは認めないといったものがあります。

##スケーラビリティ問題
ほぼすべてのブロックチェーンプロダクトが直面している問題で、現在のアルゴリズムでは<b>マイニングに参加している計算機全てが同一の計算</b>をしているので(例えるなら、1万人が同時刻にばらばらの場所で同じ計算問題に挑んで1人が答えを出せたら「答えが出ました」とみんなにメールでお知らせしてから、1万人が次の問題にまた同時に取り掛かるといった仕組み)、利用者が増加してもネットワークの処理能力を増加させることが出来ず、取引量が増加した際に<b>トランザクション詰まりや手数料の増加</b>が起こります。

対策としては、同時に複数のトランザクションの処理を試みるShardingや、サイドチェーン技術を利用するPlasma、オフチェーン処理を利用するLightning NetworkやRaiden、ブロックサイズを大きくする、などが提案されています。