← Dashboard
Ethereum Mainnet Chain ID: 1
PMA Case #—

Value DeFi MultiStables Vault Exploit

Curve 3Pool 유동성 조작을 통한 Vault 지분 가치 인플레이션 공격 — 순손실 약 $6M
Oracle Manipulation Flash Loan ×2 Single Tx AMM Price Feed

1. 프로토콜 의존성 구조도

Single atomic transaction — Block #11,256,673 Attacker 0xa773...9a2F Aave V1 Flash Loan Uniswap V2 WETH/DAI Flash Swap Uniswap V2 WETH/USDT Pair Value DeFi MultiStables Vault Curve 3Pool DAI / USDC / USDT SushiSwap DAI/WETH Pair Curve Gauge 3CRV Staking ⚠ AMM Oracle 3CRV Staking 1 80K ETH 2 116M DAI 3 76.6K ETH→31M USDT 4 25M DAI 5 122M DAI+USDT ⚠ 6 33M 3CRV ⚠ 7 Repay + Profit Flash Loan Manipulation Vault Deposit/Withdraw DEX Swap Repay / Reverse

2. 종합 대시보드

2-1. Transaction Info

Block 11,256,673
Date / Time (UTC) 2020-11-14 15:36:30
Attack Type Flash Loan + AMM Oracle Manipulation
Attacker Profit +5,410,161 DAI (~$5.4M)
Vault Total Loss −7,410,161 DAI (~$7.4M)
Returned to Protocol 2,000,000 DAI (~$2M)
Net User Loss ~$6M (사용자 초기 예치금의 ~71.76% 손실)

2-2. Attack Execution Flow

Step 1 — 자금 조달
이중 Flash Loan 차입
Aave V1에서 80,000 ETH를 Flash Loan으로 차입하고, 동시에 Uniswap V2 WETH/DAI 페어에서 116,000,000 DAI를 Flash Swap으로 차입. 총 $154M 이상의 자본을 무담보로 확보.
80,000 ETH + 116,000,000 DAI
Step 2 — 스테이블코인 확보
ETH → USDT 스왑 (Uniswap V2)
Uniswap V2 WETH/USDT 페어에서 76,629 ETH를 31,000,000 USDT로 교환. Curve 3Pool 조작을 위한 USDT 탄약 확보. 나머지 3,371 ETH는 보유.
76,629 ETH → 31,000,000 USDT
Step 3 — Vault 진입
Value DeFi MultiStables Vault 예치
25,000,000 DAI를 Value DeFi MultiStables Vault에 예치. 정상적인 Share Price(≈1.0)로 24,923,202 mvUSD(Vault Share) 수령. Vault는 DAI를 Curve 3Pool에 유동성으로 공급하고 3CRV를 Gauge에 스테이킹.
25,000,000 DAI → 24,923,202 mvUSD
Step 4 — ⚠ 가격 조작
Curve 3Pool USDC 고갈 공격
91,000,000 DAI → 90,285,002 USDC 스왑과 31,000,000 USDT → 17,331,353 USDC 스왑을 연속 실행. 3Pool에서 USDC를 거의 전량 고갈시킴. Value DeFi의 convert_rate_xxx_to_3crv() 함수가 USDC 부족 상태의 Curve 풀을 기반으로 3CRV 가치를 ~3배로 과대평가하게 됨.
122,000,000 (DAI+USDT) → 107,616,355 USDC (풀 고갈)
Step 5 — ⚠ 인플레이션 인출
Vault 지분 인플레이션 인출
조작된 가격 피드로 인해 Share Price가 정상 1.0에서 1.32로 인플레이션. 24,923,202 mvUSD를 소각하여 33,089,069 3CRV를 수령. 정상 가치(~25M)보다 8.1M 3CRV를 초과 인출.
24,923,202 mvUSD → 33,089,069 3CRV (32% 인플레이션)
Step 6 — 조작 복원
Curve 3Pool 역스왑 + 유동성 제거
USDC를 USDT, DAI로 역스왑하여 3Pool 균형 복원. 이후 33,089,069 3CRV를 Curve에서 33,115,427 DAI로 단일 자산 인출.
33,089,069 3CRV → 33,115,427 DAI
Step 7 — Flash Loan 상환
차입금 전액 상환
USDT→ETH 역스왑(76,094 ETH), DAI→ETH SushiSwap 스왑(606 ETH)으로 ETH 복원. Uniswap Flash Swap 상환(116,349,160 DAI, 수수료 349,160 DAI 포함), Aave Flash Loan 상환(80,072 ETH, 수수료 72 ETH 포함).
80,072 ETH + 116,349,160 DAI 상환 완료
Step 8 — 이익 실현
순이익 확보 + 일부 반환
공격자는 Value DeFi Deployer에게 2,000,000 DAI를 반환한 뒤, 5,410,161 DAI를 Attacker EOA로 인출. 이후 "do you really know flashloan?" 메시지를 트랜잭션에 서명.
+5,410,161 DAI (~$5.4M) NET PROFIT

