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

Rari Capital

Alpha Finance ibETH.work() 콜백을 이용한 ibETH/ETH 교환비 조작으로 Rari ETH Pool에서 약 2,600 ETH (~$10.2M) 탈취
ibETH Exchange Rate Manipulation Flash Loan (dYdX) Multi-Tx (×91) Cross-Protocol

Block 1 — 프로토콜 의존성 구조도

전체 프로토콜 의존관계를 보여줍니다. 각 단계를 클릭하면 해당 흐름이 하이라이트됩니다.
Single atomic transaction — Block #12394010 Attacker (EOA) 0xCB36...2233 Evil fToken (CA) 0x2f75...5D46 Alpha ibETH ibETH.work() + totalETH() dYdX Solo Margin (Flash Loan) Rari Fund Manager deposit() / withdraw() Rari Fund Controller AlphaPoolController SushiSwap fToken-WETH Pool ⚠ ibETH.totalETH() 조작 가능 ⚠ 조작된 ibETH 가격으로 잔고 계산 1 58,903 WETH 2 3 4 5 6 7

Block 2 — 종합 대시보드

2-1. Transaction Info

Block 12,394,010
Date / Time (UTC) 2021-05-08 13:48:29
Attack Type ibETH Exchange Rate Manipulation
Total Attacker Profit ~2,600 ETH (~$10.2M)
Victim Loss (Rari ETH Pool) ~2,600 ETH — 60% of pool
Attack Transactions ~91 pairs (Work + Donate)
Flash Loan per Tx 58,903.48 WETH

2-2. Attack Execution Flow

Step 1 — Flash Loan
dYdX에서 ~59,000 WETH 플래시 론
dYdX Solo Margin에서 58,903.48 WETH를 무담보 차입. Evil fToken 컨트랙트(0x2f75...5D46)가 실행 주체.
58,903.48 WETH → Evil fToken CA
Step 2 — Rari Pool에 ETH 예치 (정상 환율)
Rari Fund Manager deposit() 호출
Flash loan으로 받은 ETH를 Rari Capital ETH Pool에 예치. 이 시점에서 ibETH/ETH 환율은 정상 → 57,849.51 REPT 수령.
58,903.48 ETH → 57,849.51 REPT 민팅
Step 3 — ibETH.work() 호출 (가격 조작)
Alpha ibETH의 work() 함수로 totalETH 인위적 팽창
ibETH.work()에 1,063.32 ETH를 전송하여 ibETH 컨트랙트의 ETH 잔고를 일시적으로 팽창. ibETH.totalETH() 반환값이 증가하면서 Rari Controller가 계산하는 ibETH/ETH 환율이 왜곡.
1,063.32 ETH → ibETH (totalETH 팽창)
Step 4 — Rari Pool에서 ETH 인출 (조작된 환율)
Rari Fund Manager withdraw() — 팽창된 ibETH 가격으로 더 많은 ETH 인출
ibETH.totalETH()가 팽창된 상태에서 withdraw() 호출. Rari Controller가 ibETH 잔고를 과대평가 → 동일 REPT 소각 시 더 많은 ETH 반환. 57,820.89 REPT 소각 → 58,907.67 ETH 수령 (예치 대비 4.19 ETH 초과).
57,820.89 REPT 소각 → 58,907.67 ETH (차액: +4.19 ETH)
Step 5 — dYdX Flash Loan 상환
Flash loan 원금 상환
58,903.48 WETH를 dYdX Solo Margin에 상환. ibETH.work() 종료 시 1,063.32 ETH도 자동 반환.
58,903.48 WETH → dYdX
Step 6 — 순이익 확보 (단일 Tx)
Work 트랜잭션 이익: ~28.62 REPT (+ 잔여 ETH)
Work Tx에서 ~28.62 REPT(≈약 30 ETH 상당)의 순이익 확보. 이후 별도 Donate Tx에서 REPT를 ETH로 교환하여 실현. 이 사이클을 ~91회 반복 → 총 ~2,600 ETH 탈취.
~28.62 REPT / cycle × ~91 cycles ≈ 2,600 ETH

2-3. Involved Entities & PnL

ATTACKER (EOA)
Rari Capital Exploiter
+2,600 ETH (~$10.2M)
ATTACKER CONTRACT
Evil fToken (fTokenMock)
dYdX 플래시론 수령 · Rari deposit/withdraw 실행
VICTIM
Rari Capital ETH Pool
-2,600 ETH (유저 자금 60%)
INTERMEDIARY
Alpha Finance ibETH
work() 콜백 악용. Alpha 자금 무사
FLASH LOAN
dYdX Solo Margin
58,903 WETH 플래시론 제공
AUXILIARY
SushiSwap (fToken-WETH)
Evil Strategy가 사전에 생성한 LP 풀

2-4. Oracle Manipulation Detail

📊 정상 ibETH/ETH 환율
ibETH.totalETH()정상 잔고
REPT/ETH 비율~1:1.018
Deposit 환산58,903 ETH = 57,849 REPT
⚠ 조작된 ibETH/ETH 환율
ibETH.totalETH()+1,063 ETH 팽창
REPT/ETH 비율~1:1.019 (과대)
Withdraw 환산57,821 REPT → 58,908 ETH
💰 조작 비용 (per cycle)
ibETH 팽창 ETH1,063.32 ETH
가스비0.175 ETH
결과ETH 자동 반환
📈 공격 규모
단일 Tx 이익~28.62 REPT
총 반복 횟수~91 cycles
총 탈취량~2,600 ETH

