仮想通貨ノードに対するDoS攻撃

Fake Stake攻撃とは、特定の仮想通貨ネットワークにおけるP2P(Peer to Peer)で接続されたノードに対してリソース枯渇を引き起こす脆弱性です。本件は2019年1月23日にMedium誌で、当該脆弱性を発見した、米イリノイ大学アーバナ・シャンペーン校 電気・コンピュータ工学科のDecentralized Systems Labによって公開されました。

本脆弱性は、26種のProof of Stake(PoS)を採用している仮想通貨に影響があることがわかっています。また、本脆弱性を有している仮想通貨ノードに対して、攻撃者はごく僅かな資金でDoS攻撃の実行が可能となります。また、対象の仮想通貨ネットワークに接続している全ての端末が攻撃の対象となります。そのため、攻撃のタイミングによって、マイニング(PoSの場合forging、minting、stakingなどと呼ばれます)を含む様々な処理が正常に完了できない場合があります。例えば、マイニング専用の仮想通貨ノードを運用している場合には、起こりうる影響としてマイニングの実施ができない期間が発生します。

Proof of Stakeとは

Proof of Stakeとは、仮想通貨のマイニングに密接に関係しています。仮想通貨のマイニングとは、仮想通貨の取引内容の検証を行うものであり、マイニングに成功したマイナーには検証の報酬が支払われます。マイニングにおける取引内容の検証や承認、報酬が支払われるまでのプロセスはコンセンサスアルゴリズムと呼ばれ、PoSは複数存在するコンセンサスアルゴリズムのうちの一つです。その他にも、Proof of Work(PoW)やProof of Importance(PoI)、Proof of Consensus(PoC)が著名です。

このうちPoSのマイニングは計算能力でなく、仮想通貨の保有量や保有時間によって報酬を得られるマイナーを決定する(コンセンサス)アルゴリズムとなります。このPoSには様々な種類があり、Delegated Proof of StakeやProof of Activityなどがあります。

Fake Stake攻撃の対象となる仮想通貨

今回の脆弱性はPoSを採用している全ての仮想通貨が対象ではなく 、Bitcoinで用いられているUTXO(Unspent Transaction Output)を採用している仮想通貨が対象となります。すなわち、Bitcoinから派生したPoS系の仮想通貨が本脆弱性の対象です。

このUTXOは、残高をトランザクションの取引データに基づいて計算し管理する方法です。しかしながら、本脆弱性の対象にBitcoinは含まれていません。対象とならない理由については、後述する「フォークチェーンの正当性」と「二つの脆弱性」を併せてご確認ください。

UTXO(Unspent Transcation Output)とは

UTXOとはブロックチェーンに記録されている未使用のトランザクションを指します。トランザクション(TX)には仮想通貨の着金と送金を記録する箇所があり、トランザクションには、着金と送金の両方が記録されたもの(TX)と着金のみ記録されたもの(UTXO)があります。

具体例として、2名の登場人物(A、B)間で発生したトランザクションを考えます(ここでは仮に仮想通貨をBitcoinとします)。まずAからBへ1BTCを送金したとします。この場合、Aが保有する1BTCの残金を示したトランザクション(UTXO)に対してBへ1BTC送金されたことが記録されます(UTXOではなくなる)。また、今回の送金で生成された新たなトランザクションには1BTCの着金のみが記録されます(UTXOとなる)。この時、AからBへ1BTCの着金のみが記録されたトランザクションがUTXOとなり、Bが1BTC保有しているという状態を表現することができます。

フォークチェーンの正当性

脆弱性の原理を示す前にBitcoinにおけるブロックチェーンの生成と正当性の確認方法について説明します。

まず、既に多数のトランザクションが発生しており、マイナーによる承認を待っている状態とします。このとき、PoWでマイナーによって生成された多数のトランザクションをまとめたブロックが生成されます。ブロックの構造は、ブロックヘッダとトランザクションをまとめた領域に分けられます。さらに、マイナーが報酬を得るためのトランザクション(coinbaseトランザクション)がブロックに一つ含まれます(PoSの場合には、加えてcoinstakeトランザクションが追加されています)。

