2020年 DeFi フラッシュローン事例集 ~Postmortem~

Yuya Sugano
27 min readJan 15, 2021

--

2020年はDeFi & フラッシュローンから幕を開けEthereum 2.0のビーコンチェーンとEthの高騰で盛り上がったEthereum界隈でした(個人的です)。DeFiのトラクションは失われておらず引き続きEthereumを牽引する1つのユースケースとして2021年も活発な開発が続けられるでしょう。ただ価格の高騰やトランザクションの混雑によるトランザクションコストの増大により、その他のブロックチェーンでもDeFiのユースケースが波及し増える可能性が高いと思います。年始から既にフラッシュローンを利用したDeFiプロトコルへの攻撃が発生しています。今回は2020年で最初にフラッシュローンが観測された1月からどのようなフラッシュローンがあったのか改めて確認してみました。トレンド的にはほとんどがAMMのオラクル操作系の攻撃となっています。細かい数字や表現で多少違ったことを書いている可能性がありますがご了承ください。

Image by Gordon Johnson from Pixabay

Ethereumの無法地帯ぶりからするとフラッシュローンには様々な活用パターンが考えられそうです。しかし年初のbZxのインシデントに対するPostmortemで紹介されているとおり主として2種類のパターンが存在するでしょう。紹介するフラッシュローン攻撃のタイトル横にこれらのパターンのうちどちらが利用されているか P(Pump and Arbitrage) O(Oracle Manipulation)を書いておきました。[1]

  • Pump and Arbitrage(パンプ&アービトラージ)
  • Oracle Manipulation(オラクル操作)

※オラクル操作という名称は紛らわしいのですがChainlinkのようなオラクルサービスを指しているわけではなくプロトコルから価格を参照している対象のスマートコントラクト(UniswapやCurveの価格や流動性プール)を操作することを指しています

  1. 最初のフラッシュローン
  2. bZxフラッシュローン事件 part1 (P)
  3. bZxフラッシュローン事件 part2 (O)
  4. Balancer STAトークンデフレ攻撃
  5. Harvest FinanceをHarvestしちゃった事件 (O)
  6. Cheese Bankフラッシュローン事件 (O)
  7. Value DeFiのValueを奪っちゃった事件 (O)
  8. Warp Financeの資金がWarpしちゃった事件 (O)

1. 最初のフラッシュローン

フラッシュローンを作ってみる記事でご紹介したAaveのフラッシュローンで、こちらが一番最初にパブリックに公表されたフラッシュローンだと思います。ArbitrageDAOというコントラクトでローン手数料とトランザクション手数料を除くと5.45 DAIのプロフィットがありました。今ではガス手数料が上昇しているので、同様のアビトラを成功させてもそれほど利益は得られないかもしれません。またSCDのシャットダウンに伴いDAIとSAIのMigrationがMakerプロトコルでできないので全く同じ手法は行えません。トランザクションのEtherscanリンクです。参考のためこのフラッシュローンで何が行われたか確認してみます。[2]

https://twitter.com/CamiRusso/status/1218640871048056832

Etherscanのトランザクションの内容を簡単に説明します。使用しているプロトコルはMaker DAOとUniswapです。レンディングプールから借りたDAIをMaker MigrationのコントラクトでSAIに変換しています。変換したSAIをUniswapでDAIにスワップすることでDAI/SAIの価格差が利益として出現しています。最終的に借りたDAIと0.09%の手数料をレンディングプールへ返却して、9 DAIがフラッシュローンのコントラクトへ戻ってきていることが確認できます。これは価格差の発生する可能性があった類似商品を対象としたアビトラと考えられるでしょう。

フラッシュローンがうまくいかずこのトランザクションが成立しない場合には処理自体がすべてリバートされます。フラッシュローン手数料もその場合にはかかりません(失敗したところまでのトランザクション手数料はかかる)。フラッシュローンによって保有している量以上のDAIをレバレッジできている上に、下手にポジションを持つ必要がないのでリスクも低減されていると思います。[3]

