StableCredit yCreditさっそく脆弱性が見つかるの巻
yearn.financeの新プロジェクトであるStableCreditですが年始さっそく2つの攻撃手法が発見されその方法が公開されています。StableCreditはAndre Cronjeさんの新しいプロダクトで資産のデポジット、レンディング、AMM(Automated Market Maker)を組み合わせたサービスです。後述しますがSingle Side AMM Exposureとして流動性の提供に片側の資産提供だけで対応できるようです。このプロジェクトはベータ版であり使用にはリスクがありますので自己責任で利用しましょう。UIはこちらですがまだ完成していない?ですかね。StableCreditとその攻撃手法の内容を追ってみました。多少間違ったことを書いている可能性があるのでご了承ください。間違いについては指摘頂くか読み替えてください。
- StableCreditとは
- Attack Vector 1
- Attack Vector 2
StableCreditとは
StableCreditはyearn.financeのサービスの1つで昨年より開発されていた新たなDeFiプロトコルです。プロトコルへの資産供与を担保として StableCredit(yCredit)を発行するMakerのような機能、StableCreditを使用したレンディングサービスの機能、さらにyswap.exchangeの提供するような片側の資産デポジットだけで機能するAMM(Automated Market Maker)といった多機能な複合DEXサービスです。
- USDCなどの資産をスマートコントラクトへ提供する
- Chainlinkオラクルのフィードから現在の資産価格を取得
- 提供された USD 価格の StableCredit(yCredit)が生成される
- USDCとyCreditは 50:50 の比率で流動性プールへ提供される
- 流動性プールのシステムの利用率が最大75%までで計算される
- 最大75%までの使用率で決定された yCredit がクレジットとして提供される
ユーザへ発行された yCredit は貸付クレジットとなります。このクレジットを利用してAMMで他の資産を借りることができます。例えば別のあるユーザーがLINKを担保として提供している場合、クレジットを使用してLINKを借りることができます。債務を返済したい場合は借りているLINKをyCreditに戻して債務を返済し元の提供資産を受け取ることができます。AMMは他プロトコルと同様に価格決定に関与し、システム使用率はユーザがシステムから借り入れる際のクレジット量を定義しています。仕組みの把握についてはyearn.financeのブログと公式のサイトを参考にしました。[1] [2]
複数のコンセプトを統合していていかにもDeFiらしいプロトコルだなという印象ですが、複雑であるが故にコードのバグを突いた攻撃を狙うハッカーがでてきそうです。1/2に攻撃されたとされている実際のトランザクションが既に存在します。2020年後半はDeFi系のプロトコルを中心として多くの攻撃がありました。Harvest Finance、Value DeFiではCurveの価格操作、Cheese BankのケースではUniswapの価格操作によって不適切なプライスフィードを悪用した攻撃がありました。今回の攻撃についてもコントラクトやSushiswapのAMMを悪用したものがありトレンドとしては同じです。
この攻撃はSushiswapの流動性プールの参照に伴い多量のyCreditトークンが発行できたことが原因です。流動性プールを利用したという点ではCurveやUniswapの価格参照を悪用された誤ったオラクル使用の例と似ているかもしれません。実際のトランザクションはこちらです。この攻撃によって攻撃者は44e-8 WBTCの消費だけで14594.52080025 yCreditを入手できたようです。yCreditトークンは1 USDと等しい価値になるようにデザインされています。得られたyCreditトークンをスワップすることで攻撃者はプロフィットを得ることができたとのことです。脆弱性のあった StableYieldCredit スマートコントラクトは新しいバージョンが既にデプロイされています。[4]
- 攻撃者は0.5 WBTCを StableYieldCredit スマートコントラクトへデポジットの指示
- オラクルプライスフィードで計算された0.5 WBTC相当のyCreditトークン(14594.52080025 USD)が攻撃者へ
- WBTC-yCreditプールのリザーブ状況(1e-8 WBTC および 331.335 yCredit)から44e-8のWBTCが実際に
safeTransferFrom
で処理 - 44e-8 WBTC および 14,999.19510075 yCreditがプールへ残置状態
- (Flashloanで各種トークンをBorrowする)
- yCreditへフラッシュローンで借りた各トークンをデポジットする
- Sushiswapでその各トークンを大量にyCreditへスワップする
- yCreditから各トークンのyCreditトークンを引き出す
- 引き出したyCreditトークンを各トークンへSushiswapでスワップする
- 多く交換のできたトークンをプロフィットとして出金する
- (Flashloanへ借りた各種トークンをReimburseする)
Aave V1だともっと単純なコントラクトになると思います。
現在は既に新しい StableYieldCredit のスマートコントラクトがデプロイされています。[6]