次に、マイニングで生成されたブロックは各ノードに対してブロードキャストされます。そして、各ノードは受け取ったブロックの正当性を確認し、正当であると判断されたものだけをブロックチェーンに追加します。また、ブロックチェーンに追加する対象となるブロックは、複数のマイナーによって同時に生成される場合があります。これら複数のブロックがブロックチェーン上に追加されてしまった場合、チェーンが分岐してしまいます。この状態をブロックチェーンが分岐(フォーク)すると呼びます。この分岐されたチェーン(フォークチェーン)は、より計算リソースを費やした最長のチェーンがメインチェーンとして認識され、次のブロックを追加する対象となります。

ここで、フォークされる前には同時に生成されたブロックに対して正当性を確認しなければなりません。しかし、UTXOにおいてフォークされたブロックの正当性を完全に判断することは困難とされています。また、仮に正当性の確認を行うために対象となる全てのブロック(無効なブロックを含む)をノードのストレージに保存した場合、ストレージコストが肥大化してしまいます。そのため、Bitcoinは受け取ったブロックヘッダを簡易的に評価し、ストレージに保存する対象を限定してストレージコストを抑えています。

簡易的な評価で十分である理由として、Bitcoinの正当なブロックヘッダを作成するコストは高く、厳密な確認を行わなくともある程度信頼できるブロックだけを選別することができるためです。このように簡易的に確認されたブロックヘッダは将来的に最長のチェーンとなる可能性があるものとして判断され、ブロック全体がノードのストレージにダウンロードされます。このストレージにダウンロードされたブロックに対して、正当性を完全に判断するためには、各フォークチェーンの先頭から末尾までのブロックの内容を確認する必要があります。しかし、UTXOの正当性を確認するコストは非常に高いため、Bitcoinはノードのパフォーマンスを考慮して、フォーク直前までロールバックし、その時点からUTXOの正当性を確認する方法を採用しています。

二つの脆弱性

Fake Stake攻撃は、二つの脆弱性を合わせた総称です。今回脆弱性の対象となっている仮想通貨は、どちらか一方の脆弱性にのみ影響しその両方に影響を受けるものはありません。以下にそれぞれの脆弱性について説明します。

一つ目の脆弱性について、RAMとストレージに対してリソースの逼迫を発生させるものです。RAMを逼迫させる脆弱性は、Proof of Stake Version3(PoSv3)のブロックヘッダを優先的にRAMへ格納する処理に起因します。PoSv3系の仮想通貨におけるブロックの正当性を確認する対象としてcoinstakeトランザクションがあることを上述しました。しかし、coinstakeトランザクションにおける情報はブロックヘッダには含まれておらず、ブロック内部を確認しなければなりません。そのため、本脆弱性に影響ある仮想通貨ノードは、受け取ったブロックヘッダをRAMに格納していきます。この時、RAMを埋めきるほどのブロックヘッダが送信された場合に、RAMの容量が逼迫してしまいます。

また、ストレージを逼迫させる脆弱性は、ブロックヘッダではなくブロックをローカルストレージに保存する処理に起因します。通常、ブロックを保存する際にはcoinstakeトランザクションの正当性を確認する必要があります。しかし、フォークされたブロックの場合、UTXOであることの検証が難しいという理由から、実装としてcoinstakeトランザクションの正当性を確認していないものがあるようです。この場合、大量のブロックが送られてきた際にはストレージ容量が逼迫してしまいます。以上のことから、RAMの脆弱性の場合は、ノードがcoinstakeトランザクションの正当性を確認を行う処理の前段階で起こりうる脆弱性であり、ストレージの脆弱性の場合は、そもそもcoinstakeトランザクションの正当性を確認していないために起こりうる脆弱性であることがわかります。