https://etherscan.io/tx/0x4555a69b40fa465b60406c4d23e2eb98d8aee51def21faa28bb7d2b4a73ab1a9

2. bZxフラッシュローン事件 part1 (P)

2/15に発生したbZx、dYdX、Fulcrum、Compound、Uniswapのプロトコルを使用したフラッシュローン事件です。基本的にはアービトラージ取引とbZxのコントラクトバグを突いた複合的なハックとなっています。アービトラージ取引部分は綿密に計算された正当なフラッシュローンのコントラクトではありますが、そこにbZxのスマートコントラクトのバグを噛ましているところが味噌になっています。対象のbZxプロトコルのバグは事件後すぐにフィックスされました。bZxのバグはマージン取引で借りたWBTCの価格が高騰していたにも関わらずETHの担保不足でポジション清算がされないようになっていたことです。これはパンプ&アービトラージのパターンです。

https://bloxy.info/tx/0xb5c8bd9430b6cc87a0e2fe110ece6bf527fa4f170a4bc8cd032f768fc5219838
bZx accouncement for fixing the bug

詳細な解説は以下のサイトに掲載されています。流れだけ箇条書きで写しておきます。フラッシュローンのやり取りをシングルトランザクションで実行できているために各取引における不確実性のリスクが解消されています。各取引が想定通りでフラッシュローンを返済できる場合にだけ、最後まで裁定解消を確定できることになります。[4]

  1. dYdX から 10,000 ETHを借りる(Flashloan で借りています)
  2. 5,500 ETH を Compound にデポジットして 112 WBTC を借りる
  3. 1,300 ETH をデポジットして bZx のマージン取引を執行
  4. 1,300 ETH を担保に借りた 5637.623762 ETH を KyberSwap で 51.345576 WBTC と交換
  5. KyberSwap によって交換レートが 1 WBTC / 109.8 WETH へと上昇し Uniswap での WBTC が高騰
  6. Compound で借りていた 112 WBTC を Uniswap 上で売却し 6871.4 ETH を得る(このときの Uniswap でのレートは 1 WBTC / 61.4 WETH)
  7. 売却で得た 6871.4 ETH と残っていた 3,200 ETH から dYdX の Flashloan で借りていた 10,000 ETH を返済して 71 ETH の裁定利益を得る
  1. Compound の債務解消を実行し 1,200 ETH を得る(このときの交換レートは 1 WBTC / 38.5 WETH で 5,500 ETH から 4,300 ETH を減算)
  2. アビトラで得た 71 ETH と 1,200 ETH を合わせて 1,271 ETHの利益

Etherscanの履歴を確認するとこのトランザクションには$7.19ほどしかかかっていないことが分かります。dYdXはフラッシュローン自体に手数料がほとんどかからないため純粋にトランザクション手数料のみで実行されています。

https://etherscan.io/tx/0xb5c8bd9430b6cc87a0e2fe110ece6bf527fa4f170a4bc8cd032f768fc5219838

3. bZxフラッシュローン事件 part2 (O)

2/18に発生したbZx、KyberSwap、Uniswap、Synthetixのプロトコルを悪用した攻撃です。オラクル操作によってSynthetixのsUSDをbZxのレンディングプール内で高騰させることで大量のETHへ変換しフラッシュローンを返済しています。トランザクションはこちらです。詳細はまたこちらの記事に記載されているので箇条書きで流れだけ追ってみます。[5]

