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?" 메시지를 트랜잭션에 서명.
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% 인플레이션.