-
Bitcoin
$114300
-0.31% -
Ethereum
$3652
2.67% -
XRP
$3.040
1.34% -
Tether USDt
$0.9999
-0.01% -
BNB
$760.7
0.86% -
Solana
$168.0
3.01% -
USDC
$0.9999
0.01% -
TRON
$0.3340
1.81% -
Dogecoin
$0.2065
2.38% -
Cardano
$0.7478
1.45% -
Hyperliquid
$38.54
0.57% -
Stellar
$0.4053
-1.60% -
Sui
$3.497
0.23% -
Chainlink
$16.78
1.24% -
Bitcoin Cash
$566.1
2.35% -
Hedera
$0.2450
-2.41% -
Avalanche
$22.74
4.42% -
Ethena USDe
$1.001
-0.02% -
Litecoin
$121.9
9.23% -
UNUS SED LEO
$8.953
-0.30% -
Toncoin
$3.367
-4.71% -
Shiba Inu
$0.00001234
0.32% -
Uniswap
$9.798
4.76% -
Polkadot
$3.665
1.13% -
Monero
$299.9
-3.32% -
Dai
$0.9999
-0.01% -
Bitget Token
$4.361
0.32% -
Cronos
$0.1376
5.25% -
Pepe
$0.00001051
-0.25% -
Aave
$261.7
-0.70%
再発攻撃とは何ですか?この脆弱性を防ぐ方法は?
再発攻撃は、スマートコントラクトの欠陥を活用し、状態解決前に繰り返し機能呼び出しを可能にし、不正アクションにつながります。チェック効果の相互作用パターンで防止します。
2025/04/12 00:35

