| 2026年1月9日Curve Finance、Vyperコンパイラ脆弱性によるリエントランシー攻撃の詳細分析と教訓 ~JBAセキュリティ分科会レポート#3~

 

はじめに                  

近年、web3分野の急速な発展に伴い、セキュリティインシデントの件数・被害額ともに年々増加傾向にある。このような状況下で、web3業界におけるセキュリティ対策の重要性が一層高まっている。日本ブロックチェーン協会(以下、JBA)では2024年10月よりセキュリティ分科会を立ち上げ、web3の情報セキュリティにおける脆弱性に固有の名前や番号を付与する活動として「web3 Vulnerabilities and Exposures(web3脆弱性識別子。以下、web3VE)」の構築・運用を開始した。

また、セキュリティ分科会では、業界関係者や企業の担当者がリスクを正確に把握し、効果的な対策を講じるための情報提供を目的として、「JBAセキュリティ分科会レポート」の配信を開始した。このレポートではセキュリティ分科会や「web3VE」において集約している脆弱性に関する統計情報や、過去のハッキング事件などを取り上げ、その詳細な分析と今後の教訓を共有している。

 

統計情報

2023年には、web3関連のハッキングや詐欺などが751件報告され、被害総額は約18億ドルに上った。さらに2024年には年間760件、約23.6億ドルと、過去最多のハッキング件数を記録した。2025年に入ってからもこの傾向は続いており、第1四半期(1〜3月)だけで197件、約16.7億ドル相当の暗号資産が流出している

こうした被害の背景には、スマートコントラクトの設計ミスや署名プロセスの不備、リエントランシ―攻撃(再入可能性攻撃)といった、web3特有の脆弱性が存在していることが指摘されている。

web3VEの取り組み

セキュリティ分科会では、web3のプログラムに関する脆弱性情報を一元的に集約するプラットフォーム「web3VE」を通じて、様々な脆弱性情報を取得している。
「web3VE」は、web3領域における脆弱性の体系的な分類と可視化を目指す試みであり、その基本思想はMITREが運営する「Common Vulnerabilities and Exposures」の枠組みを参考にしている。


 

Curve Finance、 Vyperコンパイラ脆弱性によるリエントランシー攻撃の詳細分析と教訓

本レポートでは、公表資料等に基づき、2023年7月に発生したCurve Financeに対する大規模なハッキング事件を取り上げ、その詳細な分析と今後の教訓を共有する。


事件の概要

項目 詳細
事件発生日 2023年7月30日 13:10~22:00
対象プロダクト Curve Finance(ステーブルコインスワップAMM)
被害総額 約7,300万米ドル
流出した暗号資産 alETH、msETH、pETH、CRVなど
影響 Curve関連プールの資産流出
Vyperの脆弱性が確認されたバージョンを利用していた複数プロジェクトが一時的にサービスを停止・検査
脆弱性の状況 修正済み(本レポート執筆時点)

 

2023年7月30日、ステーブルコインのスワップに特化したAMM(Automated Market Maker / 自動マーケットメイカー)であるCurve Financeで、スマートコントラクトを記述するための言語であるVyperの、特定のバージョンに潜んでいた脆弱性が悪用され、リエントランシー攻撃が発生した。この事件は、DeFi(分散型金融)エコシステムにおけるサプライチェーンリスクの深刻さを改めて浮き彫りにした。

リエントランシーとは?

リエントランシー(Reentrancy)とは、スマートコントラクトが外部コントラクトを呼び出した際、その外部コントラクトが元のコントラクトの実行を完了する前に、再度元のコントラクトの関数を呼び出す(再入する)ことができる脆弱性をいう。

安全なコントラクトの設計原則
通常、安全なコントラクトは、Checks-Effects-Interactions(CEI)パターンに従っている。このパターンが守られていない場合、攻撃者は外部呼び出しのタイミングで再入し、状態が更新される前の古い(不正な)値を利用して、資金を繰り返し引き出すことが可能になる。

    1. Checks(検証): 実行条件を確認
    2. Effects(状態更新): 状態変数(残高など)を更新
    3. Interactions(外部呼び出し): 外部コントラクトへの呼び出しを実行

 

デコレータの役割
Vyperの@nonreentrantデコレータは、この再入を防ぐためのセキュリティガードである。Vyperは、Ethereum向けに設計された安全性重視のスマートコントラクト言語で、Solidityよりもシンプルで予測可能な構文を採用していることから、Curve FinanceをはじめDeFiプロトコルや資産管理系プロジェクトで広く利用されている。

しかし、今回の事件ではコンパイラのバグにより、このガードが正常に機能しなかった。


攻撃手法と流出経路

今回の攻撃は、Vyperコンパイラのバグにより@nonreentrantガードが機能しなかったことを悪用し、Curve Financeの流動性プールから資金を不正に引き出すというものだった。

攻撃のステップ(リエントランシーの実行)

攻撃は、脆弱なVyperバージョンでコンパイルされたCurveのプールコントラクトのremove_liquidity関数を標的として行われた。

