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

Cheese Bank

Uniswap V2 LP 토큰 담보가치 오라클 조작으로 Cheese Bank에서 ~$3.3M (USDC/USDT/DAI) 탈취
Oracle Manipulation Flash Loan Single Tx LP Collateral Inflation

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

Single atomic transaction — Block #11205648 Attacker 0x9e02...93c3 dYdX Flash Loan Uniswap V2 CHEESE/ETH Cheese Oracle LP Price = WETH×2 Cheese Bank Lending (Compound Fork) Uniswap V2 USDC/ETH Loot Address 21,000 ETH 1 50 ETH → CHEESE 2 LP → Collateral 3 20,000 ETH PUMP ⚠ 4 ⚠ 94× inflated 5 $3.3M USDC/USDT/DAI 6 21,000 ETH ↩ 7

2. 종합 대시보드

2-1. Transaction Info

Block 11,205,648
Date / Time (UTC) 2020-11-06 19:22:21
Attack Type Flash Loan + LP Oracle Manipulation
Attacker Profit ~$3,335,933
Victim Loss ~$3,393,835 (Cheese Bank)

2-2. Attack Execution Flow

Step 1 — Flash Loan
dYdX에서 21,000 ETH 플래시론 차입
수수료 없는 dYdX SoloMargin 플래시론으로 공격 자금 확보
+21,000 ETH ($9,582,720)
Step 2 — CHEESE 매수 + 유동성 공급
50 ETH→107,232 CHEESE 스왑 후 LP 풀에 유동성 추가
Uniswap V2에서 50 ETH로 CHEESE 매수. 107,232 CHEESE + 78.878 ETH를 풀에 추가하여 2,833 UNI-V2 LP 토큰 수령
-128.878 ETH (50 swap + 78.878 LP)
Step 3 — LP 토큰 담보 등록
Cheese Finance에 LP 토큰 예치 (Mint sUNI_V2)
2,833 UNI-V2 LP 토큰을 Cheese Finance에 Mint하여 141,661 sUNI_V2-CHEESE-ETH cToken 수령. 이후 차입의 담보로 사용
2,833 LP → 141,661 sUNI_V2
Step 4 — 가격 펌프 ⚠
20,000 ETH → 288,822 CHEESE 대량 스왑으로 가격 조작
풀의 WETH 잔고를 ~215 ETH → ~20,215 ETH로 급등시켜 LP 토큰 평가액을 ~94배 부풀림. CheesePriceOracle가 WETH×2 공식으로 LP 가격을 산출하므로 담보 가치 폭등
-20,000 ETH (가격 조작 비용)
Step 5 — 대량 차입
부풀려진 담보로 Cheese Bank 자금 전액 차입
LP 토큰의 과대평가된 담보 가치를 이용해 Cheese Bank 보유 스테이블코인 전량 borrow(). 차입 전 balanceOf()로 정확한 잔액 확인 후 전액 인출
+2,068,252 USDC / +1,237,995 USDT / +87,586 DAI
Step 6 — CHEESE 덤프 + ETH 회수
288,822 CHEESE → 19,998 ETH 역스왑으로 펌프 자금 회수
가격 조작에 사용한 CHEESE를 다시 ETH로 교환. 유니스왑 수수료로 인해 소량 손실 (약 1.28 ETH)
+19,998.72 ETH
Step 7 — USDC→ETH 보충
58,812 USDC → 132 ETH 스왑 (플래시론 상환 충당)
LP 생성과 스왑 수수료로 소비된 ETH를 보전하기 위해 차입한 USDC 일부를 ETH로 환전
-58,812 USDC / +132.16 ETH
Step 8 — 상환 & 수익 실현
21,000 ETH 플래시론 상환 후 순이익 확보
탈취 자금을 수집 주소(0x02b7)로 이체 후 dYdX 플래시론 상환. 최종 수익: 2,009,440 USDC + 1,237,995 USDT + 87,586 DAI + 2 ETH
NET PROFIT ≈ $3,335,933

2-3. Involved Entities & PnL

ATTACKER (EOA)
공격자 지갑
+$3,335,933
ATTACKER (CONTRACT)
공격 컨트랙트
실행 컨트랙트 (자금 경유)
VICTIM
Cheese Bank (Lending)
−$3,393,835
FLASH LOAN
dYdX SoloMargin
21,000 ETH 제공 (수수료 0)
STOLEN ASSETS
수집 주소
탈취 자산 집결

2-4. Oracle Manipulation Detail

정상 LP 가격
WETH in pool~215 ETH
LP Total Supply~5,960 LP
LP Unit Price~$32.90
⚠ 조작 후 LP 가격
WETH in pool~20,215 ETH
LP Total Supply~5,960 LP
LP Unit Price~$3,093
Pump 비용
ETH 투입20,000 ETH
ETH 회수19,998.72 ETH
순 비용~1.28 ETH ($584)
담보 가치 부풀림
부풀림 배수~94×
정상 담보가치~$93,210
조작 담보가치~$8,761,730

2-5. Key Events