再発攻撃は、特にイーサリアムブロックチェーンのスマートコントラクトで発生する可能性のあるセキュリティ脆弱性の一種です。この攻撃は、攻撃者が最初の呼び出しが完全に解決される前に関数を繰り返し呼び出すことを可能にする契約のロジックの欠陥を活用します。これにより、不正な撤退またはその他の悪意のある行動につながる可能性があります。この記事では、再発攻撃のメカニズムを調査し、実世界の例を調べ、スマートコントラクトのこの脆弱性を防ぐ方法に関する詳細なガイダンスを提供します。
再発攻撃を理解する
再発攻撃は、スマートコントラクトが独自の状態が変更される前に外部契約を呼び出すときに発生します。これにより、外部契約が元の契約に再び入り、その状態を操作する機会の窓を作成できます。攻撃には通常、被害者契約が残高を更新する前にwithdraw()
などの関数を繰り返し呼び出すことにより、被害者契約から資金を排出する悪意のある契約が含まれます。
説明するために、ユーザーが資金を預け入れて引き出すことができる契約の簡単な例を検討してください。
contract Vulnerable {
mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); balances[msg.sender] -= amount; }
}
この例では、 withdraw
関数は最初にユーザーのバランスが十分であるかどうかを確認し、次にユーザーに資金を送信しようとし、最終的にユーザーの残高を更新します。脆弱性は、 msg.sender.call
への外部呼び出しの後まで、 balances[msg.sender]
が更新されないという事実にあります。 msg.sender
悪意のある契約である場合、残高が更新される前にwithdraw
機能に再入力でき、残高がゼロに設定される前に複数の引き出しが可能になります。
再発攻撃の実際の例
2016年のDAOハッキング中に最も悪名高い再発攻撃の1つが発生しました。DAO(分散型自律組織)は、ユーザーがプロジェクトに投資できるようにするイーサリアムブロックチェーンのスマート契約でした。契約には、上記の契約と同様の脆弱性があり、攻撃者はDAOから約360万人のETHを排出することができました。
もう1つの例は、2017年のパリティウォレットハックです。イーサリアムで人気のあるマルチシグネチャウォレットであるパリティウォレットは、再発の脆弱性のために悪用されました。攻撃者は複数のウォレットから資金を排出することができ、その結果、ユーザーに大きな損失をもたらしました。
再発攻撃を防ぐ方法
再発攻撃を防ぐには、スマートコントラクトの慎重な設計と実装が必要です。この脆弱性を軽減するためのいくつかの戦略を以下に示します。
Checks-effects-interactionsパターンを使用します
Checks-effects-interactionsパターンは、安全なスマートコントラクトを作成するためのベストプラクティスです。このパターンは、外部呼び出しが実行される前にすべての状態の変更が行われることを保証します。 withdraw
機能のコンテキストでは、これは、資金を送信する前にユーザーの残高を更新することを意味します。
contract Secure {
mapping(address => uint) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
外部呼び出しを行う前に残高を更新することにより、契約は、再発が発生する前にユーザーの残高がゼロに正しく設定されることを保証します。
引き出しパターンを使用します
再発攻撃を防ぐ別の効果的な方法は、離脱パターンを使用することです。契約はユーザーに直接資金を送信する代わりに、引き出し額を保存し、ユーザーが後で資金を引くことができます。このアプローチは、引き出しプロセス中の外部呼び出しの必要性を排除します。
contract WithdrawalPattern {
mapping(address => uint) public balances; mapping(address => uint) public withdrawalPending; function deposit() public payable { balances[msg.sender] += msg.value; } function requestWithdrawal(uint amount) public { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; withdrawalPending[msg.sender] += amount; } function withdraw() public { uint amount = withdrawalPending[msg.sender]; require(amount > 0, 'No pending withdrawal'); withdrawalPending[msg.sender] = 0; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
この例では、 requestWithdrawal
関数はユーザーの残高を更新し、引き出し額をwithdrawalPending
額を保存します。 withdraw
機能は、再発のリスクなしに資金をユーザーに送信します。
再発ガードを実装します
再発警備員は、再発攻撃を防ぐためのもう1つのテクニックです。これらのガードは、状態変数を使用して、関数が現在実行されているかどうかを追跡します。関数が再入力された場合、ガードはさらなる実行を防ぎます。
contract ReentrancyGuard {
bool private _notEntered; constructor() { _notEntered = true; } modifier nonReentrant() { require(_notEntered, 'ReentrancyGuard: reentrant call'); _notEntered = false; _; _notEntered = true; } function withdraw(uint amount) public nonReentrant { require(balances[msg.sender] >= amount, 'Insufficient balance'); balances[msg.sender] -= amount; (bool success, ) = msg.sender.call{value: amount}(''); require(success, 'Transfer failed'); }
}
nonReentrant
修飾子は、 withdraw
機能がまだ実行されている間に再び入ることができないことを保証します。
再発の脆弱性のテストと監査
予防措置の実施に加えて、再発脆弱性についてスマート契約を徹底的にテストおよび監査することが重要です。従うべきいくつかの手順は次のとおりです。
- ユニットテスト:再発攻撃をシミュレートするユニットテストを作成して、そのような条件下で契約が正しく動作するようにします。
- 静的分析: MythrilやSlitherなどのツールを使用して、コードの潜在的な再発性の脆弱性を自動的に検出します。
- 手動監査:スマートコントラクト監査人が経験を積んだことで、潜在的な再発の問題についてコードを確認してください。手動監査は、自動化されたツールが見逃す可能性のある複雑な脆弱性を明らかにする可能性があります。
スマート契約開発のためのベストプラクティス
再発攻撃のリスクをさらに減らすために、次のベストプラクティスを検討してください。
- 契約をシンプルに保つ:複雑な契約には脆弱性が含まれる可能性が高くなります。契約を可能な限りシンプルで簡単に保ちます。
- 確立されたライブラリを使用:一般的な契約パターンの安全な実装を提供するOpenzeppelinなどの、監査されたライブラリやフレームワークを活用します。
- 定期的な更新:最新のセキュリティベストプラクティスについて情報を提供し、それに応じて契約を更新してください。
よくある質問
Q:Ethereum以外の他のブロックチェーンプラットフォームでは、再発攻撃が発生する可能性がありますか?
A:再発攻撃は、スマートコントラクトが広く使用されているため、イーサリアムに最も一般的に関連付けられていますが、Binance Smart ChainやSolanaなどのスマートコントラクトをサポートする他のブロックチェーンプラットフォームでも同様の脆弱性が発生する可能性があります。再発攻撃を防止する原則は、異なるプラットフォームで同じままです。
Q:再発の脆弱性を検出するために特別に設計されたツールはありますか?
A:はい、いくつかのツールは、スマートコントラクトの再発性の脆弱性を検出するように設計されています。 MythrilとSlitherは、潜在的な再発性の問題を特定できる人気のある静的分析ツールです。さらに、 Echidnaは、自動化されたテストケース生成を通じて再発の脆弱性をテストするために使用できるプロパティベースのテストツールです。
Q:セキュリティの専門家でない場合、スマートコントラクトが再発攻撃に対して安全であることを確認するにはどうすればよいですか?
A:セキュリティの専門家でない場合は、プロのスマート契約監査人にコードを確認するために関与することを強くお勧めします。さらに、 Openzeppelinなどの確立されたライブラリを使用し、チェック効果のインタラクションパターンなどのベストプラクティスに従うことで、再発の脆弱性のリスクを大幅に減らすことができます。スマートコントラクトのセキュリティに関する知識を定期的に更新し、コミュニティディスカッションに参加することは、最新のセキュリティ慣行についての情報を提供することもできます。
免責事項:info@kdj.com
提供される情報は取引に関するアドバイスではありません。 kdj.com は、この記事で提供される情報に基づいて行われた投資に対して一切の責任を負いません。暗号通貨は変動性が高いため、十分な調査を行った上で慎重に投資することを強くお勧めします。
このウェブサイトで使用されているコンテンツが著作権を侵害していると思われる場合は、直ちに当社 (info@kdj.com) までご連絡ください。速やかに削除させていただきます。
- Shiba Inuのランキング:暗号通貨で何が起こっているのですか?
- 2025-08-05 19:10:13
- $ 1未満の暗号:ブロックチェーンFX対シバイン - 誇大広告は何ですか?
- 2025-08-05 19:10:13
- 暗号株、スマートマネー、および下落した価格:取引は何ですか?
- 2025-08-05 19:50:12
- ビットコイン、財務省、およびETF:最新の暗号市場の動きのデコード
- 2025-08-05 19:50:12
- イーサリアム価格:トムリーの5,600ドルの予測と制度的蓄積
- 2025-08-05 19:55:53
- エセナ(ena)トークンの中で価格が急上昇しますロック解除:強気または弱気?
- 2025-08-05 19:55:53
関連知識

CEFIとdefiの違いは何ですか?
2025-07-22 00:28:43
CefiとDefiの理解暗号通貨の世界では、 CEFI (集中財務)とDefi (分散型財務)が2つの異なる金融エコシステムを表しています。 CEFIとは、中央当局が事業を管理し、ユーザーファンドを管理する従来の金融機関に似たプラットフォームを指します。例には、BinanceやCoinbaseなどの...

潜在的な暗号エアドロップの資格を得る方法は?
2025-07-23 06:49:44
暗号の空気ドロップが何であるかを理解します暗号のエアドロップは、自由なトークンまたはコインの分布を多数のウォレットアドレスに指します。これは、ブロックチェーンプロジェクトでしばしば認識と採用を増やすために使用されます。これらのエアドロップは予期しない場合もあれば、ユーザーからの特定の適格なアクション...

暗号「エアドロップファーマー」とは何ですか?
2025-07-24 22:22:20
暗号の「エアドロップファーマー」の役割を理解する暗号の「Airdrop Farmer」とは、自由なトークンを蓄積するために暗号通貨のエアドロップに積極的に参加する個人を指します。エアドロップは、ブロックチェーンプロジェクトで使用されるプロモーション戦略であり、多くの場合、トークンの所有権を分散させる...

サイドチェーンとレイヤー2の違いは何ですか?
2025-07-20 23:35:57
サイドチェーンの概念を理解するサイドチェーンは、メインブロックチェーン、通常はBitcoinやイーサリアムなどの暗号通貨のメインネットと平行に動作する別のブロックチェーンです。メインチェーンとサイドチェーンの間で資産を安全に移動できるように設計されています。サイドチェーンの主な目的は、メインのブロッ...

ブロック間通信プロトコル(IBC)とは何ですか?
2025-07-19 10:43:17
ブロック間通信プロトコル(IBC)を理解するブロック間通信プロトコル(IBC)は、異なるブロックチェーンネットワーク間の相互運用性を可能にするように設計されたクロスチェーン通信プロトコルです。独立したブロックチェーンは、データと価値を安全かつ信頼できるように交換できます。最初にコスモスエコシステム向...

シャードはスケーラビリティをどのように改善しますか?
2025-07-20 01:21:49
ブロックチェーンでのシャードの理解Shardingは、スケーラビリティを向上させるために、ブロックチェーンテクノロジーでますます採用されているデータベースパーティション化手法です。ブロックチェーンのコンテキストでは、シャードには、ネットワークを「シャード」と呼ばれるより小さく、より管理しやすいセグメ...

CEFIとdefiの違いは何ですか?
2025-07-22 00:28:43
CefiとDefiの理解暗号通貨の世界では、 CEFI (集中財務)とDefi (分散型財務)が2つの異なる金融エコシステムを表しています。 CEFIとは、中央当局が事業を管理し、ユーザーファンドを管理する従来の金融機関に似たプラットフォームを指します。例には、BinanceやCoinbaseなどの...

潜在的な暗号エアドロップの資格を得る方法は?
2025-07-23 06:49:44
暗号の空気ドロップが何であるかを理解します暗号のエアドロップは、自由なトークンまたはコインの分布を多数のウォレットアドレスに指します。これは、ブロックチェーンプロジェクトでしばしば認識と採用を増やすために使用されます。これらのエアドロップは予期しない場合もあれば、ユーザーからの特定の適格なアクション...

暗号「エアドロップファーマー」とは何ですか?
2025-07-24 22:22:20
暗号の「エアドロップファーマー」の役割を理解する暗号の「Airdrop Farmer」とは、自由なトークンを蓄積するために暗号通貨のエアドロップに積極的に参加する個人を指します。エアドロップは、ブロックチェーンプロジェクトで使用されるプロモーション戦略であり、多くの場合、トークンの所有権を分散させる...

サイドチェーンとレイヤー2の違いは何ですか?
2025-07-20 23:35:57
サイドチェーンの概念を理解するサイドチェーンは、メインブロックチェーン、通常はBitcoinやイーサリアムなどの暗号通貨のメインネットと平行に動作する別のブロックチェーンです。メインチェーンとサイドチェーンの間で資産を安全に移動できるように設計されています。サイドチェーンの主な目的は、メインのブロッ...

ブロック間通信プロトコル(IBC)とは何ですか?
2025-07-19 10:43:17
ブロック間通信プロトコル(IBC)を理解するブロック間通信プロトコル(IBC)は、異なるブロックチェーンネットワーク間の相互運用性を可能にするように設計されたクロスチェーン通信プロトコルです。独立したブロックチェーンは、データと価値を安全かつ信頼できるように交換できます。最初にコスモスエコシステム向...

シャードはスケーラビリティをどのように改善しますか?
2025-07-20 01:21:49
ブロックチェーンでのシャードの理解Shardingは、スケーラビリティを向上させるために、ブロックチェーンテクノロジーでますます採用されているデータベースパーティション化手法です。ブロックチェーンのコンテキストでは、シャードには、ネットワークを「シャード」と呼ばれるより小さく、より管理しやすいセグメ...
すべての記事を見る
