← Dashboard
BNB Smart Chain Chain ID: 56
PMA Case #—

JulSwap

JulProtocolV2의 addBNB() 함수 내 스팟 잔고 기반 유동성 계산 결함을 이용한 Flash Loan 차익 공격
Price Manipulation Flash Loan Single Tx Liquidity Exploit

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

All
Step 1: Flash Swap
Step 2: addBNB() 악용
Step 3: 저가 JULB 매입
Step 4: 상환 + 이익
공격자는 Flash Swap으로 70,000 JULB를 빌려 1,400.15 WBNB로 변환하여 풀 비율을 왜곡한 뒤, JulProtocolV2의 결함 있는 addBNB()를 호출하여 515 WBNB + 144,488 JULB의 과잉 유동성을 추가시켰다. 이후 362.31 WBNB만으로 70,311 JULB를 되사서 대출을 상환하고 522.84 WBNB(~$194,627)의 차익을 실현했다.
Single atomic transaction — Block #7,961,862 Attacker 0x7c591aab…ce03 JULB-WBNB Pair JulSwap AMM Pool (Flash Swap 제공) JulProtocolV2 ⚠ addBNB() 취약 Attacker Wallet +522.84 WBNB 70K JULB → 1,400.15 WBNB 1 addBNB(515 WBNB) → 144,488 JULB LP 과잉 2 362.31 WBNB → 70,311 JULB 3 70,211 JULB 상환 522.84 WBNB ~$194,627 4

Block 2 — 종합 대시보드

2-1. Transaction Info

Block 7,961,862
Date / Time (UTC) 2021-05-27 22:36:51 UTC
Attack Type Flash Loan + Liquidity Manipulation
Attacker Profit 522.838 WBNB (~$194,627)
Total Estimated Loss ~$1,500,000 (JULB 95%+ 폭락 포함)

2-2. Attack Execution Flow

Step 1 — Event #411
Flash Swap — JULB 차입 & WBNB 교환
JULB-WBNB Pair에서 Flash Swap을 통해 70,000 JULB를 차입하고, 동시에 풀에서 1,400.147 WBNB로 교환한다. 대량 JULB 매도로 풀의 JULB/WBNB 비율이 크게 왜곡된다.
70,000.000 JULB ($92,683) → 1,400.147 WBNB ($521,124)
Step 2 — Event #420
⚠ addBNB() 악용 — JulProtocolV2 유동성 조작
JulProtocolV2 컨트랙트의 addBNB() 함수를 호출한다. 이 함수는 현재 풀 상태(이미 조작된)를 기준으로 유동성 추가량을 계산하므로, 514.999 WBNB로 144,487.596 JULB 분량의 LP 토큰을 풀에 과잉 추가한다.
515.000 WBNB ($191,679) + 144,487.596 JULB ($191,308) → LP Mint
Step 3 — Event #426
저가 JULB 재매입
과잉 유동성으로 JULB 가격이 극도로 저렴해진 풀에서 362.309 WBNB만으로 70,310.632 JULB를 재매입한다. 실효 교환비 194.07 JULB/WBNB는 정상(50 JULB/WBNB) 대비 3.88배 왜곡된 가격이다.
362.309 WBNB ($134,849) → 70,310.632 JULB ($93,094)
Step 4 — Event #430
Flash Swap 상환
재매입한 70,310.632 JULB 중 70,210.632 JULB를 Flash Swap 상환에 사용한다 (원금 70,000 + 수수료 210.632 JULB, 0.3%). 풀이 정산하여 70,000 JULB를 확정 수취한다.
70,210.632 JULB 상환 (원금 70,000 + 수수료 210.632)
Step 5
이익 실현
남은 WBNB를 공격자 지갑으로 전송한다. WBNB 수지: 1,400.147 − 515.000 − 362.309 = 522.838 WBNB. 잔여 JULB 100개(~$132)는 무시할 수 있는 수준.
순이익: 522.838 WBNB (~$194,627)

2-3. Involved Entities & PnL

ATTACKER
Attack Contract
+522.838 WBNB (+$194,627)
VICTIM
JulProtocolV2
515 WBNB + 144,488 JULB LP 손실
VICTIM
JULB-WBNB LP Holders
JulSwap DEX 유동성 공급자
JULB 95%+ 가격 폭락 → IL
INTERMEDIARY
JULB-WBNB Pair
JulSwap AMM Pool (Flash Swap)
Flash Loan 원천 + 수수료 210.632 JULB 수취

2-4. Price Manipulation Detail

