スマートコントラクトの代表的な脆弱性であるReentrancy問題に関して2回目の記事です。
Reentrancy問題とは、複数の呼び出し元から同時に呼び出された場合に問題が発生してしまうことを指します。
今回は、Reentrancy問題のあるコントラクトに対して攻撃を行うコードを実装します。
実装(攻撃する側)
攻撃を行うサンプルソースは次の通りです。
[ソースコード]
1 | pragma solidity ^0.4.11; |
各関数は次のような処理を行います。
- Fallback関数 (14-23行目)
攻撃対象のコントラクト(前回実装したコントラクト)の返金処理 msg.sender.call.value(userBalances[msg.sender])()がコールされると、呼び出される関数です。
返金処理の中で再度、引き出し処理を行うのがもっとも重要なポイントとなります。 - sendEthToTarget関数 (30-32行目)
攻撃対象のコントラクトへ送金する処理です。 - withdraw関数 (35-37行目)
攻撃対象のコントラクトへ返金を要求する処理です。
次回は、攻撃対象のコントラクトと攻撃用のコントラクトをデプロイして動作確認を行います。