BTC
ETH
HTX
SOL
BNB
View Market
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

リエントランシー攻撃の脆弱性についての深い理解

この記事は約3101文字で、全文を読むには約5分かかります
転送方法、フォールバック機能、脆弱性コード、ソースコード解析の4つの側面から始まり、リエントランシー攻撃の原因を徹底分析し、DAO事件を詳しく解説。
AI要約
転送方法、フォールバック機能、脆弱性コード、ソースコード解析の4つの側面から始まり、リエントランシー攻撃の原因を徹底分析し、DAO事件を詳しく解説。

序文

序文

スマートコントラクト(英語: Smart Contract)の概念は、1995 年にニック・サボによって最初に提案されました。それは、情報化された方法で契約を配布、検証、または実行するように設計されたコンピュータプロトコルであり、追跡可能かつ不可逆的な取引を信頼します。しかし、スマートコントラクトは安全ではなく、イーサリアムの攻撃手法の一つにリエントランス攻撃の脆弱性があり、2016年にはDAO事件によりイーサリアムのハードフォークが発生しました。

最初のレベルのタイトル

脆弱性の概要

  • イーサリアムでは、スマート コントラクトは他の外部コントラクトのコードを呼び出すことができます。スマート コントラクトは外部コントラクトを呼び出したり、イーサを送信したりできるため、これらの操作ではコントラクトが外部呼び出しを送信する必要があるため、攻撃者はこれらの外部呼び出しを使用して攻撃を引き起こすことができます。コントラクトは任意の位置で再実行され、元のコードの制限を回避するため、リエントリー攻撃が発生します。再入攻撃は本質的にプログラミングにおける再帰呼び出しに似ているため、コントラクトが不明なアドレスに ether を送信するときに発生する可能性があります。

  • 簡単に言うと、リエントランシー攻撃の脆弱性が発生する条件は次の 2 つです。

外部コントラクトが呼び出されていますが、そのコントラクトは安全ではありません

簡単なコード スニペットの例を以下に示します。

上記のコード スニペットは最も単純な退会操作ですが、次にリエントランシー攻撃の原因を詳細に分析します。

最初のレベルのタイトル

脆弱性分析

リエントランシー攻撃を正式に分析する前に、いくつかの重要な知識を紹介しましょう。

.transfer(),01 転送方法転送操作中に再突入攻撃が送信されるため、Solidity で一般的に使用される転送方法は次のとおりです。
  • .send() と
  • .gas().call.vale()() の 3 つの転送方法を以下に説明します。
  • .transfer(): 呼び出しには 2300 ガスのみが送信されます。転送が失敗すると、 throw を使用してロールバック操作が実行され、再入攻撃が防止されます。

.send(): 呼び出しには 2300 ガスのみが送信され、送信が失敗するとブール値 false が返されるため、再入攻撃が防止されます。

コントラクトの呼び出し時に一致する関数はありませんでした。
フォールバック関数: フォールバック関数は、各コントラクトに名前のない唯一の関数であり、以下に示すように、この関数にはパラメーターも戻り値もありません。

フォールバック関数は次の状況で実行されます。

  • コントラクトの呼び出し時に一致する関数はありませんでした。

  • データは送信されません。

  • スマート コントラクトはイーサを受け取ります (イーサを受け取るには、フォールバック関数が支払い可能とマークされている必要があります)。

データは送信されません。

スマート コントラクトはイーサを受け取ります (イーサを受け取るには、フォールバック関数が支払い可能とマークされている必要があります)。

03 脆弱性コード

次のコードにはリエントランシー攻撃があります。パブリック ウォレットに似たコントラクトを実装しています。すべてのユーザーは、deposit() を使用してリエントランス コントラクトに入金するか、withdraw() を使用してリエントランス コントラクトから引き出すことができます。もちろん、誰もが行うこともできます。コントラクト内の自分自身または他の人の残高を照会するには、balanceof() を使用します。

まずアカウント (0x5B38Da6a701c568545dCfcB03FcB875f56beddC4) を使用して被害者として機能し、[デプロイ] ボタンをクリックして Remix IDE にコントラクトをデプロイします。

コントラクトのデプロイに成功したら、[値] 設定ボックスに 5 を入力し、単位をエーテルに変更し、[デポジット] をクリックして 5 エーテルをデポジットします。

ウォレットをクリックして契約の残高を表示すると、残高が 5 エーテルであることがわかり、入金が成功したことがわかります。

次のコードは、上記の脆弱なコントラクトに対する攻撃です。

別のアカウント (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) を攻撃者として使用し、脆弱なコントラクトのアドレスを [デプロイ] 設定ボックスにコピーし、[デプロイ] をクリックして上記の攻撃コントラクトをデプロイします。

デプロイが成功したら、まず、wallet() 関数を呼び出して、攻撃コントラクトの残高が 0 であることを確認します。

再度コントラクトのウォレット機能を呼び出して脆弱なコントラクトの残高を確認すると、6 ether になっていることがわかります。

攻撃者 (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) は、攻撃コントラクトの攻撃関数を呼び出して攻撃をシミュレートし、その後、攻撃コントラクトのウォレット関数を呼び出してコントラクトの残高を確認すると、残高がゼロに戻っていることがわかります。攻撃コントラクトに戻って残高を確認すると、攻撃されたコントラクトに 6 エーテルがあることがわかります。すべての資金が攻撃者のコントラクトに引き出されており、これによりリエントラント攻撃が発生します。

04 ソースコード解析

最初のレベルのタイトル

関連事例

文章

2016 年 6 月 17 日、TheDAO プロジェクトは再入攻撃を受け、その結果 300 万以上のイーサリアムが TheDAO 資産プールから分離され、攻撃者は TheDAO スマート コントラクトの SplitDAO() 関数を使用して自身の DAO 資産を再利用しました。エントリー攻撃、DAO 資産を TheDAO プロジェクトの資産プールから常に分離し、自分のアカウントに転送します。

次のコードは、splitDAO() 関数の一部であり、そのソース コードは TokenCreation.sol にあり、親 DAO から子 DAO にトークンを転送します。残高配列 uint FundToBeMoved = (balances[msg.sender] * p.splitData[0].splitBalance) / p.splitData[0].totalSupply によって、移動するトークンの量が決まります。

paidOut[_account] += 報酬 更新された状態変数は、問題コードの payOut 関数呼び出しの後に配置されます。

.call.value 呼び出しを _recipient に発行し、_amount Wei に転送すると、.call.value 呼び出しはデフォルトで現在の残りのガスをすべて使用します。

解決

上記のリエントランシー攻撃の分析により、リエントランシー攻撃の脆弱性のキーポイントは、フォールバックなどの関数を使用して自身をコールバックし、再帰呼び出しによる循環転送操作を実行させることにあることがわかります。リエントランシー攻撃の脆弱性。

副題

01 他の伝達関数を使用する

Ethereum 転送を外部アドレスに送信する場合は、Solidity の組み込み transfer() 関数を使用します。transfer() は呼び出しに 2300 ガスしか送信せず、別のコントラクトを呼び出すには十分ではないためです。transfer() を使用して元のコントラクトを書き換えます。 )の契約内容は以下の通りです。

02 まず状態変数を変更します

この方法は、状態変数の変更が転送操作よりも前に行われるようにするためのものです。つまり、Solidity が公式に推奨する checks-Effects-Interactions モード (checks-Effects-Interactions) です。

03 ミューテックスを使用する

公式 OpenZeppelin ライブラリには、再入攻撃に特化したセキュリティ コントラクトがあります。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol

参考文献

最初のレベルのタイトル
https://zhuanlan.zhihu.com/p/111446792
参考文献
https://blog.csdn.net/henrynote/article/details/82119116
1. イーサリアムのいくつかのハードフォーク:
https://blog.csdn.net/Flyhps/article/details/83095036


ETH
安全性
スマートコントラクト
Odaily公式コミュニティへの参加を歓迎します
購読グループ:
https://t.me/Odaily_News
チャットグループ:
https://t.me/Odaily_GoldenApe
公式アカウント:
https://twitter.com/OdailyChina