정상 JULB/WBNB 환율
교환비50 JULB/WBNB
JULB 단가$1.324
WBNB 단가$372.19
기준공격 전 풀 비율 (Event #411)
⚠ 조작 후 JULB/WBNB 환율
교환비194.07 JULB/WBNB
실효 JULB 단가$1.918
비율 왜곡3.88× (정상의 약 4배)
기준Event #426 (재매입 스왑)
Dump Cost (JULB 대량 매도)
투입량70,000 JULB ($92,683)
수령량1,400.147 WBNB ($521,124)
실효 환율50 JULB/WBNB
addBNB() 유동성 비용
소비 WBNB515.000 ($191,679)
추가 JULB LP144,487.596 ($191,308)
USD 합산$382,987

2-5. Key Events

#EventFromToAmountDeviation
#430 Swap (Flashloan borrow) JulSwap Unknown 70,000.000 JULB
#411 Swap Unknown JulSwap Pair 70,000.000 JULB → 1,400.147 WBNB $1.324/JULB
정상 범위 · 50 JULB/WBNB
#420 Mint (addBNB) Unknown JulSwap 144,487.596 JULB + 515.000 WBNB
#426 Swap Unknown JulSwap 362.309 WBNB → 70,310.632 JULB $1.918/JULB
194 JULB/WBNB · +44.9% from $1.324
#430 Swap (Flashloan repayment) Unknown JulSwap 70,210.632 JULB → 70,000.000 JULB
수수료 0.3%: 210.632 JULB
Profit Transfer Attack Contract Attacker Wallet 522.838 WBNB (~$194,627)

2-6. 유사 공격 비교

프로젝트날짜체인공격 유형피해액
JulSwap2021-05-28BSCFlash Loan + addBNB() 악용~$1.5M
PancakeBunny2021-05-20BSCFlash Loan + Price Oracle$45M
BurgerSwap2021-05-28BSCFlash Loan + Reentrancy$7.2M
bEarn Fi2021-05-16BSCFlash Loan + Strategy$11M
Spartan Protocol2021-05-02BSCFlash Loan + LP Calc Error$30.5M
Belt Finance2021-05-29BSCFlash Loan + Strategy Exploit$50M

2-7. Root Causes & Lessons

취약점 (Vulnerabilities)
스팟 잔고 기반 유동성 계산: addBNB()가 풀의 현재 스팟 잔고를 기반으로 추가할 유동성 양을 결정하여, Flash Swap으로 조작된 비율을 그대로 신뢰. 515 WBNB로 144,488 JULB 상당의 LP를 과잉 추가시킴
동일 트랜잭션 내 재진입: Flash Swap → 가격 왜곡 → addBNB() → 저가 매입 → 상환이 단일 원자적 트랜잭션 내에서 수행 가능
외부 오라클 미사용: TWAP이나 Chainlink 같은 외부 가격 오라클 없이 AMM 스팟 가격에만 의존하여 유동성 비율 결정
교훈 (Lessons Learned)
TWAP 오라클 통합: 유동성 추가/제거 시 시간 가중 평균 가격을 참조하여 일시적 가격 조작에 대한 내성 확보
슬리피지 보호 파라미터: addBNB() 같은 유동성 함수에 최대 허용 슬리피지를 입력받아 비정상적 비율의 LP 추가를 차단
Flash Loan Guard: 유동성 연산 함수에 동일 블록 내 재호출 방지(reentrancy guard) 또는 block.number 체크 적용

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

WBNB
$372.19
tokenPriceCache 기준
JULB (공격 전)
$1.324
tokenPriceCache 기준
JULB (조작 후 풀 스팟)
$1.918
194 JULB/WBNB · 3.88× 왜곡
JULB (공격 후 시장)
~$0.07
95%+ 폭락
💡 가격 조작 핵심: Flash Swap으로 70,000 JULB를 대량 매도하여 AMM 풀의 JULB/WBNB 비율을 왜곡한 뒤, JulProtocolV2의 addBNB()가 조작된 스팟 가격을 기준으로 144,488 JULB의 과잉 LP를 풀에 추가하도록 유도했다. 유동성 과잉으로 JULB의 실효 교환비가 50→194 JULB/WBNB로 3.88배 왜곡되어, 362.31 WBNB만으로 70,311 JULB를 되살 수 있었다. 실효 비용 절감분(1,400.15 − 515.00 − 362.31 = 522.84 WBNB)이 순이익이다.

Block 3 — 인터랙티브 Fund Flow

Step 1: Flash Swap
Step 2: addBNB()
Step 3: WBNB→JULB
Step 4: Flash Repay
Step 5: 이익 확정
[Event #411] JULB-WBNB Pair에서 Flash Swap으로 70,000 JULB를 빌리고, 동시에 1,400.147 WBNB로 교환한다. 대량 JULB 매도로 풀 비율이 왜곡된다.
Attacker Contract 0x7c591aab…ce03 JULB-WBNB Pair JulSwap AMM + Flash Swap JulProtocolV2 ⚠ addBNB() Attacker Wallet +522.84 WBNB (~$194,627) 70K JULB → 1,400.15 WBNB 515 WBNB + 144,488 JULB 362.31 WBNB → 70,311 JULB 70,211 JULB 상환 522.84 WBNB ~$194,627 WBNB flow JULB flow / Profit Buyback / Repay
WBNB Balance
1,400.15
JULB Balance
0
Status
Flash Swap 완료 · WBNB 확보

Block 4 — WBNB Balance Waterfall

Flash Swap 유입 (JULB→WBNB) 유출 (addBNB / Buyback) Net Profit