PoSv2以前ではブロックをノードに保存する前に簡易的にブロックの正当性を確認を実施する実装となっていました。そのため、一つ目の脆弱性は成立しません。しかし、二つ目の脆弱性は簡易的なブロックの正当性の確認方法に起因します。この簡易的なブロックの確認では、UTXOの確認までは実施できておらず、ディフィカルティと呼ばれる採掘難易度を満たしているかを確認する処理において、既に処理されたTXである場合においても通過してしまいます。ここで、DoS攻撃を成立させるためには大量のTXが必要となりますが、攻撃者自身のウォレット間で送金を繰り返すことで比較的少量の資金で大量のTXを作成することができます。この大量のTXを利用し、Stake Amplificationと呼ばれる手法を用いることで攻撃の実現が可能となります。

Fake Stake攻撃は仮想通貨ノードに対するDoS攻撃

今回公開された脆弱性は、UTXO系のPoSを採用している仮想通貨ノードに対するDoS攻撃と言えます。2018年10月から、影響のある暗号通貨の開発チームに対して本脆弱性の情報が提供されており、対策が取られつつあります。その中で、緩和策として幾つかの対策が考えられていますが、これらは別の問題を引き起こす可能性やFake Stake攻撃に対する根本的な解決策にはなっていません。本脆弱性の対象となっている仮想通貨の中には、既に修正を実施しているものも存在します。直近では、2019年2月20日にPIVXの公式サイトで脆弱性の対応に関してレポートを公開しています。今後も各通貨の対応状況を確認することが重要です。

本記事執筆時点では本脆弱性を利用したDoS攻撃は確認されていませんが、将来的に攻撃が発生する可能性があります。なぜなら、少額で攻撃が成立してしまう可能性があり、資金面において攻撃者が攻撃を行うための敷居は低いと考えられるためです。仮に攻撃が発生した場合、通貨の価値が変動してしまう恐れがあります。例えば、トランザクションに対して2重払いや取り消しが可能な51%攻撃は、PoSにおいて攻撃を成立させるためには大量の仮想通貨を保有する必要があります。そのため、攻撃を実施することによる通貨価値の下落は、攻撃者に対して攻撃意欲を抑制する効果があります。しかし、Fake Stake攻撃の場合には少額で攻撃が実現可能なため、攻撃者以外の仮想通貨保有者に対する嫌がらせ行為などの目的によっては攻撃が発生する可能性があります。

仮想通貨もソフトウェアであるため、他のソフトウェアと同様に、以前のバージョンには存在しなかった脆弱性が、バージョンアップ後に発見されることがあります。2019年3月1日に適用されたEthereumのConstantinople(Ethereumのハードフォークの名称)は、リリースの延期が2度発生しました。直近の延期となった原因は、繰り返し資金を引き出せるリエントランシー攻撃が成立してしまう脆弱性が発見されたためです。この脆弱性は、Constantinopleと同時にSt.Petersburgとして適用されています。このように、仮想通貨は法定通貨と異なり、通貨を表現するためにソフトウェアが利用されています。そのため、仮想通貨を実現しているソフトウェアにおいて欠陥があると、その欠陥が脆弱性となり、攻撃につながる可能性があります。仮想通貨利用者の方々は、そのことを意識して利用することをおすすめします。

最後に、Fake Stake攻撃に影響ある仮想通貨をご利用の方々や仮想通貨ノードを運用されている方々は、リスク管理として各通貨の今後の対応動向に注目しておくことをおすすめします。また、仮想通貨ノードを運用されている場合、本脆弱性に対応したバージョンがリリースされた際にバージョンのアップデートを行うことをおすすめします。

執筆者プロフィール

セキュリティオペレーションセンター 守田 瞬

セキュリティ本部 セキュリティビジネス推進部 セキュリティオペレーションセンター データアナリスト