2-3. Involved Entities & PnL

Attacker (EOA) ATTACKER
+5,410,161 DAI
Attacker Contract ATTACKER CA
공격 로직 실행 컨트랙트
Value DeFi MultiStables Vault VICTIM
−~$6M (예치자 손실)
Aave V1 FLASH LOAN
80,000 ETH flash loan (수수료 72 ETH)
Uniswap V2 (WETH/DAI) FLASH SWAP
116M DAI flash swap (수수료 ~349K DAI)
Curve 3Pool INTERMEDIARY
가격 조작 대상 풀, oracle 소스

2-4. Oracle Manipulation Detail

정상 Vault Share Price
Share Price~1.0
Vault Total 3CRV~11M
3Pool USDC Reserve정상 수준
⚠ 조작 후 Share Price
Share Price~1.32 (+32%)
Vault 계산 3CRV~14.5M (가상)
3Pool USDC Reserve거의 0
조작 비용
DAI→USDC 슬리피지~715K DAI
USDT→USDC 슬리피지~13.7M 명목
순 조작 비용~$133K
초과 인출량
정상 인출~24.9M 3CRV
실제 인출33.1M 3CRV
초과분~8.1M 3CRV

2-5. Key Events

#EventFromToAmountDeviation
1Flash Loan (Flashloan borrow)Aave V1Attacker CA80,000 ETH
2Swap (Flashloan borrow)Uniswap WETH/DAIAttacker CA116,000,000 DAI
3Swap (Uniswap V2)Attacker CAWETH/USDT Pair76,629 ETH → 31,000,000 USDT $404.5/ETH
−14.8% from $475
4Deposit + MintAttacker CAValue DeFi Vault25,000,000 DAI → 24,923,202 mvUSD
5TokenExchange ⚠Attacker CACurve 3Pool91,000,000 DAI → 90,285,002 USDC $0.992/DAI
−0.8% from $1.00
6TokenExchange ⚠Attacker CACurve 3Pool31,000,000 USDT → 17,331,353 USDC $0.559/USDT
−44.1% from $1.00
7Withdraw (인플레이션) ⚠Value DeFi VaultAttacker CA24,923,202 mvUSD → 33,089,069 3CRV ×1.32
Share price +32%
8TokenExchange (역스왑)Attacker CACurve 3Pool17,331,353 USDC → 30,940,127 USDT $1.785/USDC
+78.5% from $1.00
9TokenExchange (역스왑)Attacker CACurve 3Pool90,285,002 USDC → 90,927,026 DAI $1.007/USDC
+0.7% from $1.00
10RemoveLiquidityOneCurve 3PoolAttacker CA33,089,069 3CRV → 33,115,427 DAI
11Swap (Uniswap V2)Attacker CAWETH/USDT Pair30,940,127 USDT → 76,094 ETH $406.6/ETH
−14.4% from $475
12Swap (Flashloan repayment)Attacker CAUniswap WETH/DAI116,349,160 DAI
13Swap (SushiSwap)Attacker CADAI/WETH Pair283,131 DAI → 606 ETH $466.4/ETH
−1.8% from $475
14FlashLoan (Flashloan repayment)Attacker CAAave V180,072 ETH (원금+수수료)
15ReturnAttacker CAValue DeFi Deployer2,000,000 DAI
16ProfitAttacker CAAttacker EOA5,410,161 DAI ~$5.4M

