Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
独立メディア
いかなるプロジェクトとも無提携
最も深い暗号通貨の知識ベース
crypto-bible.com
最新
Solana 2026:DEX取引量はイーサリアムを超えるが、TVLはその10分の1——このギャップは何を意味するか  ·  暗号資産取引所選びは手数料だけじゃない:セキュリティ、コンプライアンス、出入金の完全評価フレームワーク  ·  ビットコイン vs イーサリアム:ともに暗号資産のトップだが、最も根本的な設計問題で全く異なる選択をした  ·  イスラエルの暗号資産税自主申告はわずか58人:失敗した政策実験が世界の課税のジレンマを明らかにする  ·  トークンの無限承認:DeFiで静かに付与してしまう「永久引き出し権限」とその取り消し方  ·  ラグプル識別ガイド:投資前に真剣に確認すべき6つの早期警告シグナル
用語解説 · wallet-and-security

Reentrancy Attack

リエントランシー攻撃
wallet-and-security 進階

30秒バージョン · 忙しい方へ
リエントランシー攻撃はスマートコントラクトの脆弱性を悪用する攻撃手法です:攻撃者はコントラクトが資金を送った後、内部状態(アカウント残高)を更新する前の時間窓を利用して、資金を受け取った瞬間に元の引き出し関数を再度呼び出します。これによりコントラクトが状態更新前に残高チェックを再び通過し、コントラクトが空になるまで繰り返し資金を引き出せます。2016年のThe DAO攻撃(約6,000万ドルの損失)がこの脆弱性を悪用し、イーサリアムのハードフォーク(ETH/ETCの分裂)を直接引き起こしました。
詳しく読む +
01 · これは何?

リエントランシー攻撃の技術的な原理は何か、コントラクト操作の「順序」がなぜそれほど重要なのか?リエントランシーの根本的な脆弱性は、スマートコントラクトが資金を転送した後に自分の台帳を更新することにあります——この操作順序が悪用の機会を生みます。正しいアプローチ:まず台帳を更新し(ユーザーの残高をゼロに設定)、それからユーザーに資金を転送します。脆弱なパターン:ユーザーに資金を転送し、転送完了後に台帳を更新します。問題:EthereumのCall()メソッドはコントラクトに支払うとき、ETHを受け取った瞬間に受取コントラクトのフォールバック関数を実行できます。攻撃者のフォールバック関数が元のコントラクトのwithdrawを再び呼び出します——この時点で台帳はまだ更新されていないので残高チェックがまた通ります。

02 · なぜ存在する?

The DAO攻撃とは何か、なぜそれほど重要だったのか?The DAO(分散型自律組織)は2016年のイーサリアム上のクラウドファンディングスマートコントラクトプロジェクトで、当時約1億5,000万ドル相当のETHを調達しました。2016年6月、攻撃者はThe DAOの引き出しコントラクトのリエントランシー脆弱性を悪用して繰り返し引き出し、最終的に約360万ETH(当時約6,000万ドル相当)を転送しました。イーサリアムコミュニティはハードフォーク(ブロックチェーンの状態を変更)して盗まれたETHをDAO投資家に強制返却するかどうかという根本的な選択に直面しました。今日のイーサリアム(ETH)の由来であり、ハードフォークを認めなかった少数派は元のチェーンを維持し——これがイーサリアムクラシック(ETC)の由来です。

03 · 意思決定にどう影響する?

リエントランシー攻撃をどう防ぐか?検証済みのパターンは何があるか?いくつかの標準的な防衛アプローチ。第一に、Checks-Effects-Interactions(CEI)パターン:最も基本的で重要な防衛原則。コントラクトの関数はこの順序で実行すべきです:Checks(まずすべての条件チェック)→ Effects(すべての内部状態を更新)→ Interactions(最後に外部コントラクトやアドレスと対話、送金など)。第二に、ReentrancyGuard(ミューテックスロック):OpenZeppelinが標準のReentrancyGuardモジュールを提供しています——本質的にはブール値のミューテックスロックで、関数実行中に「ロック済み」に設定し完了後にアンロックします。第三に、生のcall()を避けるtransfer()send()はデフォルトで2,300 Gasのみ転送します——複雑なロジックのフォールバックを実行するには不十分です。

04 · どうすればいい?

