2020年 DeFi フラッシュローン事例集 ~Postmortem~
2020年はDeFi & フラッシュローンから幕を開けEthereum 2.0のビーコンチェーンとEthの高騰で盛り上がったEthereum界隈でした(個人的です)。DeFiのトラクションは失われておらず引き続きEthereumを牽引する1つのユースケースとして2021年も活発な開発が続けられるでしょう。ただ価格の高騰やトランザクションの混雑によるトランザクションコストの増大により、その他のブロックチェーンでもDeFiのユースケースが波及し増える可能性が高いと思います。年始から既にフラッシュローンを利用したDeFiプロトコルへの攻撃が発生しています。今回は2020年で最初にフラッシュローンが観測された1月からどのようなフラッシュローンがあったのか改めて確認してみました。トレンド的にはほとんどがAMMのオラクル操作系の攻撃となっています。細かい数字や表現で多少違ったことを書いている可能性がありますがご了承ください。
Ethereumの無法地帯ぶりからするとフラッシュローンには様々な活用パターンが考えられそうです。しかし年初のbZxのインシデントに対するPostmortemで紹介されているとおり主として2種類のパターンが存在するでしょう。紹介するフラッシュローン攻撃のタイトル横にこれらのパターンのうちどちらが利用されているか P(Pump and Arbitrage)か O(Oracle Manipulation)を書いておきました。[1]
- Pump and Arbitrage(パンプ&アービトラージ)
- Oracle Manipulation(オラクル操作)
※オラクル操作という名称は紛らわしいのですがChainlinkのようなオラクルサービスを指しているわけではなくプロトコルから価格を参照している対象のスマートコントラクト(UniswapやCurveの価格や流動性プール)を操作することを指しています
- 最初のフラッシュローン
- bZxフラッシュローン事件 part1 (P)
- bZxフラッシュローン事件 part2 (O)
- Balancer STAトークンデフレ攻撃
- Harvest FinanceをHarvestしちゃった事件 (O)
- Cheese Bankフラッシュローン事件 (O)
- Value DeFiのValueを奪っちゃった事件 (O)
- Warp Financeの資金がWarpしちゃった事件 (O)
1. 最初のフラッシュローン
フラッシュローンを作ってみる記事でご紹介したAaveのフラッシュローンで、こちらが一番最初にパブリックに公表されたフラッシュローンだと思います。ArbitrageDAOというコントラクトでローン手数料とトランザクション手数料を除くと5.45 DAIのプロフィットがありました。今ではガス手数料が上昇しているので、同様のアビトラを成功させてもそれほど利益は得られないかもしれません。またSCDのシャットダウンに伴いDAIとSAIのMigrationがMakerプロトコルでできないので全く同じ手法は行えません。トランザクションのEtherscanリンクです。参考のためこのフラッシュローンで何が行われたか確認してみます。[2]
Etherscanのトランザクションの内容を簡単に説明します。使用しているプロトコルはMaker DAOとUniswapです。レンディングプールから借りたDAIをMaker MigrationのコントラクトでSAIに変換しています。変換したSAIをUniswapでDAIにスワップすることでDAI/SAIの価格差が利益として出現しています。最終的に借りたDAIと0.09%の手数料をレンディングプールへ返却して、9 DAIがフラッシュローンのコントラクトへ戻ってきていることが確認できます。これは価格差の発生する可能性があった類似商品を対象としたアビトラと考えられるでしょう。
フラッシュローンがうまくいかずこのトランザクションが成立しない場合には処理自体がすべてリバートされます。フラッシュローン手数料もその場合にはかかりません(失敗したところまでのトランザクション手数料はかかる)。フラッシュローンによって保有している量以上のDAIをレバレッジできている上に、下手にポジションを持つ必要がないのでリスクも低減されていると思います。[3]
2. bZxフラッシュローン事件 part1 (P)
2/15に発生したbZx、dYdX、Fulcrum、Compound、Uniswapのプロトコルを使用したフラッシュローン事件です。基本的にはアービトラージ取引とbZxのコントラクトバグを突いた複合的なハックとなっています。アービトラージ取引部分は綿密に計算された正当なフラッシュローンのコントラクトではありますが、そこにbZxのスマートコントラクトのバグを噛ましているところが味噌になっています。対象のbZxプロトコルのバグは事件後すぐにフィックスされました。bZxのバグはマージン取引で借りたWBTCの価格が高騰していたにも関わらずETHの担保不足でポジション清算がされないようになっていたことです。これはパンプ&アービトラージのパターンです。
詳細な解説は以下のサイトに掲載されています。流れだけ箇条書きで写しておきます。フラッシュローンのやり取りをシングルトランザクションで実行できているために各取引における不確実性のリスクが解消されています。各取引が想定通りでフラッシュローンを返済できる場合にだけ、最後まで裁定解消を確定できることになります。[4]
- dYdX から 10,000 ETHを借りる(Flashloan で借りています)
- 5,500 ETH を Compound にデポジットして 112 WBTC を借りる
- 1,300 ETH をデポジットして bZx のマージン取引を執行
- 1,300 ETH を担保に借りた 5637.623762 ETH を KyberSwap で 51.345576 WBTC と交換
- KyberSwap によって交換レートが 1 WBTC / 109.8 WETH へと上昇し Uniswap での WBTC が高騰
- Compound で借りていた 112 WBTC を Uniswap 上で売却し 6871.4 ETH を得る(このときの Uniswap でのレートは 1 WBTC / 61.4 WETH)
- 売却で得た 6871.4 ETH と残っていた 3,200 ETH から dYdX の Flashloan で借りていた 10,000 ETH を返済して 71 ETH の裁定利益を得る
- Compound の債務解消を実行し 1,200 ETH を得る(このときの交換レートは 1 WBTC / 38.5 WETH で 5,500 ETH から 4,300 ETH を減算)
- アビトラで得た 71 ETH と 1,200 ETH を合わせて 1,271 ETHの利益
Etherscanの履歴を確認するとこのトランザクションには$7.19ほどしかかかっていないことが分かります。dYdXはフラッシュローン自体に手数料がほとんどかからないため純粋にトランザクション手数料のみで実行されています。
- bZx から 7,500 ETH をフラッシュローンで借りる(dYdXではない)
- 900 ETH を KyberSwap で計 156,003 sUSD と交換(2つのバッチに分割されており最初のバッチで 540 ETHを 92,419 sUSD に、次のバッチで 63,584 sUSD を交換)
結果的にETH/sUSDのレートが通常の 2.5 倍以上に上昇 - 借りた 6,000 ETH で Synthetix のコントラクトから sUSD をマーケットプライスで取得、Synthetix は KyberSwap のコントラクトを参照していないため 943,837 sUSD を取得(2,482 ETH は超過のためリファンド)
- 1M を超える sUSD を担保に bZx から 6,796 ETHを借りる
通常であれば 4,000 ETH 程度のレートだが bZx は KyberSwap を参照 - リファンドなどで残っていた 3,082 ETH と 6,796 ETH から 7,500 ETHをbZxへ返済して 2,378 ETHのプロフィット
4. Balancer STAトークンデフレ攻撃
7/28に発生したBalancerとERC-20トークンであるSTAの仕様を突いた攻撃です。これはいずれのパターンでもありませんがフラッシュローンによる原資を活用しています。STAトークンはトークン転送のたびに1%のデフレを行うように設計されていましたが、このデフレ部分とBalancerの仕様との不整合によりBalancerプール内でのSTAトークンを増加させないでおくことが可能でした。攻撃者はSTAトークンの価値が高い状態で他アセットへのスワップを繰り返したようです。詳細はまたPeckShieldの解説を参照しています。[6]
- dYdX から 104,331 WETHを借りる(Flashloan で借りています)
- 対象プールにある 455 WETH のうち半数である 227.9 WETH を STAトークンへスワップ
※スワップできる上限トークン数までスワップを行った - Balancer プールの STA が 1e-18 まで減少、この状態で 1 STA が Balancer プールにおいて他アセットに対して高くなっている状態
- 攻撃者は STA トークンと WETH をスワップ、内部状態を記録する
_record[STA]
が 1 STA 増加するが Balancer プールは STA トークンの転送時のデフレによって 1 STA 増加させることができない状態 gulp()
関数の呼び出しによって_record[STA]
が Balancer プールの 1e-18 へ再度差し戻される- トークンスワップを繰り返し計 $ 523,616.52 のプロフィットを得る
ERC-20やERC-777は標準的なトークン実装なのですが、仕様を理解して正しく取り扱わないと容易に攻撃されてしまうという例でした。DeFiはオープンソースプロジェクトでプロトコルの統合やコンポーザビリティに優れていますが、それだけ自由度も過度に高く、個別のプロトコルは何をしているか分かるが、組み合わさると何が起きているか分からなくなる可能性が非常に高いです。
まさに規制緩和で複雑化した金融システムが崩壊するように、DeFiも個々のリスクについては把握されていても、積み重なったときの危機については予想ができない状態です。リーマン・ブラザーズを契機とした金融危機の原因は何かという質問に対するLSEの回答が『各状況において誰かが誰かを当てにしており、全員が全員正しいことをしていると信じられていたからだ』であったことは忘れるべきでないでしょう。[7]
And there is also finding the will to act and being sure that authorities have as part of their powers the right instruments to bring to bear on the problem. The difficulty was seeing the risk to the system as a whole rather than to any specific financial instrument. Tthey frequently lost sight of the bigger picture.
Harvest FinanceをHarvestしちゃった事件 (O)
10/26に発生したUniswapのFlash Swapを活用したオラクル操作タイプの攻撃です。Harvest Financeはユーザのデポジットした資産を他のDeFiで運用することでLPプールの利益およびFARMトークンを提供するプロトコルです。攻撃者はHarvest Financeが資金を運用するCurve.fiのY poolの価格を操作することでHarvest FinanceのUSDTおよびUSDCのVaultへ影響を与えることでプロフィットを得ていました。攻撃手法については公式サイトのブログを参考にしました。[8]
- Uniswapから大量の資金(18,308,555.417594 USDT と 50,000,000 USDC)を攻撃者のコントラクトへ引き出す
- 17,222,012.640506 USDT を Curve.fi の Y pool で USDC へスワップ、17,216,703.208672 USDC を得るとともに USDC の価値が高騰
- 攻撃者は 49,977,468.555526 USDC を Harvest Finance の USDC Vault へデポジット、51,456,280.788906 fUSDC を得る
※ このとき fUSDC あたりのシェアは 0.97126080216 USDC へ低下 - 17,239,234.653146 USDC を Curve.fi の Y pool で USDT へスワップ、攻撃者は 17,230,747.185604 USDT を得る、このスワップによって USDC のシェアが元に戻る
- Harvest Finance USDC Vault へデポジットしていた 51,456,280.788906 fUSDC を引き出す、fUSDC の USDC 価格は元に戻っているため攻撃者は 619408.812299 USDC を得ることに成功
- 計 17 回ほど同様の処理を行うことで 13,000,000 USDC および 11,000,000 USDT の利益を得る
狙われたのは USDT と USDC Vault だけであり、その他 DAI/TUSD/WBTC/renBTCへは影響がなかったと報告されています。にもかかわらず USDC Vaultだけで 0.980007から0.834953へ、USDT Vaultでは0.978874から0.844812へ価格が下がったことで$33.8 Mもの損害を出してしまいました。これは攻撃前のHarvest Finance Vaults全体の最大3.2%に相当したとのことです。この事件では攻撃者が得たファンドの一部を返却してきており、その点も議論を巻き起こしたなという印象です。
11月はフラッシュローンを使用していないものも含め、非常に多くの攻撃がありました。フラッシュローンを活用した例としてCheese Bank、Value DeFi、そうでないものとしてAkropolisとOrigin Protocolが挙げられます。AkropolisとOrigin Protocolの攻撃もフラッシュローン自体は使っていますが、攻撃に使用した脆弱性の主な要因がコントラクトバグなのでフラッシュローンのケースとしては取り上げません。AkropolisとOrigin Protocolの分析については以下リンクから確認できます。[9] [10]
Cheese Bankフラッシュローン事件 (O)
11/6に発生したdYdXのフラッシュローンを活用し、Uniswapで流動性プールのアセット量を操作することで$3.3Mの資金が流出した件です。Cheese BankがUniswapの流動性プールの内のWETHやETH価格を参照していたことから担保価値を上昇させることで不正にUSDT/USDC/DAIを入手できてしまいました。これもオラクル操作系のインシデントです。[11]
- dYdX から 21,000 ETHを借りる(Flashloan で借りています)
- Uniswap で 50 ETH を 107,000 CHEESE へスワップ
- スワップした 107,000 CHEESE と相当する 78 ETH を UniswapV2 の流動性プールへ送信、UNI_V2 LP トークンを得る
- UNI_V2 LP トークンで sUNI_V2 トークンを発行
- 20,000 ETH を Uniswap 上で 288,000 CHEESE にスワップ、このとき CHEESE トークンの価値が急騰、また WETH の流入でプールの総額が増えたことで対象 UNI_V2 LP トークンの担保価値が Cheese Bank 内で上昇
Cheese Bank から流動性プール内の WETH の量から LP トークンの価格を見積もるため CheesePriceOracle::Refresh()
を明示的に呼び出すことで LP トークンの価格を上昇させた、LP トークンの価格は流動性プール内の WETH の量と USDT-ETH プールの ETH 価格から計算される
計算式: (wETH balance x 2 x ETH price) / totalSupply of LP token- Cheese Bankから
borrow()
で 2M USDC、1.23 M USDT、87,000 DAIを入手 - Uniswap で 288,000 CHEESE を 19,980 ETH へスワップ、同様に Uniswap で 58,000 USDC を 132 ETH へスワップ
- dYdX の Flashloan で借りていた 21,000 ETH を返済
Value DeFiのValueを奪っちゃった事件 (O)
11/12 Value DeFiのMultiStableVault
から$7.4MのDAIが引き出される事件が発生しました。手法はこれまでにも頻発しているオラクル操作系でCurve.fiの3crvプールの価格を操作することで3crvトークンを大量のDAIへ戻すことができる状態でした。こうなってくると完全に既知のパターンでまたかよという雰囲気ですがDEXを絡めた設計のプロトコルはこのような脆弱性が普通に存在していたということですね。また新規のDeFiプロトコルにも同じ脆弱性が潜んでいる可能性が高いです。詳細についてはまたPeckShieldの解説を参照しています。[12]
- Aave から 80,000 ETHを借りる(Flashloan で借りています)
- UniswapV2 で WETH を 116,000,000 DAI へスワップ
- UniswapV2 で借りた 80,000 ETH を 31,000,000 USDT へスワップ
- 25,000,000 DAI を Value DeFi へデポジットし 24,900,000 のプールトークンを得る(裏側は Curve,fi の 24,956,000 3crv トークン)
- Curve.fi で 90,000,000 DAI を 90,285,000 USDC へスワップ
- Curve.fi で 31,000,000 USDT を 17,330,000 USDC へスワップ
- Value DeFi の 24,900,000 プールトークンを焼却して 33,089,000 3crv トークンを得る(USDC の価値が上昇していたことによる)
- Curve.fi で 17,330,000 USDC を 30,940,000 USDT へスワップ
- Curve.fi で 90,285,000 USDC を 90,927,000 DAI へスワップ
- 33,089,000 3crv トークンを償却して 33,110,000 DAI を得る
- Uniswap の処理および Aave のフラッシュローンを完了させる
- 5,400,000 DAI をウォレットへ 2,000,000 を Value DeFi Deployer へ返却
11/18にはOrigin Protocolの VaultCore
のコントラクトに潜む脆弱性を悪用され$7.7 Mのロスが発生しました。ERC-20ライクな不正コントラクトを通じて mint
-> mintMultiple
-> mint
とoUSDをインフレーションさせる操作を行うことで33,269,000 oUSDを得たのちにフラッシュローンで借りた ETH を返済しています。主となる要因がReentrancyなのでフラッシュローンのケースとしては取り上げません。[12]
Warp Financeの資金がWarpしちゃった事件 (O)
2020年、ラストを飾るのはやはりWarp Financeでしょう。12/17 Warp Financeの WarpVaultSC
への攻撃によって最大 $7.8MのDAIが失われたとのことです。AMMであるUniswapに対するオラクル操作の攻撃でありますが、UniswapのFlash SwapとdYdXのFlashloanの両方を使い少し複雑な攻撃方法となっています。DAIおよびUSDCの被害でLPトークンはWarp Financeへまだデポジットされており、攻撃者はプロフィットを手元へ引き出せてはいません。こちらに攻撃の詳細が記載されています。[13]
- dYdX および Uniswap から 2,900,000 DAI と 344,800 WETH を借りる
- dYdX から借りた 2,900,000 DAI と 76,000 WETH を UniswapV2 へデポジットして 94,349 WETH-DAI LP トークンを入手
- LP トークンを
WarpVaultLP
へデポジット - UniswapV2 で 341,000 WETH を 47,600,000 DAI へスワップ、DAI の価値が上昇したことで LP トークンの価格が 2 倍以上に変化
- Warp Finance 上の担保価値の上昇によって攻撃者は大量の DAI および USDC を借りることに成功(3,860,000 DAI / 3,900,000 USDC)
- dYdX および Uniswap のフラッシュローンを返済
- LP トークンはまだ Warp Finance へデポジットされたままでありポジションが解消されていない
まとめ
- フラッシュローンを利用したDeFiプロトコルへの攻撃は主に2種類ある
- Pump and Arbitrage(パンプ&アービトラージ)とOracle Manipulation(オラクル操作)が発生したがオラクル操作型が多く発生している
- 攻撃方法でオラクル操作(Oracle Manipulation)と記述されている点は紛らわしい、ChainlinkのようなオラクルではなくAMMのスマートコントラクトを介して価格へ影響を与えることをオラクル操作と呼んでいる
- システムのデザインにも寄るが純粋にトークン価格を参照する場合にはChainlinkのようなDOS(Decentralized Oracle Services)を利用する
Reference
- [1] Attacking the DeFi Ecosystem with Flash Loans for Fun and Profit
- [2] Twitter — First aave flash loan with DAI/SAI
- [3] ArbitrageDAO — Transaction Details
- [4] bZx Hack Full Disclosure (With Detailed Profit Analysis)
- [5] bZx Hack II Full Disclosure (With Detailed Profit Analysis)
- [6] Balancer Hacks: Root Cause and Loss Analysis
- [7] Her Majesty The Queen Buckingham Palace
- [8] Harvest Flashloan Economic Attack Post-Mortem
- [9] Akropolis Incident: Root Cause Analysis
- [10] Origin Dollar Incident: Root Cause Analysis
- [11] Cheese Bank’s multi-million-dollar hack explained by security firm
- [12] Origin Dollar Incident: Root Cause Analysis
- [13] WarpFinance Incident: Root Cause Analysis