スマートコントラクトの潜在的な脆弱性
画期的であるにもかかわらず、スマート コントラクトは悪意のある者が悪用できる欠陥の影響を受けないわけではありません。
不適切な入力検証は、攻撃者が予期しない入力を提供することで契約の実行に影響を与えることができる一般的な弱点です。さらに、ビジネス ロジックの不適切な適用により、予期しない動作や契約の論理ギャップが生じ、脆弱性が生じる可能性があります。さらに、不適切に処理された場合、外部データ ソースや他の契約とのインターフェイスを含むような安全でない外部呼び出しが脆弱性をもたらす可能性があります。
再入攻撃は、コントラクトが自身の状態変更を完了する前に外部から別のコントラクトを呼び出すときに発生する脆弱性です。これにより、呼び出されたコントラクトは呼び出し側のコントラクトに再度入り、一部の操作を再度実行できるようになります。これにより予期しないアクションが発生し、攻撃者がコントラクトの状態を変更して資金を枯渇させたり、その他の悪影響が生じたりする可能性があります。
このような攻撃の可能性を考慮すると、開発者は外部のコントラクトやデータ ソースを扱う際にも注意を払い、外部呼び出しが正しく処理され、予期しない動作や脆弱性が起こらないようにする必要があります。開発者は、スマート コントラクトのテストなどのセキュリティ手順に細心の注意を払うことで、進化する脅威からスマート コントラクトを保護することができます。
スマートコントラクトにおける再入攻撃とは何ですか?
スマート コントラクトでは、コントラクトが自身の状態変更を完了する前に、外部で別のコントラクトまたは関数を呼び出すと、再入攻撃が発生します。
これにより、呼び出されたコントラクトが呼び出し側のコントラクトに再度入り、操作の一部を再度実行できるようになり、予期しない、多くの場合悪意のある動作が発生する可能性があります。たとえば、コントラクト A がコントラクト B を呼び出して資金を送信し、その後自身の状態を変更するような状況です。
コントラクト B のコードには、コントラクト A に再度アクセスし、コントラクト A の状態変更が完了する前に転送関数を再実行できるコールバック関数が含まれている可能性があります。これにより、攻撃者は最初のトランザクションを完了する前に、コントラクト A から複数回お金を引き出すことができます。
2016 年にイーサリアム ブロックチェーンで発生した悪名高い自律分散組織 (DAO) のハッキングも、よく知られた例です。攻撃者は、スマート コントラクト コードの再入可能性の欠陥を利用して DAO から資金を再帰的に削除し、最終的に数百万ドル相当のイーサ (ETH) を盗みました。
さらに、Uniswap、Lendf.Me、BurgerSwap、SURGEBNB、Cream Finance、Siren Protocol などのいくつかの分散型金融 (DeFi) プロトコルは、再入脆弱性の悪用により大きな経済的損失を被りました。これらの侵害により、350 万ドルから 2,500 万ドルの損失が発生し、DeFi 分野における再入脆弱性がもたらす継続的な脅威を浮き彫りにしました。
再入攻撃の仕組み
再入攻撃は、スマート コントラクト関数の順次実行と外部呼び出しを使用してループを形成し、攻撃者が特定の関数を終了前に複数回実行できるようにします。これにより、悪意のある動作や承認されていない資金の引き出しが発生する可能性があります。
被害者が状態の変更を完了する前に、攻撃者のコントラクトは被害者のコントラクトを「騙して」、攻撃者のコントラクトにコールバックさせます。このアクションにより、繰り返しの引き出しやその他の不注意な動作が発生する可能性があります。
上の画像は、スマート コントラクトへの再入攻撃を示しています。攻撃者のコントラクトは被害者の「withdraw()」関数を呼び出し、残高を更新する前に Ether を送信します。次に、攻撃者のフォールバック関数がトリガーされ、withdraw() を再帰的に呼び出して、被害者のコントラクトから資金を排出します。この攻撃は、被害者が資金を送信する前に残高を更新しなかったことを悪用します。
簡単な例を使用して、再入攻撃の仕組みを分析してみましょう。
「引き出し」機能を備えたスマートコントラクト
ユーザーが資金を引き出すことを許可するデジタル ウォレット スマート コントラクトがあるとします。このコントラクトには、ユーザーの残高を追跡するだけでなく、資金の引き出しを容易にする引き出し機能があります。引き出し機能により、通常、ユーザーはスマート コントラクトから自分の個人用ウォレットにトークンまたは Ether を引き出すことができます。
ユーザーインタラクションと機能実行
ユーザーは自分でウォレットから出金をリクエストします。出金機能を使用して、希望する出金額を入力します。
引き出し関数は、呼び出されたときにユーザーが引き出しを行うのに十分な資金を持っているかどうかを確認します。要件が満たされている場合は、必要な資金をユーザーが選択したアドレスに送金します。
外部通話
ここで弱点が表面化します。引き出しがユーザーの残高に反映される前に、契約は別の契約またはアカウントへの外部呼び出しを行います。
再帰呼び出し
外部コントラクトのコードに元のコントラクトを再度呼び出すことができる関数 (別の withdraw 関数など) が含まれている場合、再帰ループが作成されます。これにより、終了する前に withdraw メソッドを再度呼び出すことが可能になります。
再入性の利用
次に、攻撃者は悪意のあるコントラクトを使用してこのループを利用します。攻撃者のコントラクトは、ウォレット コントラクトが外部コントラクトを呼び出す際に、残高が更新される前にウォレットの引き出し関数をすばやくもう一度呼び出します。
フォールバック機能
特定の状況では、スマート コントラクトのフォールバック機能 (データや Ether のない呼び出しをコントラクトが受信したときに起動する独自の機能) が攻撃者によって使用される可能性があります。資金の処理中にフォールバック機能を繰り返し呼び出すことで、再入攻撃を実行できます。
国家による操作と度重なる撤退
ウォレット コントラクトは外部呼び出しを受信するまで残高の更新を遅らせるため、攻撃者のコントラクトは同じトランザクション内で引き出し機能を繰り返し使用できます。その結果、資金が許可なく引き出される可能性が高くなり、攻撃者は法的に権利のある金額以上の金額を盗むことができます。その結果、ウォレット コントラクトのユーザーに多大な経済的損失が発生します。
再入攻撃の結果
再入攻撃は、多大な経済的損失を引き起こす可能性があるため、スマート コントラクト ユーザーにとって深刻な影響を及ぼします。
再入攻撃の最も直接的な影響の 1 つは、影響を受けやすいスマート コントラクトに保管されている現金の不正な引き出しや操作です。攻撃者は脆弱性を利用して、コントラクトから資金を繰り返し引き出し、残高を枯渇させ、影響を受けるコントラクトに投資または資産を保管しているユーザーに重大な経済的損失を引き起こす可能性があります。
さらに、再入攻撃によって、スマート コントラクトやブロックチェーン テクノロジー全般のセキュリティと整合性に対するユーザーの信頼が弱まる可能性があります。再入脆弱性は壊滅的な影響を及ぼす可能性があります。これは、2016 年にイーサリアム ブロックチェーンで発生した DAO ハッキングなどの有名な事件で実証されており、莫大な経済的損失とコミュニティの評判へのダメージを引き起こしました。
再入攻撃は、短期的な経済的影響以外にも、規制や法的対応、投資家の信頼の低下、ブロックチェーン プラットフォームやプロジェクトの評判への悪影響など、長期的な影響を及ぼす可能性があります。攻撃に対する脆弱性が認識されると、ユーザーはスマート コントラクトの操作や分散型アプリケーション (DApps) への投資に慎重になり、ブロックチェーン技術の採用と拡大が妨げられる可能性があります。
再入攻撃を軽減する方法
再入の脅威を軽減するには、スマート コントラクトの作成と監査におけるベスト プラクティスを実装する必要があります。
これには、セキュリティの実績がある有名なコード ライブラリを使用することも含まれます。これは、その方法の 1 つです。これらのライブラリは、広範囲にわたるテストとピア レビューを受けているため、脆弱性がもたらされる可能性が低くなります。
開発者は、「チェック効果相互作用」設計などのセキュリティ チェックも使用する必要があります。これにより、状態の変更がアトミックに行われることが保証され、再入攻撃の機会が最小限に抑えられます。このような脆弱性に対する追加の防御線は、再入安全なスマート コントラクト開発フレームワークが利用可能な場合はそれを使用することで追加できます。
これらのフレームワークには、再入攻撃を回避するために特別に設計された組み込みメソッドと安全策が頻繁に含まれているため、開発者がセキュリティ保護を手動で追加する必要はほとんどありません。ただし、ブロックチェーンのセキュリティはまだ開発中であるため、開発者は新しい脅威と弱点に引き続き注意する必要があります。