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

Warp Finance

Uniswap V2 LP 토큰 가격 오라클 조작을 통한 $7.78M 스테이블코인 과대 차입 공격
LP Token Oracle Manipulation Flash Loan ×4 Single Tx AMM Reserve Manipulation

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

All
Step 1: Flash Borrow
Step 2: Mint LP
Step 3: Collateral
Step 4: Price Dump
Step 5: Borrow
Step 6: Reverse Swap
Step 7: USDC Exit
Step 8: Repay All
공격자는 Uniswap V2 3개 풀과 dYdX에서 총 ~345,736 WETH + ~2.9M DAI를 플래시론으로 차입 → LP 토큰을 발행하여 Warp Finance에 담보로 예치 → 대규모 스왑으로 LP 가격을 ×2.4 인플레이션 → 과대 차입($7.78M) → 역스왑 후 플래시론 상환. 순이익 ~1,462 WETH ($930K).
Single atomic transaction — Block #11,473,330 Attacker Contract 0xdF8B…ACb Uniswap V2 Flash Swap ×3 dYdX SoloMargin Flash Loan Uniswap V2 WETH/DAI Pool Warp Finance LP Vault + SC Vaults SushiSwap 269,300 WETH 76,436 WETH + 2.9M DAI 1 4,519 WETH + 2.9M DAI 94,349 LP ↩ 2 94,349 LP 3 341,217 WETH → 47.6M DAI ⚠ 4 $7.78M (DAI + USDC) 5 48.5M DAI → ← 342,252 WETH 6 3.9M USDC 5,757 WETH ↩ 7 270,110 WETH 76,436 WETH + 2.9M DAI 8

2. 종합 대시보드

2-1. Transaction Info

Block 11,473,330
Date / Time (UTC) 2020-12-17 22:24:41
Attack Type LP Token Price Oracle Manipulation
Attacker Profit ~1,462 WETH (~$930,466)
Victim Loss ~$7,780,630 (DAI + USDC)
Recovered ~$5,850,000 (LP 담보 회수, 75%)

2-2. Attack Execution Flow

Step 1 — Flash Borrow
4개 소스에서 대규모 플래시론 차입
Uniswap V2 플래시 스왑 3건 (WBTC/WETH: 90,409 WETH, WETH/USDC: 82,798 WETH, WETH/USDT: 96,092 WETH) + dYdX SoloMargin (76,436 WETH + 2,900,029 DAI).
총 345,736 WETH + 2,900,029 DAI 확보
Step 2 — Mint LP Token
Uniswap V2 WETH/DAI 풀에 유동성 공급
4,519 WETH + 2,900,029 DAI를 예치하여 94,349 UNI-V2 LP 토큰을 발행. 나중에 담보로 사용하기 위한 준비 단계.
94,349.34 UNI-V2 LP 수령
Step 3 — Deposit Collateral
Warp Finance에 LP 토큰 담보 예치
CollateralProvided 함수로 94,349 LP 토큰을 WarpVaultLP에 담보로 예치. 정상 가격 기준 약 $5.81M 가치.
94,349.34 LP → Warp Finance Vault
Step 4 — Price Manipulation ⚠
대규모 WETH 덤프로 LP 토큰 가격 인플레이션
341,217 WETH를 Uniswap V2 WETH/DAI 풀에 스왑. 풀의 WETH 리저브가 94,928 → 436,145로 급증하면서 TVL 계산식(r0×p0 + r1×p1)에 의해 LP 토큰 단가가 ×2.4 인플레이션.
LP 가치: $5.81M → ~$13.95M (×2.4)
Step 5 — Over-Borrow ⚠
인플레이션된 담보 가치로 과대 차입
Warp Finance의 borrowSC 함수 호출. 인플레이션된 LP 가격으로 getBorrowLimit이 과대 산정되어, 정상 한도를 크게 초과하는 스테이블코인 차입 실행.
3,917,983 USDC + 3,862,646 DAI ≈ $7.78M
Step 6 — Reverse Swap
DAI → WETH 역스왑으로 가격 복원
48,584,947 DAI를 다시 WETH로 스왑하여 342,252 WETH 회수. 풀 비율이 정상화되지만 LP 담보는 이미 Warp에 락되어 있음.
48,584,947 DAI → 342,252 WETH
Step 7 — Repay Flash Loans
dYdX + Uniswap V2 플래시론 전량 상환
dYdX에 76,436 WETH + 2,900,029 DAI 반환. Uniswap V2 3개 풀에 각각 ~0.3% 수수료 포함하여 총 270,110 WETH 반환.
수수료 합계: ~810 WETH ($515K)
Step 8 — USDC Exit
SushiSwap에서 USDC → WETH 변환
차입한 3,917,983 USDC를 SushiSwap USDC/WETH 풀에서 스왑하여 5,757 WETH로 변환.
3,917,983 USDC → 5,757 WETH
Step 9 — Profit Realized ✓
1,462 WETH 순이익 인출
모든 플래시론 상환 후 잔여 WETH를 ETH로 언래핑. LP 담보는 Warp Finance에 언더워터 포지션으로 잔류.
순이익: 1,462 WETH ≈ $930,466

2-3. Involved Entities & PnL

ATTACKER (EOA)
Attacker EOA
+1,462 WETH (+$930K)
ATTACKER (CA)
Attack Contract
공격 로직 실행 컨트랙트
VICTIM
Warp Finance
−$7.78M (75% 회수)
FLASH LOAN
dYdX SoloMargin
76,436 WETH + 2.9M DAI 대출
INTERMEDIARY
Uniswap V2 (WETH/DAI)
LP 발행 + 가격 조작 풀
INTERMEDIARY
SushiSwap (USDC/WETH)
USDC→WETH 출구 스왑

2-4. Oracle Manipulation Detail

정상 LP 가치 (Before)
Pool TVL~$121.3M
Reserves (DAI)60,911,018
Reserves (WETH)94,928
담보 평가액~$5.81M
⚠ 조작 LP 가치 (After)
Pool TVL~$290.7M
Reserves (DAI)13,288,687
Reserves (WETH)436,145
담보 평가액~$13.95M (×2.4)
가격 조작 메커니즘
스왑량341,217 WETH
WETH 리저브 변화94,928 → 436,145
TVL 인플레이션+139.7%
차입 초과 분석
정상 담보 가치$5.81M
실제 차입액$7.78M
초과 차입+$1.97M

2-5. Key Events

#EventFromToAmountDeviation
1Swap (×3)Uniswap V2 PairsAttacker 269,300 WETH
2LogWithdraw (dYdX)dYdX SoloMarginAttacker 76,436 WETH + 2,900,029 DAI
3MintAttackerUniswap WETH/DAI 4,519 WETH + 2,900,029 DAI → 94,349 LP
4CollateralProvidedAttackerWarp Finance 94,349 UNI-V2 LP
5Swap (Price Dump) ⚠AttackerUniswap WETH/DAI 341,217 WETH → 47,622,330 DAI $139.57/ETH
−78.1% from $636
6NewBorrow ⚠Warp USDC VaultAttacker 3,917,983 USDC
7NewBorrow ⚠Warp DAI VaultAttacker 3,862,646 DAI
8Swap (Reverse)AttackerUniswap WETH/DAI 48,584,947 DAI → 342,252 WETH $141.96/ETH
−77.7% from $636
9LogDeposit (dYdX)AttackerdYdX SoloMargin 76,436 WETH + 2,900,029 DAI
10Swap (Exit)AttackerSushiSwap 3,917,983 USDC → 5,757 WETH $680.44/ETH
+6.9% from $636
11 Swap (×3)AttackerUniswap V2 Pairs 270,110 WETH (fee: 810 WETH)
12Withdrawal (Profit) ✓Attacker 1,462 WETH ≈ $930,466

2-6. 유사 공격 비교

DateProtocolAttack VectorLossOracle
2020-10-26Harvest FinanceAMM 가격 조작 (USDC/USDT)$33.8MCurve spot price
2020-11-06Cheese BankLP 토큰 오라클 조작$3.3MUniswap spot reserves
2020-11-14Value DeFi플래시론 오라클 조작$6MCurve spot price
2020-12-17★ Warp FinanceLP 토큰 리저브 조작 (TVL 인플레이션)$7.78MTWAP 가격 + 스팟 리저브
2021-02-13Alpha Homora플래시론 + LP 조작$37.5M복합 오라클

2-7. Root Causes & Lessons

취약점 (Root Causes)

LP 토큰 가격 산정 시 스팟 리저브(r0, r1)를 사용. TWAP 가격이 정확해도 리저브가 플래시론으로 조작 가능.
TVL = r0×p0 + r1×p1 공식에서 k=r0×r1 불변이지만, TVL은 리저브 비율에 따라 변동 가능한 구조적 결함.
담보 가치 평가와 차입 한도 산정이 동일 트랜잭션 내에서 이루어져 원자적 조작에 취약.
다수 풀에서 동시 플래시론 차입을 방지하는 메커니즘 부재. 공격자가 $200M+ 규모의 자금을 단일 트랜잭션에서 동원.

교훈 (Lessons Learned)

Alpha Finance의 "Fair Reserve" 방식 채택: LP 가격 = f(TWAP_p0, TWAP_p1, k)로 리저브 의존성 제거.
Chainlink 등 외부 오라클을 LP 토큰 가격 검증에 병용. 실제로 Warp Finance는 재런칭 시 Chainlink 통합.
담보 가치 평가 시 Time-Weighted Average Reserves(TWAR) 적용으로 플래시론 저항성 확보.
White hat 커뮤니티(samczsun, Banteg 등)의 신속한 대응으로 LP 담보 $5.85M 회수 성공 — 커뮤니티 보안 인프라의 중요성.

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

WETH
$636.44
공격 시점 시가
DAI
$1.00
스테이블코인 (정상)
USDC
$1.00
스테이블코인 (정상)
UNI-V2 LP (WETH/DAI)
$61.62
정상 시장가
UNI-V2 LP (조작 후)
~$147.88
TVL 기반 ×2.4 인플레이션
WBTC
$21,317
공격 시점 시가
💡 가격 조작 핵심: 개별 토큰 가격(TWAP)은 정상이었으나, LP 토큰 가격 산정 시 스팟 리저브를 사용하여 TVL이 인플레이션됨. 공격자가 341K WETH를 풀에 덤프하면 WETH 리저브가 4.6배 증가 → TVL = r_WETH × p_WETH 항이 급증 → LP 단가 ×2.4 인플레이션.

3. 인터랙티브 Fund Flow

Step 1: Flash Borrow
Step 2: Mint LP
Step 3: Collateral
Step 4: Dump
Step 5: Borrow
Step 6: Reverse
Step 7: Repay dYdX
Step 8: USDC→WETH
Step 9: Repay Uni
Step 10: Profit
Uniswap V2 3개 풀(WBTC/WETH, WETH/USDC, WETH/USDT)에서 269,300 WETH를 플래시 스왑으로 차입하고, dYdX SoloMargin에서 76,436 WETH + 2,900,029 DAI를 플래시론으로 차입.
Attacker Contract 0xdF8B…ACb Uniswap V2 Flash ×3 dYdX SoloMargin Uniswap V2 WETH/DAI Warp Finance LP + SC Vaults SushiSwap 269,300 WETH 76,436 WETH +2.9M DAI 4,519 WETH + 2.9M DAI 94,349 LP 94,349 LP 341,217 WETH → ← 47.6M DAI 3.9M USDC +3.8M DAI 48.5M DAI → ← 342,252 WETH 76,436 WETH + 2.9M DAI 3.9M USDC 5,757 WETH 270,110 WETH ✓ 1,462 WETH ETH flow Token flow Repay / Return
ETH Balance
345,736
DAI Balance
2,900,029
USDC Balance
0
Status
자금 확보 완료

4. ETH Balance Waterfall

Flash loan 유입 Exploit 유입 (차입/환불/스왑) 유출 (스왑/전송/상환) Net profit