リプレイアタックとは何か?
前回ハードフォークとソフトフォークについての記事を書いたので、今回はハードフォークの際に行われる「リプレイアタック」について書きます。
リプレイアタックとは
リプレイアタックは、ハードフォークによってブロックチェーンが2種類のチェーンに分岐した際に行われる可能性のある攻撃です。
【詳解】ハードフォークとソフトフォークの仕組みで見たように、「後方互換性のない仕様変更」が提案され「マイナーの過半数がそれに賛同する」ことで2種類の異なるチェーンへの分岐が起きます。
以下の画像で、分岐後のBitcoin と Bitcoin Cashを例にリプレイアタックを説明します。
ハードフォークによって分岐した2種類のチェーンはもともと同一のチェーンですので、同じ秘密鍵を使っています。
そのため、画像のようにBitcoinの方でAさんが悪意のあるBさんへ送金したとすると、BさんはそのトランザクションのデータをそのままBitcoin Cashネットワークに伝搬します。
Aさんによるデジタル署名が成されたトランザクションデータは中身を何も改変しなければそのまま正当なトランザクションですので、Bitcoin Cashのチェーンのブロックにそのトランザクションは正常に書き込まれることになります。
これによってAさんはBさんにBitcoinを送金しただけであるにも関わらず、Bさんに同額のBitcoin Cashも送金してしまったことになります。
悪意のある主体がハードフォーク後の2種類のチェーンを使って行うこのような攻撃をリプレイアタックと言います。
実際に行われるリプレイアタック
実際に行われる例として、「仮想通貨取引所と悪意のあるユーザー」の間で行われるリプレイアタックがあります。
ここでもBitcoinとBitcoin Cashを例に説明します。
まず悪意のあるユーザーは、ハードフォーク後に自分の持っているBitcoinを取引所に送金します。
その後、その「自分→取引所」の送金トランザクションをリプレイアタックをし、Bitcoin Cashのネットワークにもブロードキャストすることで、仮想通貨取引所にBitcoin Cashも送金されたことになります。
この時点でのユーザーの取引所での仮想通貨残高には、 送金したBitcoin と Bitcoin Cashが含まれているため、ユーザーはBitcoinとBitcoin Cashの両方を自分のウォレットに引き出します。
その後、再びBitcoinを取引所に送金し、リプレイアタックをするというのを繰り返すことで、取引所から永遠にBitcoin Cashを盗むことができるのです。
リプレイアタックへの対策
リプレイアタックは「ハードフォークによる分岐後の2種類のチェーンが同じ秘密鍵を使っており、それによって生成されたトランザクションデータがどちらのチェーンのものか判別できない」ということが原因で発生します。
そのため、ハードフォークによる分岐時に、トランザクションデータに「分岐後の何番目のチェーンかなどの識別子」をつけた上で、その識別子をチェックするようなリプレイプロテクションという仕様を実装することで対策がされています。