Proof-of-Stake(PoS)の仮想通貨に固有の脆弱性 「Fake Stake攻撃」
仮想通貨を使っていると「51%攻撃」という言葉を耳にしたことがある人も多いのではないだろうか。
コンセンサスアルゴリズムにPoW(Proof-of-Work)を採用している仮想通貨では、取引の検証作業に協力する人々(マイナー)が高い計算力を持つマシンを用いて検証速度を競い合い、また互いに確認しあうことでブロックチェーンの正当性を担保している。
しかしこれは、仮に悪意を持った人物がマイナー全体の計算能力の過半数を占めることができるなら、ブロックチェーンを意のままに改竄できることを意味する。それが「51%攻撃」と言われるもので、実際にこれまでにいくつものPoW仮想通貨が被害を被ってきた。
Proof-of-Stake仮想通貨に固有の脆弱性が見つかる
このようなPoW通貨の脆弱性を補うために登場したコンセンサスアルゴリズムがPoS(Proof-of-Stake)だ。PoSでは、計算能力の高さではなく所持しているコインの数量に比例してマイニングの成功率が変わる仕組みが導入された。
これによって「51%攻撃」を企図する者は計算能力の51%以上ではなく、そのコインを51%以上用意する必要が生じることになる。仮に攻撃が成功して自分に有利な内容へブロックチェーンを改竄することができたとしても、攻撃を受けたという事実によってそのコインの相場は暴落してしまう可能性が高い。
そのため、攻撃者は儲けを得ることができないばかりか、逆に大損をしてしまうリスクさえある。攻撃するリスクとメリットが釣り合わないのだ。このためPoS通貨は攻撃に強いと言われてきた。
だが、そんなPoS通貨にも固有の脆弱性が見つかってしまったという。アメリカのオンラインメディアMediumで発表された「Fake Stake攻撃」がそれだ。
Fake Stake攻撃とは
発表によると、PoSv3を採用するUTXO型PoSコインの一部においてFake Stake攻撃への脆弱性が確認されたという。Fake Stake攻撃の仕組み自体はシンプルなもので、大量のブロック情報を送り付けることでリソース枯渇を引き起こし、ネットワークを麻痺させるというもののようだ。以下にその仕組みを詳述したい。
PoS通貨のウォレットは互いに接続しあうことで巨大なネットワークを構築しているが、そのネットワークに接続している個々のウォレットを「ノード」と呼ぶ。各ノードは自身がマイニングに成功するとその情報に自らのUTXO情報を加えて他のノードへと送信し、それがネットワーク全体へと伝搬されていく。
そしてその内容が問題なければ(二重払いなどの不備がなければ)正当なブロックチェーンとして次のブロックがその後ろに連なっていくことになるのだが、ブロックのマイニングに成功するのは一人だけとは限らない。
仕組みと詳細について
Aというノードがマイニングに成功している時、Bという別のノードが(ネットワークのタイムラグ等の事情により)Aの成功に気付かないままマイニングに成功することもあり得る。そうすると、CというノードにA・Bそれぞれがマイニングしたブロックが伝搬されてくることになる。
各ノードは同じブロックについて作者が違う複数のブロック情報を受け取ることが日常的に発生しているのだ。それ自体は問題ではない。より長いブロックを繋げたチェーンが正当なものとして続いて行き、負けたチェーンは淘汰されていくからだ。
問題は、複数のブロックを受け取る際の仕様に潜んでいたのだという。ノードはブロック情報を受け取る際、まずは容量の小さいヘッダー情報だけを受け取ってその情報がどの程度信頼ができるかの判断を行っている。そして一定の信頼ができそうだと判断すれば容量の大きいブロック本体をダウンロードして内容を検証する仕組みだが、この信頼する条件に問題があったというのだ。
原理的に考えれば、ヘッダー情報を信頼する為には次の3点を満たす必要がある。
- 条件①:ヘッダーが一定の形式要件を満たす
- 条件②:UTXOの所有権が証明できる
- 条件③:UTXOが本当にUTXOであることが証明できる
UTXO(Unspent Transaction Output)は直訳すると「未使用トランザクションアウトプット」となる。ビットコインなど多くの仮想通貨ではブロックチェーン上にアカウントの残高は記録しておらず、トランザクション(トランザクション)から残高を算出している。トランザクションはインプット(送金元)とアウトプット(送金先)の情報で構成され、アウトプットとして記録されるのがUTXOである。UTXOは送金する際のインプットとして消費される他、ウォレット上ではアドレスに紐づくUTXOが自動集計されて残高が表示されている。
条件①は形式要件であるし、条件②も署名情報によって簡単に解決できる。しかし条件③は、究極的にはブロックチェーンを全て読み解かないことには確認できない。ノードは最も長いブロックチェーンにおける直近のUTXO一覧を保持しているものの、フォークしているチェーンのものまでは保持していない。そのため条件③はさておき、条件①②をクリアできればそのブロック本体をダウンロードする仕様となっていたようだ。
この隙を突いて考案されたのがFake Stake攻撃だ。
Fake Stake攻撃と、その危険性
UTXOを用意する必要がないのであれば、自身の署名が使える使用済のTXを用意してヘッダー情報を作成するだけで、他のノードを騙してブロック本体をダウンロードさせることができる。偽のヘッダーを大量に用意して最大容量のブロックを付け加えれば、他のノードはそれらを全てをダウンロードしようとするためメモリやディスク容量が逼迫してクラッシュしてしまうというわけだ。
攻撃にUTXOが必要ないということはすなわち攻撃者はコインを所持している必要すらないということになる。これは前述した、攻撃によってむしろ大損をするリスクが大幅に軽減されることを意味する。
PoS通貨への攻撃によって利益を得ることは依然として難しいかもしれないが、攻撃がより容易になったという点において、Fake StakeはPoSの安全性を揺るがす脆弱性といえるだろう。今後、各通貨での対策が進むことを期待したい。