Curve Financeへのリエントランシー攻撃のステップは以下のような構造になっている。

    1. 攻撃者は、悪意のあるコントラクト(アタッカーコントラクト)から、Curveプールの脆弱なremove_liquidity関数を呼び出す。
    2. remove_liquidity関数は、流動性トークン(LPトークン)のバーン量を計算し、引き出し額を決定する。
    3. remove_liquidity関数は、引き出し額を攻撃者のアドレスに送金するために、外部呼び出し(raw_call)を実行する。この外部呼び出しは、ネイティブETHの転送、またはERC-20トークンのtransfer関数呼び出しを含む。
    4. 制御フローを受け取ったアタッカーコントラクトは、悪意のあるフォールバック関数(または受信関数)内で、STEP 1で呼び出したのと同じremove_liquidity関数を再帰的に呼び出す(リエントランシー)。
    5. 4.の再帰的な呼び出しが完了し、アタッカーコントラクトに資金が送金される。この再帰的な呼び出しを複数回繰り返す。
    6. 最終的に、最初のremove_liquidity関数の実行に戻り、LPトークンの残高更新が実行される。

 

攻撃成功の鍵
この攻撃が成功した主要な要因は以下の2点である。

    1. コンパイラのバグ: @nonreentrantガードが機能せず、再入が可能になった。
    2. CEIパターンの不遵守: 外部呼び出し(資金転送)が状態更新(残高減算)よりも先に実行された。

 


事件の根本要因

この事件の根本原因は、Curve Financeのスマートコントラクト自体ではなく、それをコンパイルするために使用されたVyperコンパイラのバグにある。

1. Vyperコンパイラの@nonreentrant実装の欠陥
Vyper言語は、関数に@nonreentrantデコレータを付与することで、リエントランシーを防止する機能を提供している。このデコレータは、@nonreentrant(‘key’)のようにキーを指定することで、同じキーを持つ複数の関数間でのリエントランシーを防ぐことができる。

しかし、脆弱なバージョン(v0.2.15, v0.2.16, v0.3.0)では、コンパイラのストレージスロット割り当てロジックにバグがあり、異なる関数で同じキーが使用されていても、それぞれに異なるストレージスロットを割り当ててしまうという問題が発生していた。この結果、func_Aが実行中にロックをかけても、func_Bはロックがアクティブであることを認識できず、再入が可能となってしまった。Curveのプールコントラクトでは、remove_liquidity関数がこの脆弱な実装でコンパイルされていたため、外部呼び出しを介した再入を防ぐことができなかった。

2. CEIパターンの不遵守(ネイティブETH転送の特性)
脆弱なコンパイラが根本原因ではあるが、攻撃が成功した背景には、コントラクトのロジックがChecks-Effects-Interactions(CEI)パターンを厳密に遵守していなかった点も挙げられる。

remove_liquidity関数は、外部呼び出し(Interaction)である資金転送を、状態変数の更新(Effects)であるLP残高の差し引きよりも前に実行していた。

特に、ネイティブETHの転送は、受信側コントラクトのフォールバック関数をトリガーし、制御フローを完全に移譲する。この特性と、Vyperコンパイラのバグによるリエントランシーガードの無効化が組み合わさることで、攻撃が成立した。


現在の状況と事後対応

事件発生後、迅速な対応が行われた。ホワイトハット(セキュリティ研究者)やMEVボット(未確定トランザクションを監視し、取引の順番を操作するツール)が大規模な資金回収に貢献した注目すべき事例となった。

対応主体 対応内容
Vyper開発チーム 脆弱性を修正したVyper v0.3.1をリリース。また、コンパイラのテストカバレッジを向上させ、クロスファンクション・リエントランシーのテストケースを追加。
Curve Finance 影響を受けたプールでの報酬(CRV)の配布を停止。緊急DAOを設立し、資金回復に向けた対応を調整。
ホワイトハット/MEVボット 攻撃者のトランザクションをフロントランニングする形で、約70%以上の資金(約5,230万ドル)を回収。回収された資金は、Curve DAOに返還された。
業界全体 脆弱なVyperバージョンでコンパイルされた他のプロトコル(Alchemix, JPEG’d, Metronomeなど)も影響を受けたが、多くが迅速な対応により被害を最小限に抑えた。

業界への提言と対策

今回の事件は、アプリケーション層のバグではなく、コンパイラという基盤層の脆弱性が引き起こしたという点で、DeFi業界に大きな衝撃を与えた。開発者がセキュリティベストプラクティスに従ってコードを書いていても、その基盤となるツールチェーンに欠陥があれば、脆弱性が生まれてしまう。

このサプライチェーンリスクの現実を、業界全体が認識する必要がある。

特に重要なのは、言語レベルのセキュリティ機能(@nonreentrantのようなデコレータ)に完全に依存することの危険性である。これらの機能の利便性は高いものの、その実装が正しいことを検証する責任は、最終的には開発者とプロトコル側にある。複数の防御層を設け、単一障害点(Single Point of Failure)を作らないことが、堅牢なセキュリティ体制の鍵となる。