リエントランシー攻撃以外に一般的なスマートコントラクトの脆弱性タイプは何か?同様に重要なスマートコントラクトの脆弱性タイプをいくつか知っておきたい。整数オーバーフロー/アンダーフロー:Solidity 0.8の自動オーバーフロー保護前、数値計算は「ラップアラウンド」できました——残高偽造に悪用されました。安全でない外部呼び出し:外部コントラクトを呼び出すとき、戻り値を不正確に処理すると攻撃者が実行フローを制御できます。ロジックエラー:技術的な脆弱性でなくビジネスロジックの設計エラー。フラッシュローン攻撃:フラッシュローンの瞬間的な巨大流動性を使って1つのトランザクション内で市場やオラクル価格を操作します。

具体例 +

擬似コードを使ってリエントランシー攻撃の完全なフローを説明しましょう。各アドレスの残高を記録するbalancesマッピングを持つシンプルなイーサリアムの預金/引き出しコントラクトを想像してください。

脆弱なwithdraw関数:先に送金し、後で残高を更新します。

攻撃者はフォールバック関数を持つ悪意のあるコントラクトをデプロイします:ETHを受け取った瞬間にvictim.withdraw()を再度呼び出します。

攻撃のフロー:攻撃者がvictim.withdraw()を呼び出す→残高チェックが通る→コントラクトが攻撃者にETHを送る→フォールバックがトリガーされて再びwithdrawを呼び出す→この時点で残高はまだ更新されていないのでチェックがまた通る→ループ。

修正されたCEIバージョン:balances[msg.sender] = 0を先に行い、その後.call{value: ...}を行います。1行の順序変更で攻撃全体がブロックされます。

図解
Reentrancy Attack: Withdraw Before Balance Updates重入攻擊 vs 安全提款雙欄對比流程圖:左側綠色欄「正常提款(安全)」——步驟順序:① 呼叫提款 → ② 檢查餘額足夠 → ③ 先更新餘額為零 → ④ 再打款。右側紅色欄「重入攻擊漏洞」——關鍵差異:步驟三和四順序反轉:② 檢查餘額通過 → ③ 先打款(回調立即觸發,攻擊者在回調中再呼叫提款)→ 餘額尚未更新,步驟②再Reentrancy Attack: Withdraw Before Balance UpdatesNormal Withdraw (Safe)1. User calls withdraw(1 ETH)2. Check: balance ≥ 1 ETH ✓3. Update balance = 04. Send 1 ETH to user ✓Reentrancy Exploit1. Attacker calls withdraw(1 ETH)2. Check: balance ≥ 1 ETH ✓3. Send 1 ETH → callback triggers↺ calls withdraw(1 ETH) AGAIN before balance updates!4. Check STILL passes (balance not yet 0)Loop repeats until contract is drained. The DAO hack (2016, $60M) used this exact pattern.Crypto Bible · crypto-bible.com
スクリーンショット歓迎。転載時は出典を明記してください。
よくある誤解 +
✕ 誤解 1
× 誤解1:リエントランシーは古い脆弱性で、現代のスマートコントラクトはすべて防衛済みで心配不要だ。間違いです。リエントランシーは2016年から広く知られていますが、その後も多くのコントラクトがCEIを無視したり複雑なクロスコントラクト対話を導入したりして再びリエントランシーリスクを露呈しています。
✕ 誤解 2
× 誤解2:引き出し(withdraw)関数だけがリエントランシーの脆弱性を持てる。間違いです。状態更新前に外部呼び出しをするどんな関数もリエントランシーリスクを持てます。CEI原則は引き出しだけでなく、外部コントラクトと対話するすべての関数に適用されます。
The Missing Link +
直接的な影響

リエントランシーはスマートコントラクト設計の根本的なエンジニアリングのトレードオフを明らかにします:外部呼び出し(別のアドレスやコントラクトへの資金転送)と状態更新の間の順序。直感的な「先に送金、後で記録」のアプローチはビジネスロジックを明確にしますが、リエントランシーリスクを導入します。CEIの「先に記録、後で送金」のアプローチはビジネスロジックとしてやや直感に反しますが、リエントランシー問題を完全に排除します。このトレードオフには明確なコンセンサスの答えがあります——常にCEIを使う。しかしそれはスマートコントラクトのコードのセキュリティと直感的なビジネスロジックが時に微妙な衝突を持つことを思い出させます。

質問する
10文字以上入力してください