2-5. Key Events (Work Tx #1)

#EventFromToAmountDeviation
1LogWithdraw (Flashloan borrow) dYdX Solo MarginEvil fToken (CA) 58,903.48 WETH
2Deposit (Rari) Evil fToken (CA)Rari Fund Manager 58,903.48 ETH
3REPT Mint NullEvil fToken (CA) 57,849.51 REPT $3,989/REPT
정상 환율 (1.018 ETH/REPT)
4ibETH.work() Attacker EOAAlpha ibETH call w/ Evil Goblin
5ETH → ibETH (팽창) Evil fToken (CA)Alpha ibETH 1,063.32 ETH
6Withdrawal (Rari, manipulated exchange rate) Evil fToken (CA)Rari Fund Manager 57,820.89 REPT 소각
→ 58,907.67 ETH 수령
$3,993/REPT
+0.1% 조작 (1.019 ETH/REPT)
7LogDeposit (Flashloan repayment) Evil fToken (CA)dYdX Solo Margin 58,903.48 WETH
8ibETH 반환 + 순이익 Alpha ibETHAttacker EOA 1,063.32 ETH 반환
+28.62 REPT (순이익)

2-6. 유사 공격 비교

공격명날짜유형손실Flash Loan
1Spartan Protocol2021-05-02LP 지분 가격 조작~$30M×
Rari Capital ETH Pool2021-05-08ibETH 교환비 조작~$10.2MdYdX (59K ETH)
3BT.Finance2021-02-08Curve/Uniswap 가격 조작~$8.9MAave
4Yearn yDAI2021-02-05Curve 3pool 가격 조작~$11MAave / dYdX
5Alpha Homora V22021-02-13프로토콜 통합 취약점~$37.5M×

2-7. Root Causes & Lessons

취약점
ibETH.totalETH() 조작 가능 — work() 함수 실행 중 ibETH 컨트랙트에 전송된 ETH가 totalETH()에 반영되어 일시적 가격 팽창 유발
work() 내 임의 컨트랙트 호출 — ibETH.work()의 goblin 콜백이 외부 컨트랙트를 자유롭게 호출할 수 있어, Rari의 deposit/withdraw를 조작된 상태에서 실행 가능
외부 의존 오라클 미검증 — Rari Controller가 ibETH.totalETH()/totalSupply() 비율을 무비판적으로 사용. 조작 가능성 미고려
동일 블록 내 Deposit+Withdraw 허용 — 같은 트랜잭션에서 deposit과 withdraw를 연속 호출할 수 있어 flash loan 기반 공격에 무방비
교훈
통합 프로토콜 공동 보안 리뷰 — 외부 프로토콜 통합 시 해당 프로토콜 팀과 함께 통합 코드를 리뷰. 내부 불변량(invariant) 위반 가능성 검토
불변량 체크 / Failsafe — 지분 가치(value-per-share)가 이전 기록보다 떨어지면 자동 일시정지하는 안전장치 구현
시간 잠금(Timelock) — deposit 후 같은 블록/시간 내 withdraw 방지. Flash loan 기반 공격 속도 제한
다중 감사 — Quantstamp 단독 감사 후 취약점 미발견. OpenZeppelin 등 복수 감사사 활용 권장

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

ETH (WETH)
~$3,916
공격 시점 시가
REPT (Rari ETH Pool Token)
~$3,989
1 REPT ≈ 1.018 ETH (정상)
ibETH/ETH (조작 후)
팽창됨
totalETH +1,063 ETH 일시 증가
RGT (Rari Governance)
~$18→$10
공격 후 -44% 폭락
💡 가격 조작 핵심: ibETH.work() 콜백에서 ETH를 ibETH 컨트랙트에 전송 → ibETH.totalETH() 일시 팽창 → Rari Controller의 ibETH 가치 계산(totalETH/totalSupply)이 과대 평가 → 동일 REPT 소각 시 더 많은 ETH 반환. work() 종료 시 ETH 자동 반환되어 공격 비용은 가스비뿐.

Block 3 — 인터랙티브 자금 흐름

단일 Work 트랜잭션 내 자금 흐름입니다. 각 단계를 클릭하면 해당 흐름이 하이라이트됩니다.
dYdX Solo Margin Evil fToken 0x2f75...5D46 Rari Fund Mgr deposit / withdraw Alpha ibETH work() + totalETH() Rari Controller getBalance() Attacker EOA 0xCB36...2233 ETH flow REPT / token Repay / Return Attack action 58,903 WETH 58,903 ETH 57,849 REPT 1,063 ETH totalETH ↑ 57,821 REPT 58,908 ETH ⚠ 조작 환율 getBalance() 58,903 WETH 1,063 ETH + ~30 REPT NET PROFIT BALANCE TRACKER ETH: 0 REPT: 0 Status: 대기

Block 4 — ETH Balance Waterfall (단일 Work Tx)

Flash loan 유입 유출 (Rari 예치 / ibETH 전송 / 상환) 유입 (Rari 인출 / ibETH 반환) Net profit (REPT 잔여분)