StableCredit yCreditさっそく脆弱性が見つかるの巻

Yuya Sugano
11 min readJan 11, 2021

--

yearn.financeの新プロジェクトであるStableCreditですが年始さっそく2つの攻撃手法が発見されその方法が公開されています。StableCreditはAndre Cronjeさんの新しいプロダクトで資産のデポジット、レンディング、AMM(Automated Market Maker)を組み合わせたサービスです。後述しますがSingle Side AMM Exposureとして流動性の提供に片側の資産提供だけで対応できるようです。このプロジェクトはベータ版であり使用にはリスクがありますので自己責任で利用しましょう。UIはこちらですがまだ完成していない?ですかね。StableCreditとその攻撃手法の内容を追ってみました。多少間違ったことを書いている可能性があるのでご了承ください。間違いについては指摘頂くか読み替えてください。

Image by Boskampi from Pixabay
  • StableCreditとは
  • Attack Vector 1
  • Attack Vector 2

StableCreditとは

StableCreditはyearn.financeのサービスの1つで昨年より開発されていた新たなDeFiプロトコルです。プロトコルへの資産供与を担保として StableCredit(yCredit)を発行するMakerのような機能、StableCreditを使用したレンディングサービスの機能、さらにyswap.exchangeの提供するような片側の資産デポジットだけで機能するAMM(Automated Market Maker)といった多機能な複合DEXサービスです。

Animation Illustrating the mechanism of yCredit
  1. USDCなどの資産をスマートコントラクトへ提供する
  2. Chainlinkオラクルのフィードから現在の資産価格を取得
  3. 提供された USD 価格の StableCredit(yCredit)が生成される
  4. USDCとyCreditは 50:50 の比率で流動性プールへ提供される
  5. 流動性プールのシステムの利用率が最大75%までで計算される
  6. 最大75%までの使用率で決定された yCredit がクレジットとして提供される

ユーザへ発行された yCredit は貸付クレジットとなります。このクレジットを利用してAMMで他の資産を借りることができます。例えば別のあるユーザーがLINKを担保として提供している場合、クレジットを使用してLINKを借りることができます。債務を返済したい場合は借りているLINKをyCreditに戻して債務を返済し元の提供資産を受け取ることができます。AMMは他プロトコルと同様に価格決定に関与し、システム使用率はユーザがシステムから借り入れる際のクレジット量を定義しています。仕組みの把握についてはyearn.financeのブログと公式のサイトを参考にしました。[1] [2]

複数のコンセプトを統合していていかにもDeFiらしいプロトコルだなという印象ですが、複雑であるが故にコードのバグを突いた攻撃を狙うハッカーがでてきそうです。1/2に攻撃されたとされている実際のトランザクションが既に存在します。2020年後半はDeFi系のプロトコルを中心として多くの攻撃がありました。Harvest FinanceValue DeFiではCurveの価格操作、Cheese BankのケースではUniswapの価格操作によって不適切なプライスフィードを悪用した攻撃がありました。今回の攻撃についてもコントラクトやSushiswapのAMMを悪用したものがありトレンドとしては同じです。

Attack Vector 1

1/2、yCreditのスマートコントラクトに脆弱性があったとして、SushiswapでyCreditを購入したかデポジットしたユーザは資産を売るか引き出すようtweetでご案内がありました。ハッカーはSushiswap上のWBTC-yCreditの流動性プールへ少額の資金(1e-8 WBTC および 331.335 yCredit)を移動した上で0.5 WBTCをStableCreditへデポジットして攻撃を行うことができました。このAttack Vector 1については解説記事が既に出ていますのでその内容を追ってみます。[3]

この攻撃はSushiswapの流動性プールの参照に伴い多量のyCreditトークンが発行できたことが原因です。流動性プールを利用したという点ではCurveやUniswapの価格参照を悪用された誤ったオラクル使用の例と似ているかもしれません。実際のトランザクションはこちらです。この攻撃によって攻撃者は44e-8 WBTCの消費だけで14594.52080025 yCreditを入手できたようです。yCreditトークンは1 USDと等しい価値になるようにデザインされています。得られたyCreditトークンをスワップすることで攻撃者はプロフィットを得ることができたとのことです。脆弱性のあった StableYieldCredit スマートコントラクトは新しいバージョンが既にデプロイされています。[4]

  1. 攻撃者は0.5 WBTCを StableYieldCredit スマートコントラクトへデポジットの指示
  2. オラクルプライスフィードで計算された0.5 WBTC相当のyCreditトークン(14594.52080025 USD)が攻撃者へ
  3. WBTC-yCreditプールのリザーブ状況(1e-8 WBTC および 331.335 yCredit)から44e-8のWBTCが実際に safeTransferFrom で処理
  4. 44e-8 WBTC および 14,999.19510075 yCreditがプールへ残置状態

同様の攻撃手法でsUSDを使ったものがこのtweetで紹介されているトランザクションかと思います。SushiswapのsUSD/yCreditのプールを不適切なバランスとなるように初期操作しておいてからトークンをデポジットすることで大量のyCreditを生成しています。Sushiswapのプール比率の操作によって攻撃者から移転される価格を低く抑えられる状態になる、というスマートコントラクトのバグですね。次のAttack Vector 2は昨年から散見されるお馴染みのパターンです。

https://twitter.com/0xKiwi_/status/1345281360878039040
sUSD pattern

Attack Vector 2

もう1つのAttack Vectorは実際に攻撃されたトランザクションは見つかりませんでした。Twitterとgithub上で攻撃方法が共有されていたのでその内容を確認しました。内容はSushiswapのプールでトークンを大量にスワップすることで価格操作を行いyCreditでおおくのアセットを買い戻すという昨年から継続しているパターンに見えます。リポジトリのコントラクトはAave V2のフラッシュローンを利用するスマートコントラクトで記述されており、ローカルのフォークでテストを行うと実際にプロフィットが発生する状態だったとのことです。[5]

  1. (Flashloanで各種トークンをBorrowする)
  2. yCreditへフラッシュローンで借りた各トークンをデポジットする
  3. Sushiswapでその各トークンを大量にyCreditへスワップする
  4. yCreditから各トークンのyCreditトークンを引き出す
  5. 引き出したyCreditトークンを各トークンへSushiswapでスワップする
  6. 多く交換のできたトークンをプロフィットとして出金する
  7. (Flashloanへ借りた各種トークンをReimburseする)

Aave V1だともっと単純なコントラクトになると思います。

--

--

Yuya Sugano

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