https://bloxy.info/tx/0x762881b07feb63c436dee38edd4ff1f7a74c33091e534af56c9f7d49b5ecac15
  1. bZx から 7,500 ETH をフラッシュローンで借りる(dYdXではない)
  2. 900 ETH を KyberSwap で計 156,003 sUSD と交換(2つのバッチに分割されており最初のバッチで 540 ETHを 92,419 sUSD に、次のバッチで 63,584 sUSD を交換)
    結果的にETH/sUSDのレートが通常の 2.5 倍以上に上昇
  3. 借りた 6,000 ETH で Synthetix のコントラクトから sUSD をマーケットプライスで取得、Synthetix は KyberSwap のコントラクトを参照していないため 943,837 sUSD を取得(2,482 ETH は超過のためリファンド)
  4. 1M を超える sUSD を担保に bZx から 6,796 ETHを借りる
    通常であれば 4,000 ETH 程度のレートだが bZx は KyberSwap を参照
  5. リファンドなどで残っていた 3,082 ETH と 6,796 ETH から 7,500 ETHをbZxへ返済して 2,378 ETHのプロフィット

フラッシュローンを利用していない例として、dForceがimBTCトークンと同様にERC-777仕様のトークンを悪用したReentrancyの手法で攻撃されました。また7/16にはBancorのスマートコントラクトにバグが発見されたことが報告されました。チームは新しいスマートコントラクトへファンドを移動しようとしましたが、フロントランナーのアービトラージボットによって一部資金が失われてしまったようです。

4. Balancer STAトークンデフレ攻撃

7/28に発生したBalancerとERC-20トークンであるSTAの仕様を突いた攻撃です。これはいずれのパターンでもありませんがフラッシュローンによる原資を活用しています。STAトークンはトークン転送のたびに1%のデフレを行うように設計されていましたが、このデフレ部分とBalancerの仕様との不整合によりBalancerプール内でのSTAトークンを増加させないでおくことが可能でした。攻撃者はSTAトークンの価値が高い状態で他アセットへのスワップを繰り返したようです。詳細はまたPeckShieldの解説を参照しています。[6]

https://bloxy.info/tx/0x013be97768b702fe8eccef1a40544d5ecb3c1961ad5f87fee4d16fdc08c78106
  1. dYdX から 104,331 WETHを借りる(Flashloan で借りています)
  2. 対象プールにある 455 WETH のうち半数である 227.9 WETH を STAトークンへスワップ
    ※スワップできる上限トークン数までスワップを行った
  3. Balancer プールの STA が 1e-18 まで減少、この状態で 1 STA が Balancer プールにおいて他アセットに対して高くなっている状態
  4. 攻撃者は STA トークンと WETH をスワップ、内部状態を記録する _record[STA] が 1 STA 増加するが Balancer プールは STA トークンの転送時のデフレによって 1 STA 増加させることができない状態
  5. gulp() 関数の呼び出しによって _record[STA] が Balancer プールの 1e-18 へ再度差し戻される
  6. トークンスワップを繰り返し計 $ 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]

