リエントランシー攻撃とは
- 執筆
- CRYPTO PORT 編集部
- 公開日
- 更新日
- 読了目安
- 6 分
結論
リエントランシー攻撃は、コントラクトが外部を呼び出している途中に、再び同じ処理へ入り込まれることで残高の整合性が崩れる脆弱性です。設計上の順序の問題であり、監査や検証の対象として古くから知られています。利用者にできるのは、監査と実績のあるプロトコルを選び、資金を一か所に集中させないことです。
要点
- 外部呼び出しの途中で再度処理に入られる脆弱性
- 残高の更新と送出の順序が原因になる
- 監査と自動検査の主要な確認項目のひとつ
- 利用者は実績と監査の有無で資金配分を決める
定義
コントラクトが外部のアドレスを呼び出した際、その呼び出し先から元の処理が再び呼ばれることで、内部の状態が更新される前の値を前提に処理が繰り返されてしまう脆弱性。
スマートコントラクトは、他のコントラクトを呼び出せます。呼び出された側は任意の処理を実行でき、その中で呼び出し元の関数を再び呼ぶこともできます。もとの処理がまだ残高の更新を終えていない段階で再び入られると、更新前の残高を基準に処理が進んでしまいます。
この問題は、イーサリアム初期の大規模な事例を機に広く知られるようになり、以後の開発では「状態を先に更新してから外部を呼ぶ」という順序が基本原則として定着しました。処理中の再入を一時的に禁じる仕組みを併用するのも一般的です。それでも、複数のプロトコルをまたいだ呼び出しでは新しい形の再入が見つかり続けています。
利用者の立場でできることは、コードを読むことではありません。稼働年数、預かり資産の規模、複数の監査の有無、脆弱性報奨金の運用状況、そして過去に問題が起きた際の対応を見て、資金を置く先を決めます。新しい仕組みほど利回りが高いのは、その未検証の部分に対する対価だと理解しておくことも重要です。
実務上の分散も効きます。一つのプロトコルに全額を置かない、資金を置く期間を区切る、預けている先の監査報告や告知を定期的に確認する。これらは脆弱性そのものを消しはしませんが、想定外が起きたときに失う額を限定します。
注意点
- · 資金を預けるプロトコルは、稼働実績と複数の監査報告を確認してから選ぶ
- · 一つのプロトコルに全額を置かず、預け先と預ける期間を分ける
- · 利用中のプロトコルの告知や監査更新を定期的に確認し、異常時は早めに引き上げる