(パート3) この脆弱性により3億ドル以上の損失!
パート2
開発者でなくても、ライブスマートコントラクトの例を見て、その仕組みを学んでください。
再入攻撃は EVM スマート コントラクトの一般的な脆弱性であり、外部のコントラクトが制御フローを乗っ取って再入することを可能にし、被害者の資金を流出させる可能性があります。
これらの攻撃はスマート コントラクト開発において依然として重大な問題であり、開発者によって非常に深刻に受け止められています。
一般的な再入可能スマート コントラクト攻撃には以下のものがあります。
• DAO ハッキング: 約 5,000 万ドル相当の ETH が失われました。
• Cream Finance: 3,000 万ドル以上のさまざまな資産を失いました。
• サイレン・プロトコル: 3,000 万ドル以上のさまざまな資産を失いました。
Solidity スマート コントラクトを使用してこの例を実装してみましょう。
心配しないでください。段階的に進めていきます。
コードを記述、コンパイル、テスト、実行できる開発インターフェースである @EthereumRemix (X) を使用します。
コードを書いて攻撃をシミュレートします。
• まず、すべてのコードが含まれる「Bank.sol」という名前のファイルを作成しましょう。
• 次に、各アドレスの残高を保存するためのマッピングを作成します。
ここでは、各アドレスが個人のアカウントに対応します。
次に、クライアントが銀行にお金を入金できる簡単な入金機能を作成します。
ここでのスマート コントラクトは銀行を表します。
入金が行われるたびに、新しい入金がそれぞれのアドレスに追加され、マッピングが更新されます。
また、預金者が残高の全部または一部を引き出せる引き出し機能も必要です。
簡単に言うと、クライアントがこの関数を呼び出すたびに残高全体が引き出され、マッピングで残高が 0 に設定されます。
最後に、マッピングを変更せず、クライアントが残高を確認できるようにする関数を追加します。
これはビュー関数と呼ばれ、オンチェーンデータを変更せず、要求された情報のみを表示するため、ガスを消費しません。
契約は非常に単純で、一見破られないように見えます。
再入攻撃を試してみましょう。攻撃者のスマート コントラクトを、コントラクト残高が 1 ETH を超えている限り引き出しを続ける受信関数を使用して構築します。
最後に、Attacker コントラクトの Ether 残高を返すビュー関数 getBalance を追加します。
それでは、すべてをデプロイして、再入攻撃が機能するかどうかをテストしましょう。
まず、Bank コントラクトをデプロイする必要があります。
• 両方のコードをコンパイルすることから始めます。
• 銀行契約を展開します。
• デプロイされた銀行コントラクトのアドレスをコピーし、それを入力として使用して攻撃者コントラクトをデプロイします。
• 次に、10 ETH を Bank コントラクトに入金します。
• 攻撃者のコントラクトに 1 ETH を入金します。
• 最後に、攻撃機能を使用して攻撃を開始します。
ご覧のとおり、攻撃は成功しました。
私たちは 1 つのアドレスに 10 ETH、攻撃者のアドレスに 1 ETH を入金していました。
最終的に、攻撃者のアドレスには 11 ETH が保持されます。
どうすればこれを防ぐことができたのでしょうか?
これは、引き出し関数を呼び出すときに資金を送金する前にクライアントの残高を 0 に設定することで回避できたはずです。
必要なのは、コードを 1 行移動することだけです。
この記事がお役に立てば幸いです。
私に従ってください @Bluechip 詳しくは。
可能であれば、この引用文に「いいね」または再投稿してください。
#TON #DOGSONBINANCE #CryptoMarketMoves #TelegramCEO #USNonFarmPayrollReport