ここでは、この教訓を踏まえた実践的なセキュリティチェック項目と、業界全体として求められる技術的な対策を整理する。

セキュリティチェック項目

    • 使用しているスマートコントラクト言語のコンパイラバージョンが最新かつ安全であることを確認する。
    • すべての外部呼び出しを含む関数において、Checks-Effects-Interactions (CEI)パターンを厳格に遵守しているか確認する。
    • 言語レベルのリエントランシーガード(例: @nonreentrant)に依存するだけでなく、カスタムのロック機構やOpenZeppelinなどの実績あるライブラリのガードを併用することを検討する。
    • あらゆる種類のリエントランシー攻撃に対するユニットテストおよび統合テストを徹底する。
    • コンパイラや基盤となる言語のアップデート後、影響を受ける可能性のあるコントラクトについて、再監査または形式的検証(Formal Verification)を実施する。

業界全体として求められる技術的対策

今回の事件から得られた教訓を踏まえ、DeFi業界全体として以下のような技術的対策の導入・強化が求められる。

    • スマートコントラクト言語のコンパイラやフレームワークに対する、定期的な第三者監査とバグバウンティプログラムの実施 
    • メジャーバージョンアップ時のセキュリティ監査の実施 
    • 形式的検証ツールの積極的活用による、既知の脆弱性パターン(リエントランシー等)の事前検出
    • 言語レベルのガードに加え、実績あるライブラリ(OpenZeppelin等)を併用した多層防御の実装
    • 異常な資金移動を検知した際の緊急停止機能(Circuit Breaker)の標準実装

 

また、サプライチェーンセキュリティの観点から次のような継続的対応も重要である。

    • 使用しているコンパイラ、ライブラリのバージョン情報を明確に管理し、SBOM(Software Bill of Materials)として公開することによる脆弱性影響範囲の迅速な特定
    • 同一のバイナリを生成することによるコンパイル結果の再現性保証とサプライチェーン攻撃リスクの低減 
    • リアルタイムトランザクション監視システムの導入による、異常パターン(繰り返しの関数呼び出し、想定外の資金移動等)の早期検知 

結論

この事件は、アプリケーション層だけでなく、その基盤となる言語やコンパイラといったインフラストラクチャ層のセキュリティが極めて重要であることを示しています。業界全体でこの教訓を活かし、より堅牢なセキュリティ体制を構築することが求められる。

 


参考文献

    1. Hack3d: The Web3 Security Report 2023
      https://www.certik.com/resources/blog/hack3d-the-web3-security-report-2023
    2. Hack3d: The Web3 Security Report 2024
      https://www.certik.com/resources/blog/hack3d-the-web3-security-report-2024?utm_source=chatgpt.com
    3. Hack3d: The Web3 Security Quarterly Report – Q1 2025
      https://www.certik.com/resources/blog/1VvsLFlcsEOkt4thGgSdx-hack3d-the-web3-security-quarterly-report-q1-2025?utm_source=chatgpt.com
    4. Vyper Nonreentrancy Lock Vulnerability Technical Post-Mortem Report
      https://hackmd.io/@vyperlang/HJUgNMhs2
    5. PeckShieldAlert
      https://x.com/PeckShieldAlert/status/1688404426825117697?s=20
    6. Vulnerability in Curve Finance Vyper Code Leads to Multi-Million Dollar Hack Affecting Several Liquidity Pools [UPDATED 8/8/23]
      https://www.chainalysis.com/blog/curve-finance-liquidity-pool-hack/
    7. Benevolent hacker pulls back $5.4 million targeted in $52 million Curve Finance hack
      https://fortune.com/crypto/2023/07/31/curve-finance-52-million-hack-hacker-helps-return-funds/
    8. Explained: The Vyper Bug Hack
      https://www.halborn.com/blog/post/explained-the-vyper-bug-hack-july-2023
    9. Curve Finance Hacker Returns Incomplete Funds, Firm Offers Bounty To Identify Hacker
      https://bitcoinist.com/curve-finance-exploiter-returns-incomplete-funds/
    10.  
  1.  

お問い合わせ先

JBA:https://jba-web.jp/contact

 

免責事項

本レポートは、公開情報や信頼できると判断される情報源に基づき、レポート作成者において、一般的なセキュリティリテラシーの向上を目的として作成されたものであり、特定の企業や個人を誹謗・中傷する意図はありません。

内容の正確性や完全性については万全を期していますが、JBAおよびレポート作成者は、本レポートに基づいて利用者が行ういかなる行為についても一切の責任を負いません。

本レポートの見解は執筆者またはセキュリティ分科会に属する個人の見解であり、JBA全体の公式見解を示すものではありません。

 

2026年1月9日
文責:JBAセキュリティ分科会
レポート執筆・監修協力:株式会社TECHFUND

PREV NEXT