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

Harvest Finance

Curve Y Pool 가격 조작을 통한 Vault 공유 가격(Share Price) 차익 추출 공격
Oracle Manipulation Flash Loan Multi-Tx (30 txns / 7min) Yield Aggregator

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

Single atomic transaction — Block #11,129,474 Attacker Contract 0xc602...e0af Uniswap V2 Flash Loan Source Curve Y Pool Oracle Target Harvest Vault Victim (USDC) ⚠ Price Oracle investedUnderlyingBalance 1 50M USDC 18.3M USDT 2 17.2M USDT→USDC 3 50M USDC Deposit 4 USDC→USDT 5 50.3M USDC Withdraw 6 Repay +Fee reads price manipulated

2. 종합 대시보드

2-1. 트랜잭션 정보 (참조 Tx)

Block 11,129,474
Date / Time (UTC) 2020-10-26 02:53:58
Attack Type Flash Loan + Oracle Manipulation
Total Stolen (All Txns) ~$33.8M
Directly Extracted ~$24M (13M USDC + 11M USDT)
Returned ~$2.5M
This Tx Profit ~$700K (691K USDC + 20 WETH)

2-2. 공격 실행 흐름

Step 1 — Flash Loan 차입
Uniswap V2에서 대규모 스테이블코인 차입
WETH/USDC 페어에서 50,000,000 USDC, WETH/USDT 페어에서 18,308,555 USDT를 플래시 스왑으로 차입. 단일 트랜잭션 내 상환 조건.
+50,000,000 USDC  |  +18,308,555 USDT
Step 2 — Curve Y Pool 가격 조작 (Pump)
USDT → USDC 대량 스왑으로 Y Pool 내 USDC 비율 교란
17,222,012 USDT를 Curve Y Pool에서 USDC로 교환. Pool 내 USDC 비율 감소 → investedUnderlyingBalance 하락 → Harvest Vault의 fUSDC 공유 가격(share price) 약 1.2% 하락.
−17,222,012 USDT → +17,216,703 USDC
Step 3 — Harvest Vault 예치 (저가 매입)
조작된 저가 Share Price에 USDC 예치
약 50M USDC를 Harvest USDC Vault에 예치. 공유 가격이 0.971로 하락한 상태이므로 정상가(0.983) 대비 더 많은 fUSDC 지분 확보. 3% 차익거래 감지 임계값 미달로 트랜잭션 통과.
−49,977,468 USDC → +51,456,280 fUSDC
Step 4 — Curve Y Pool 가격 복원 (Dump)
USDC → USDT 역스왑으로 Pool 비율 원복
17,239,234 USDC를 USDT로 역교환. Y Pool 내 USDC 비율 회복 → investedUnderlyingBalance 정상화 → fUSDC 공유 가격 0.983으로 복원.
−17,239,234 USDC → +17,230,747 USDT
Step 5 — Harvest Vault 인출 (고가 매도)
복원된 정상 Share Price에 fUSDC 인출
모든 fUSDC를 인출. 공유 가격이 0.983으로 복원되었으므로 예치 시(0.971)보다 높은 가격에 USDC 회수. 1회 순이익: +321,216 USDC.
+50,298,684 USDC (차익 +321,216 USDC)
Step 6 — 반복 실행 (×3 Cycles)
동일 사이클 3회 반복 → 누적 차익 확보
Step 2~5를 총 3회 반복. 각 사이클에서 약 320K USDC 순이익. 3회 누적 Vault 차익: 962,109 USDC. 공격자는 이 tx 외에도 동일 패턴을 16번 더 실행(총 17건 USDC Vault 공격).
Cycle 1: +321,216  |  Cycle 2: +320,707  |  Cycle 3: +320,186
Step 7 — Flash Loan 상환 + 이익 확정
플래시론 원금+수수료 상환 후 순이익 확정
USDC 플래시론 상환(50,165,496 USDC, 수수료 165,496 USDC). 잔여 USDC 일부를 WETH로 전환하여 USDT 플래시론 수수료 정산. 최종 20 WETH + 691,783 USDC 순수익 확보.
NET PROFIT: 691,783 USDC + 20 WETH (~$700K)

2-3. 관련 엔티티 및 PnL

ATTACKER
Harvest Finance Hacker
Contract: 0xc6028a9fa486f52efd2b95b949ac630d287ce0af
+$24M (전체) / +$700K (이 Tx)
VICTIM
Harvest Finance USDC Vault
USDC Vault share price −13.8%
−$33.8M (전체 프로토콜 손실)
FLASH LOAN
Uniswap V2
WETH/USDC + WETH/USDT Pairs
50M USDC + 18.3M USDT 공급
INTERMEDIARY
Curve Finance Y Pool
exchange_underlying()
가격 조작 매개체 (Oracle Target)

2-4. Oracle 조작 상세

정상 Share Price
fUSDC Share Price0.983 USDC
USDC/USDT Rate~1.0000
Y Pool 상태균형
⚠ 조작 후 Share Price
fUSDC Share Price0.971 USDC
가격 변동−1.22%
Y Pool 상태USDC 비율 교란
조작 비용 (Pump Cost)
Curve Swap (USDT→USDC)17.2M USDT
슬리피지 비용/라운드~$13,800
3% 임계값 우회1.22% < 3%
차익 수익 (Per Cycle)
Vault 예치금~50M USDC
1회 순이익~320K USDC
ROI (vs 조작비용)~23x

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

ETH (WETH)
~$410
공격 시점 시가
USDC
$1.00
스테이블코인 (정상)
USDT
$1.00
스테이블코인 (정상)
FARM (공격 후)
$100
$242 → $100 (−65%)
💡 가격 조작 핵심: Harvest Finance의 Vault는 Curve Y Pool의 investedUnderlyingBalance를 실시간 오라클로 사용하여 fToken 공유 가격을 산정. 공격자가 Y Pool 내 USDC 비율을 17.2M USDT 스왑으로 일시 교란하면 공유 가격이 ~1.2% 하락하고, 복원 후 인출 시 차익 발생. 3% 차익거래 감지 임계값을 밑도는 미세 조작을 반복하여 탐지를 우회함.

2-5. Key Events (참조 Tx 기준)

#EventFromToAmountDeviation
1Swap (Flashloan borrow)Uniswap V2Attacker 50,000,000 USDC
18,308,555 USDT
2TokenExchangeUnderlying
(Cycle 1 — Pump)
AttackerCurve Y Pool 17,222,012 USDT
→ 17,216,703 USDC
$0.9997/USDC
−0.03% from $1.00
3DepositAttackerHarvest USDC Vault 49,977,468 USDC
4TokenExchangeUnderlying
(Cycle 1 — Dump)
AttackerCurve Y Pool 17,239,234 USDC
→ 17,230,747 USDT
$0.9995/USDT
−0.05% from $1.00
5WithdrawHarvest USDC VaultAttacker 50,298,684 USDC
6Cycle 2 (×4 events)
동일 패턴
AttackerCurve / Harvest Deposit: 50,276,170
Withdraw: 50,596,877
$0.9997~0.9995
차익: +320,707 USDC
7Cycle 3 (×4 events)
동일 패턴
AttackerCurve / Harvest Deposit: 50,574,381
Withdraw: 50,894,567
$0.9997~0.9995
차익: +320,186 USDC
8Swap (Flashloan repayment)AttackerUniswap V2 50,165,496 USDC
수수료: 165,496 USDC
9Swap (USDC→WETH)AttackerUniswap V2 37,289 USDC
→ 90.97 WETH
$410/ETH
+0.0% from $410
10Swap (Flashloan repayment)AttackerUniswap V2 70.97 WETH + 18,334,705 USDT
수수료: WETH로 지불
Net ProfitAttacker 691,783 USDC + 20 WETH ≈ $700K

2-6. 유사 공격 비교

사고명날짜피해액기법Oracle
Harvest Finance2020-10$33.8MFlash Loan + Pool 조작Curve Y Pool
bZx Hack I2020-02~$1MFlash Loan + 마진 조작Kyber/Uniswap
bZx Hack II2020-02~$8MFlash Loan + sUSD 펌프Kyber/Synthetix
Eminence Finance2020-09$15MFlash Loan + 본딩커브Bonding Curve
Warp Finance2020-12$7.7MFlash Loan + LP 토큰LP Token Oracle
Cheese Bank2020-11$3.3MFlash Loan + AMM 조작Uniswap TWAP

2-7. 근본 원인 및 교훈

🔴 취약점 (Root Causes)
Harvest Vault이 Curve Y Pool의 스팟 가격을 실시간 오라클로 사용하여 공유 가격(Share Price)을 산정 — 단일 블록 내 조작에 취약
차익거래 감지 임계값이 3%로 설정되어 ~1.2% 수준의 미세 조작을 반복적으로 우회 가능
Deposit과 Withdraw가 동일 트랜잭션(Flash Loan) 내에서 실행 가능 — commit-reveal 미적용
Vault 잔고의 buffer 풀에서 직접 인출 가능하여 Curve Pool과의 2차 상호작용 없이 차익 실현
🟢 교훈 (Lessons)
DeFi 프로토콜은 단일 소스(AMM 스팟 가격)를 오라클로 사용하면 안 됨 — TWAP, Chainlink 등 다중 오라클 필수
Commit-and-reveal 메커니즘 도입으로 동일 트랜잭션 내 Deposit/Withdraw 차단
차익거래 감지 임계값을 동적으로 조정하고, 대규모 예치/인출 시 추가 슬리피지 보호 적용
Harvest Finance는 이후 인출 시 Curve 토큰을 별도 트랜잭션에서 스테이블코인으로 전환하는 방식으로 개선

3. 인터랙티브 Fund Flow

Uniswap V2 Flash Loan Attacker 0xc602...e0af Curve Y Pool USDT ↔ USDC Harvest Vault fUSDC 50M USDC + 18.3M USDT 17.2M USDT→USDC 50M USDC 17.2M USDC→USDT 50.3M USDC Repay + Fee USDC/USDT flow Withdraw Repay / Return
USDC Balance
0
USDT Balance
0
Status
대기

4. USDC Balance Waterfall (이 Tx)

Flash Loan 유입 Vault 차익 유출 (상환/수수료) Net Profit