SSO Module 2 - スマートコントラクトの脆弱性:リエントランシー攻撃の深掘り
スマートコントラクトは透明性をもたらす一方でリスクも伴います。本記事ではリエントランシーなどの脆弱性を、DAOの1億5000万ドル損失を事例に解説します。整数オーバーフローはBeautyChainの9億ドルの損失を招きました。DAOMakerはアクセス制御の欠陥により400万ドルを失いました。フラッシュローン攻撃ではHarves Financeが3800万ドルを失いました。
作成者 Markos Mebellis

このページの内容
スマートコントラクトはその効率性、透明性、不変性により世界の産業を変革しています。しかし、そのオープンで自動化された設計はリスクも露呈させます。可能性を最大化し脅威を最小化するには、脆弱性と起こり得る攻撃経路を把握することが重要です。これらのコントラクトの作成と維持には細心の注意とベストプラクティスの遵守が求められます。本記事では一般的な脆弱性を実例を交えて解説し、理解を深めます。Salus Security提供の以下の記事をご覧ください。
主な脆弱性:
**リエントランシー:**攻撃者は重要な処理の完了や値の更新前に機能へ再入する隙を突きます。
単一関数リエントランシー: コントラクトが悪意あるコントラクトとやり取りし、後者が関数へ再入できる場合に発生します。例えば、悪意あるコントラクトは'withdrawBalance'関数へ繰り返し再入し、残高が更新される前に多くのetherを吸い上げることができます。
注目の攻撃:
- The DAO(2016年): 1億5000万ドルを調達後、コーディングの脆弱性によりハッキングされました。これがEthereumネットワークの分裂を招きました。
- PolyDex(2021年): PLX Lockerスマートコントラクトへのリエントランシー攻撃により50万ドルを失いました。
- Bacon Protocol(2022年): lend()関数のリエントランシーバグにより100万ドルの損失を被りました。
- Lendf.Me(2020年): 複数の暗号通貨で約2470万ドルを失いました。
**クロス関数リエントランシー:**異なる関数間で状態を共有し、再入保護が不十分な場合に発生します。上記の'balances'の例は、'withdrawAll'に保護があっても攻撃者が'transfer'関数を悪用できることを示しています。
悪名高い事例:
- DFX Finance(2022年): リエントランシー保護のない関数を悪用した攻撃により700万ドル以上を失いました。
- Hundred Finance(2022年): borrowFresh関数を悪用したリエントランシー攻撃により約650万ドルを失いました。
- Fei Protocol(2022年): リエントランシーの抜け穴を利用した攻撃により約8000万ドルを失いました。
**クロスコントラクトリエントランシー:**異なるコントラクト間で状態を共有し、変数の変更順序が誤っている場合に発生します。関数に保護があっても、'burnAccount'などの他の関数は依然として悪用される可能性があります。
著名な攻撃:
- Rari Capital(2021年): 1時間足らずで約1000万ドル(約2600 ETH)を失いました。
- ValueDefi(2021年): 外部データに依存した無効なシェア計算により5345.314 WBNBを失いました。
読み取り専用リエントランシー:
読み取り専用リエントランシーは、コントラクトの状態を変更しないものの、状態が一貫していない場合に誤った出力を生成し得る関数を悪用します。
注目の攻撃:
- QuickSwap(2022年):攻撃者はフラッシュローンを悪用して資産のスポット価格を操作し、138 ETHと700 MATICトークンを騙し取りました。これはCurve LPオラクルの欠陥により可能になりました。
- dForce(2023年):ArbitrumおよびOptimismチェーン上でCurve Financeの価格オラクルにアクセスするコードに読み取り専用リエントランシーのバグがありました。
- Sentimente(2023年):読み取り専用リエントランシーの欠陥を悪用した攻撃により100万ドルが盗まれました。幸いにも90%は犯人が返還しました。
- Sturdy(2023年):Balancerの読み取り専用リエントランシー問題でB-stETH-STABLEの価格が改ざんされ、約442 ETHを失いました。
リエントランシー脆弱性の防止:
- 常にチェック・エフェクト・インタラクションのパターンに従ってください。
- すべての機密操作に再入保護を適用してください。
- すべての外部呼び出しを細心の注意を払って処理してください。
整数オーバーフロー:
計算が限界を超えるとオーバーフローし、多くの場合、極小または巨大な値になります。
実例となる攻撃:
- BeautyChain(2018年):攻撃者は整数オーバーフローにより10^58 BECを取得し、驚異的な9億ドルを売り抜けました。
- Poolz(2023年):Ethereum、Binance、Polygonのオンチェーンで約66万5000ドルの損失を招きました。
整数オーバーフロー対策:
- safeMathライブラリなどの安全な計算方法を利用してください。
- 結果が範囲内に収まることを確認するため、境界チェックを優先してください。
- 組み込みのオーバーフロー検出にはSolidityコンパイラバージョン0.8.0以降を採用してください。
アクセス制御:
アクセス制御の脆弱性は、重要な操作を扱う関数に厳格なアクセス制約がないことから生じます。
- 著名な攻撃:
- DAOMaker(2021年):
init関数が脆弱なまま放置された後、実に約400万ドルが吸い上げられました。 - GymNetwork(2022年):攻撃者はdepositFromOtherContract()の認証上の見落としを悪用し、実際の支払いなしに不正な残高増加を可能にしました。損失は?約2,475.91 WBNBです。
- Tempdao(2023年):migrateStake関数へのアクセス制御の甘い対応により、234万ドルを超える損失が発生しました。
アクセス制御の脆弱性
- 説明:システム内の特定の操作へのアクセスと権限を管理する制限メカニズムが不十分なために生じる脆弱性です。
防止策:
- 厳格な権限チェック:特に機密操作を扱う関数には、常に厳格な権限プロトコルを適用してください。
- マルチシグメカニズム:共同意思決定が必要なタスクには、機密操作の実行前に複数の承認を必要とするマルチシグプロトコルを使用してください。
一般的な攻撃ベクトル
- 説明主にスマートコントラクトにおいて、攻撃者がシステムの脆弱性を悪用するさまざまな手法や経路。
主な事例:
- フラッシュローン攻撃分散型金融システムの即時借入機能を悪用して悪意のある活動を実行する。
- フロントランニング攻撃者が他のユーザーの保留中の取引を把握し、より高いガス代を提示することでそれに先回りして実行する。
フラッシュローン攻撃
- 説明本質的に攻撃ではありませんが、FlashLoanはユーザーが担保なしで多額の資金を即座に借りられるDeFi機能です。コントラクトの相互作用や関係性における論理的な欠陥により悪用されてきました。
主な攻撃事例:
- **Harves Finance (2020.10.26)**3800万ドルの損失をもたらしました。
- **InverseFinance (2022.6.16)**53.2445 WBTCと99,976.29 USDTの損失につながりました。
- NewFreeDAO (2022.9.8): 4,481 WBNB(約125万ドル相当)が流出しました。
- Lodestar (2022.12.11): オラクルの価格操作を悪用されました。
- 0vix (2023.4.28): Polygonチェーン上で200万ドルの損失が発生しました。
防止のための推奨事項:
- プロジェクト開発時にはフラッシュローンの特性を認識してください。
- 正確な価格決定には、時間加重平均または複数のオラクルを使用してください。
フロントランニング
- 説明: 攻撃者はmemPoolから他のユーザーのトランザクションを把握し、より高いガス代を提示することでそれを悪用します。
主な攻撃事例:
- Sushi Badger Digg (2021.1.25): 81.68 ETHの損失が発生しました。
- Sushiswap Ape-ETH pool (2022.5.17): 攻撃者は約0.3 ETHの利益を得ました。
- **Uniswap (2023.4.2)**サンドイッチ攻撃により約2500万ドルの損失を引き起こしました。
防止のための推奨事項:
- 取引時にはスリッページ保護を使用してください。
- 特に変動の激しい市場では、ピーク時間外に取引を実行してください。
- 1inchのFlashBot rpcを使用して取引をマイナーに直接送信し、memPoolをバイパスしてください。
概要
おめでとうございます!モジュール2 - スマートコントラクトの脆弱性:リエントランシー攻撃と一般的なエクスプロイトの深掘りを完了しました
学んだことを振り返りましょう:
リエントランシー脆弱性 - 攻撃者は隙を突き、関数が完全に完了する前に再入します。
- 単一関数リエントランシー: 悪意あるコントラクトが別のコントラクトの関数に再入します。
- 関数間リエントランシー: 再入保護が不十分なため、異なる関数間で共有される状態が悪用されます。
- コントラクト間リエントランシー: 異なるコントラクト間で共有される状態を悪用します。
- 読み取り専用リエントランシー: 状態が一貫していないときに誤った出力を生成する関数を悪用します。
整数オーバーフロー - 計算が設定された上限を超え、極端な値になります。
アクセス制御の脆弱性 - 重要な関数に厳格なアクセス制約がないことから生じます。
一般的な攻撃ベクトル - 攻撃者がシステムの脆弱性を悪用する手法。
**FlashLoan Attack **- 担保なしで即時に大口借り入れを可能にするDeFiの機能ですが、論理的な欠陥により悪用されます。
フロントランニング攻撃- 攻撃者は保留中のトランザクションを把握し、より高いガス代を提示することで利益を得ます。
この記事の提供元:
