← 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).
2. 종합 대시보드
2-1. Transaction Info
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
| # | Event | From | To | Amount | Deviation |
| 1 | Swap (×3) | Uniswap V2 Pairs | Attacker |
269,300 WETH |
— |
| 2 | LogWithdraw (dYdX) | dYdX SoloMargin | Attacker |
76,436 WETH + 2,900,029 DAI |
— |
| 3 | Mint | Attacker | Uniswap WETH/DAI |
4,519 WETH + 2,900,029 DAI → 94,349 LP |
— |
| 4 | CollateralProvided | Attacker | Warp Finance |
94,349 UNI-V2 LP |
— |
| 5 | Swap (Price Dump) ⚠ | Attacker | Uniswap WETH/DAI |
341,217 WETH → 47,622,330 DAI |
$139.57/ETH
−78.1% from $636
|
| 6 | NewBorrow ⚠ | Warp USDC Vault | Attacker |
3,917,983 USDC |
— |
| 7 | NewBorrow ⚠ | Warp DAI Vault | Attacker |
3,862,646 DAI |
— |
| 8 | Swap (Reverse) | Attacker | Uniswap WETH/DAI |
48,584,947 DAI → 342,252 WETH |
$141.96/ETH
−77.7% from $636
|
| 9 | LogDeposit (dYdX) | Attacker | dYdX SoloMargin |
76,436 WETH + 2,900,029 DAI |
— |
| 10 | Swap (Exit) | Attacker | SushiSwap |
3,917,983 USDC → 5,757 WETH |
$680.44/ETH
+6.9% from $636
|
| 11 | Swap (×3) | Attacker | Uniswap V2 Pairs |
270,110 WETH (fee: 810 WETH) |
— |
| 12 | Withdrawal (Profit) ✓ | Attacker | — |
1,462 WETH ≈ $930,466 |
— |
2-6. 유사 공격 비교
| Date | Protocol | Attack Vector | Loss | Oracle |
| 2020-10-26 | Harvest Finance | AMM 가격 조작 (USDC/USDT) | $33.8M | Curve spot price |
| 2020-11-06 | Cheese Bank | LP 토큰 오라클 조작 | $3.3M | Uniswap spot reserves |
| 2020-11-14 | Value DeFi | 플래시론 오라클 조작 | $6M | Curve spot price |
| 2020-12-17 | ★ Warp Finance | LP 토큰 리저브 조작 (TVL 인플레이션) | $7.78M | TWAP 가격 + 스팟 리저브 |
| 2021-02-13 | Alpha 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. 공격 당시 토큰 가격
UNI-V2 LP (WETH/DAI)
$61.62
정상 시장가
UNI-V2 LP (조작 후)
~$147.88
TVL 기반 ×2.4 인플레이션
💡 가격 조작 핵심: 개별 토큰 가격(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를 플래시론으로 차입.
4. ETH Balance Waterfall
Flash loan 유입
Exploit 유입 (차입/환불/스왑)
유출 (스왑/전송/상환)
Net profit