2-6. 유사 공격 비교표

사고날짜피해액공격 벡터Oracle 소스Flash Loan
Harvest Finance2020-10-26$34MCurve Y Pool 가격 조작Curve Y PoolUniswap ($50M)
★ Value DeFi2020-11-14$7.4MCurve 3Pool USDC 고갈Curve 3PoolAave + Uniswap ($154M)
Cheese Bank2020-11-06$3.3MUniswap LP 가격 조작Uniswap V2dYdX (21K ETH)
Akropolis2020-11-12$2MFlash Loan + ReentrancyCurve Y PooldYdX
Origin Protocol2020-11-17$7MRebase + Flash LoanChainlink (우회)dYdX

2-7. Root Causes & Lessons

취약점 / 근본 원인

convert_rate_xxx_to_3crv() 함수가 Curve 3Pool 스팟 가격을 실시간 오라클로 사용 — 동일 트랜잭션 내 조작에 취약
Vault v2 코드가 감사 미완료 상태에서 메인넷 배포. 기존 v1 감사에서 다루지 않은 새로운 로직 포함
동일 블록 내 예치-인출 방지 로직(anti flash loan) 미작동 — flashloanPrevention 코드가 예상대로 동작하지 않음
스마트 컨트랙트 입구에서 EOA/CA 구분 검증 누락. Bank 컨트랙트가 컨트랙트 호출을 차단하지 못함

교훈 / 방어 방안

AMM 스팟 가격이 아닌 Chainlink 등 외부 오라클을 가격 피드로 사용하거나, TWAP 기반 가격 평균 적용
Vault의 share price 계산에 다중 오라클 교차 검증 도입. 단일 소스 의존 제거
동일 블록/트랜잭션 내 예치-인출을 time-lock 또는 commit-reveal 메커니즘으로 원천 차단
신규 코드 배포 전 반드시 공식 감사 완료. 미감사 코드의 메인넷 배포는 사용자 자산을 직접적 위험에 노출

2-8. 공격 당시 토큰 가격

ETH (WETH)
~$475
공격 시점 시가
DAI
$1.00
스테이블코인
USDC
$1.00
스테이블코인
USDT
$1.00
스테이블코인
3CRV
~$1.001
Curve LP 토큰
Vault Share (조작 후)
×1.32
정상 대비 32% 인플레이션
💡 가격 조작 핵심: Curve 3Pool에서 DAI와 USDT를 대량 매도하여 USDC를 거의 전량 고갈시킴. Value DeFi의 convert_rate_xxx_to_3crv()가 빈 USDC 풀에 소량의 USDC를 추가하는 시뮬레이션을 수행 → 비정상적으로 높은 3CRV 환산값 반환 → Share Price 32% 인플레이션.

3. 인터랙티브 Fund Flow

Attacker CA Aave V1 Uniswap DAI Uniswap USDT Value DeFi Curve 3Pool SushiSwap Value Deployer Attacker EOA 80K ETH 116M DAI 76.6K ETH→31M USDT 25M DAI 122M DAI+USDT ⚠ 33M 3CRV ⚠ 역스왑 + 유동성 제거 80,072 ETH 상환 116.3M DAI 상환 2M DAI 반환 5.4M DAI 이익 ETH flow DAI/Stable flow Manipulation Repay / Reverse
DAI Balance
0
ETH Balance
0
Stables (USDC+USDT)
0
Status

4. DAI Balance Waterfall

Flash Loan/Swap 유입 Exploit 유입 (역스왑/인출) 유출 (스왑/예치/상환) Net Profit