#EventFromToAmountDeviation
1LogWithdraw (Flashloan borrow)dYdX SoloMarginAttacker CA 21,000 WETH
2SwapAttacker CAUniswap V2 CHEESE 50 ETH → 107,232 CHEESE $0.213/CHEESE
Pre-pump baseline
3addLiquidityETHAttacker CAUniswap V2 CHEESE 107,232 CHEESE + 78.878 ETH
→ 2,833 UNI-V2 LP
4Mint (cToken)Attacker CACheese Finance 2,833 LP → 141,661 sUNI_V2-CHEESE-ETH
5Swap ⚠ PUMPAttacker CAUniswap V2 CHEESE 20,000 ETH → 288,822 CHEESE $31.59/CHEESE
14,726% from $0.213
6BorrowCheese FinanceAttacker CA 2,068,252 USDC
7BorrowCheese FinanceAttacker CA 1,237,995 USDT
8BorrowCheese FinanceAttacker CA 87,586 DAI
9Swap (Dump)Attacker CAUniswap V2 CHEESE 288,822 CHEESE → 19,998.72 ETH $31.59/CHEESE
Round-trip symmetric
10Swap (USDC→ETH)Attacker CAUniswap V2 USDC 58,812 USDC → 132.16 ETH $445/ETH
−2.5% from $456
11LogDeposit (Flashloan repayment)Attacker CAdYdX SoloMargin 21,000 WETH
12Transfer (Profit)Attacker CALoot (0x02b7) 2,009,440 USDC + 1,237,995 USDT + 87,586 DAI + 2 ETH ≈ $3.34M

2-6. 유사 공격 비교

공격명날짜취약점손실Flash Loan
bZx Hack I2020-02-15Oracle Manipulation (Multi-DEX)~$350KdYdX
bZx Hack II2020-02-18Oracle Manipulation (Kyber/Synthetix)~$600KbZx iETH
Harvest Finance2020-10-26AMM Oracle Manipulation~$34MAave V2
Akropolis2020-11-12Reentrancy + Flash Loan~$2MdYdX
★ Cheese Bank2020-11-06LP Collateral Oracle Manipulation~$3.3MdYdX
Value DeFi2020-11-14Oracle Manipulation (Curve)~$6MAave
Origin Protocol2020-11-17Reentrancy + Rebasing~$7MdYdX

2-7. Root Causes & Lessons

🔴 근본 원인

AMM 스팟 가격 기반 단일 오라클: Cheese Bank가 Uniswap V2 풀의 WETH 잔고만으로 LP 토큰 가격을 산출하여, 대량 스왑 하나로 담보 가치를 수십 배 조작 가능
LP 가격 공식의 구조적 결함: totalValue = wETHBalance × 2 × ethPrice. WETH 잔고에 선형 비례하므로 자금 주입만으로 가격 왜곡이 직접 전달됨
Flash Loan 방어 부재: 같은 블록 내 담보 예치→가격 조작→차입이 가능. 시간 지연(Time-lock)이나 블록 간 검증 없음
차입 한도 미검증: balanceOf()로 잔액 조회 후 전액 차입 허용. 전체 TVL 대비 단일 차입 제한 없음

🟢 교훈 & 방어책

Chainlink 등 탈중앙 오라클 도입: 외부 가격 피드를 기본으로 사용하고, 온체인 AMM 가격은 보조 참조만
TWAP (Time-Weighted Average Price) 적용: Uniswap V2/V3 TWAP 오라클로 단일 블록 내 가격 조작을 무력화
LP 토큰 가격 산정: Alpha Homora식 공정 LP 가격 = 2 × √(r₀·r₁) / totalSupply — 단순 WETH 잔고 참조 대신 기하 평균 사용
단일 블록 차입 제한: 담보 예치와 차입 사이 최소 1블록 대기, 또는 Flash Loan 감지 시 차입 거부

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

ETH (WETH)
~$456
공격 시점 시가
USDC
$1.00
Stablecoin
USDT
$1.00
Stablecoin
DAI
$1.00
Stablecoin
CHEESE (조작 전)
~$0.000213
미소 시총 토큰
CHEESE (조작 후) ⚠
~$31.59
14,726% 펌프
💡 가격 조작 핵심: CHEESE 토큰의 시장 가격이 아닌, Uniswap V2 풀의 WETH 잔고가 Cheese Bank 오라클에 직접 투영됨. 20,000 ETH를 풀에 투입해 WETH 잔고를 ~94배 늘리면, LP 가격 공식(WETH×2×ethPrice÷totalSupply)에 따라 담보 가치도 ~94배 부풀려짐.

3. Fund Flow

Attacker (0x9e02) dYdX Uniswap CHEESE Cheese Finance Uniswap USDC Loot (0x02b7) 21,000 ETH 128.9 ETH → CHEESE+LP LP → cToken 20,000 ETH ⚠ $3.39M stables 19,998.72 ETH ↩ 58.8K USDC 132 ETH 21,000 ETH ↩ $3.33M + 2 ETH ETH flow Stablecoin flow Swap Repay
ETH Balance
0
Stablecoin Balance
$0
Status

4. ETH Balance Waterfall

Flash Loan 유입 유출 (스왑/LP/펌프) Exploit 유입 (덤프/환전) Net profit