https://bloxy.info/tx/0x35f8d2f572fceaac9288e5d462117850ef2694786992a8c3f6d02612277b0877
  1. Uniswapから大量の資金(18,308,555.417594 USDT と 50,000,000 USDC)を攻撃者のコントラクトへ引き出す
  2. 17,222,012.640506 USDT を Curve.fi の Y pool で USDC へスワップ、17,216,703.208672 USDC を得るとともに USDC の価値が高騰
  3. 攻撃者は 49,977,468.555526 USDC を Harvest Finance の USDC Vault へデポジット、51,456,280.788906 fUSDC を得る
    ※ このとき fUSDC あたりのシェアは 0.97126080216 USDC へ低下
  4. 17,239,234.653146 USDC を Curve.fi の Y pool で USDT へスワップ、攻撃者は 17,230,747.185604 USDT を得る、このスワップによって USDC のシェアが元に戻る
  5. Harvest Finance USDC Vault へデポジットしていた 51,456,280.788906 fUSDC を引き出す、fUSDC の USDC 価格は元に戻っているため攻撃者は 619408.812299 USDC を得ることに成功
  6. 計 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 BankValue 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]

  1. dYdX から 21,000 ETHを借りる(Flashloan で借りています)
  2. Uniswap で 50 ETH を 107,000 CHEESE へスワップ
  3. スワップした 107,000 CHEESE と相当する 78 ETH を UniswapV2 の流動性プールへ送信、UNI_V2 LP トークンを得る
  4. UNI_V2 LP トークンで sUNI_V2 トークンを発行
  5. 20,000 ETH を Uniswap 上で 288,000 CHEESE にスワップ、このとき CHEESE トークンの価値が急騰、また WETH の流入でプールの総額が増えたことで対象 UNI_V2 LP トークンの担保価値が Cheese Bank 内で上昇
    Cheese Bank から流動性プール内の WETH の量から LP トークンの価格を見積もるため
  6. CheesePriceOracle::Refresh() を明示的に呼び出すことで LP トークンの価格を上昇させた、LP トークンの価格は流動性プール内の WETH の量と USDT-ETH プールの ETH 価格から計算される
    計算式: (wETH balance x 2 x ETH price) / totalSupply of LP token
  7. Cheese Bankからborrow() で 2M USDC、1.23 M USDT、87,000 DAIを入手
  8. Uniswap で 288,000 CHEESE を 19,980 ETH へスワップ、同様に Uniswap で 58,000 USDC を 132 ETH へスワップ
  9. 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]

  1. Aave から 80,000 ETHを借りる(Flashloan で借りています)
  2. UniswapV2 で WETH を 116,000,000 DAI へスワップ
  3. UniswapV2 で借りた 80,000 ETH を 31,000,000 USDT へスワップ
  4. 25,000,000 DAI を Value DeFi へデポジットし 24,900,000 のプールトークンを得る(裏側は Curve,fi の 24,956,000 3crv トークン)
  5. Curve.fi で 90,000,000 DAI を 90,285,000 USDC へスワップ
  6. Curve.fi で 31,000,000 USDT を 17,330,000 USDC へスワップ
  7. Value DeFi の 24,900,000 プールトークンを焼却して 33,089,000 3crv トークンを得る(USDC の価値が上昇していたことによる)
  8. Curve.fi で 17,330,000 USDC を 30,940,000 USDT へスワップ
  9. Curve.fi で 90,285,000 USDC を 90,927,000 DAI へスワップ
  10. 33,089,000 3crv トークンを償却して 33,110,000 DAI を得る
  11. Uniswap の処理および Aave のフラッシュローンを完了させる
  12. 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]

  1. dYdX および Uniswap から 2,900,000 DAI と 344,800 WETH を借りる
  2. dYdX から借りた 2,900,000 DAI と 76,000 WETH を UniswapV2 へデポジットして 94,349 WETH-DAI LP トークンを入手
  3. LP トークンを WarpVaultLP へデポジット
  4. UniswapV2 で 341,000 WETH を 47,600,000 DAI へスワップ、DAI の価値が上昇したことで LP トークンの価格が 2 倍以上に変化
  5. Warp Finance 上の担保価値の上昇によって攻撃者は大量の DAI および USDC を借りることに成功(3,860,000 DAI / 3,900,000 USDC)
  6. dYdX および Uniswap のフラッシュローンを返済
  7. LP トークンはまだ Warp Finance へデポジットされたままでありポジションが解消されていない

まとめ

  • フラッシュローンを利用したDeFiプロトコルへの攻撃は主に2種類ある
  • Pump and Arbitrage(パンプ&アービトラージ)とOracle Manipulation(オラクル操作)が発生したがオラクル操作型が多く発生している
  • 攻撃方法でオラクル操作(Oracle Manipulation)と記述されている点は紛らわしい、ChainlinkのようなオラクルではなくAMMのスマートコントラクトを介して価格へ影響を与えることをオラクル操作と呼んでいる
  • システムのデザインにも寄るが純粋にトークン価格を参照する場合にはChainlinkのようなDOS(Decentralized Oracle Services)を利用する

--

--

Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。