再入攻撃は最初は難しく見えます。簡単な言葉で説明し、スマートコントラクトを安全に保ついくつかの方法をショーします🛡️## 再入攻撃とは何ですか? 🧐これはContractAがまだ実行中のときにContractBがContractAにコールバックする時です。厄介なことです。攻撃者はこの脆弱性を利用して契約から資金を引き出すのが大好きです 💸想像してみてください:- ContractAは10ETHを保有しています- ContractBは1ETHを投入- ContractBはすべてを奪います## 攻撃メカニズム 🕵️♂️二つの重要なことが必要です:1. attack() すべてを始めるための関数2. fallback() スニーク部分のための関数流れは次のようになります:1. ContractB は、ContractA の withdraw() を呼び出す attack() を開始します2. ContractA が ContractB の残高を確認する3. ContractAがETHをContractBに送る4. これはContractBのフォールバック()をトリガーします5. ループは続きます。お金はなくなりました🚨これがどれほどシンプルでありながら壊滅的であるかは、ちょっと驚きです。## 脆弱なコード例 📝脆弱なコントラクトの例は次のとおりです:ソリディティ関数 withdrawAll() public {uint bal = 残高[msg.sender];require(bal > 0); 送信された(bool、 ) = msg.sender.call{value: bal}("");require(sent、「Ether の送信に失敗しました」); 残高[msg.sender] = 0;送信後に更新しますか?大間違い!}攻撃契約はこれを行います:ソリディティfallback() 外部未払金 {if(etherStore.balance >= 1 ether)etherStore.withdrawAll();}外部債務attack()関数 {require(msg.value >= 1 ether);etherStore.deposit{値: 1 ether}();etherStore.withdrawAll();}## これらの攻撃を止める三つの方法 🛡️### 1.nonReentrant 修飾子 🔒ソリディティbool private locked = false;修飾子 nonReentrant() {require(!locked, "再入禁止");ロック = true; _;ロック = false;}脆弱な関数に追加してください。シンプルですが効果的です。### 2. チェックス・エフェクツ・インタラクションズ・パターン 📊これは重要です:硬度関数 withdrawAll() public {uint bal = 残高[msg.sender];require(bal > 0); 残高[msg.sender] = 0;最初に更新 送信された(bool、 ) = msg.sender.call{value: bal}("");THENインタラクトrequire(sent、「Ether の送信に失敗しました」);}最初にあなたの状態を更新してください。その後、インタラクトしてください。常に。### 3. グローバルプロテクション 🌐より大きなプロジェクトのために:ソリディティ契約 GlobalReentrancyGuard {bool private locked = false; 修飾子 globalNonReentrant() {require(!locked, "再入禁止");ロック = true; _;ロック = false; }}すべての契約がこれを継承するようにしてください。より安全なエコシステム。## 最新のトレンド 🔥2025年9月現在、これらの攻撃は依然としてDeFiを悩ませています。開発者が同じ間違いを繰り返す理由は完全には明らかではありません。Slitherのようなツールはこれらの問題を見つけることができます。EchidnaとFoundryはそれらのテストを手助けします 🚀セキュリティは単に修飾子を追加することではありません。それはマインドセットです。外で警戒を怠らないでください! 🛡️
リエントランシー攻撃とその防止🔐方法について
再入攻撃は最初は難しく見えます。簡単な言葉で説明し、スマートコントラクトを安全に保ついくつかの方法をショーします🛡️
再入攻撃とは何ですか? 🧐
これはContractAがまだ実行中のときにContractBがContractAにコールバックする時です。厄介なことです。攻撃者はこの脆弱性を利用して契約から資金を引き出すのが大好きです 💸
想像してみてください:
攻撃メカニズム 🕵️♂️
二つの重要なことが必要です:
流れは次のようになります:
これがどれほどシンプルでありながら壊滅的であるかは、ちょっと驚きです。
脆弱なコード例 📝
脆弱なコントラクトの例は次のとおりです: ソリディティ 関数 withdrawAll() public { uint bal = 残高[msg.sender]; require(bal > 0);
送信された(bool、 ) = msg.sender.call{value: bal}(""); require(sent、「Ether の送信に失敗しました」);
残高[msg.sender] = 0;送信後に更新しますか?大間違い! }
攻撃契約はこれを行います: ソリディティ fallback() 外部未払金 { if(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }
外部債務attack()関数 { require(msg.value >= 1 ether); etherStore.deposit{値: 1 ether}(); etherStore.withdrawAll(); }
これらの攻撃を止める三つの方法 🛡️
1.nonReentrant 修飾子 🔒
ソリディティ bool private locked = false;
修飾子 nonReentrant() { require(!locked, "再入禁止"); ロック = true; _; ロック = false; }
脆弱な関数に追加してください。シンプルですが効果的です。
2. チェックス・エフェクツ・インタラクションズ・パターン 📊
これは重要です:
硬度 関数 withdrawAll() public { uint bal = 残高[msg.sender]; require(bal > 0);
残高[msg.sender] = 0;最初に更新
送信された(bool、 ) = msg.sender.call{value: bal}("");THENインタラクト require(sent、「Ether の送信に失敗しました」); }
最初にあなたの状態を更新してください。その後、インタラクトしてください。常に。
3. グローバルプロテクション 🌐
より大きなプロジェクトのために:
ソリディティ 契約 GlobalReentrancyGuard { bool private locked = false;
修飾子 globalNonReentrant() { require(!locked, "再入禁止"); ロック = true; _; ロック = false; } }
すべての契約がこれを継承するようにしてください。より安全なエコシステム。
最新のトレンド 🔥
2025年9月現在、これらの攻撃は依然としてDeFiを悩ませています。開発者が同じ間違いを繰り返す理由は完全には明らかではありません。Slitherのようなツールはこれらの問題を見つけることができます。EchidnaとFoundryはそれらのテストを手助けします 🚀
セキュリティは単に修飾子を追加することではありません。それはマインドセットです。
外で警戒を怠らないでください! 🛡️