← Dashboard
BNB Smart Chain Chain ID: 56
PMA Case #—
AutoShark Finance
SharkMinter의 잔고 기반 리워드 계산 취약점을 악용한 플래시론 기반 토큰 과잉 민팅 공격
Reward Minting Manipulation Flash Loan Single Tx PancakeBunny Fork
1. 프로토콜 의존성 구조도
All
Step 1: LP 예치
Step 2: Flash Loan
Step 3: Swap + 전송
Step 4: 민팅
Step 5: 덤프 & 이익
Single atomic transaction — Block #7,698,696
Attacker EOA 0xd9c7… + CA 0x22de…
PancakeSwap Flash Loan Provider
PantherSwap AMM (WBNB/SHARK)
SharkMinter ⚠ tokenToSharkBNB() 취약
StrategyCompound SHARK-BNB Vault
PantherSwap BUSD/SHARK Pool
1
100,000 BNB 2
50K BNB→391K SHARK 50K BNB + 10,987 SHARK 3
getReward() 100M SHARK ⚠ 과잉 민팅 4
110M SHARK 덤프 102,514 BNB 상환 100,301 BNB 5
전체 공격 흐름: 공격자(EOA 0xd9c7…)가 컨트랙트(0x22de…)를 통해 PancakeSwap에서 100,000 BNB 플래시론 차입 → 50,000 BNB를 PantherSwap에서 391,175 SHARK로 스왑 → 나머지 50,000 BNB + 10,987 SHARK를 SharkMinter에 직접 전송 → getReward() 호출 시 부풀려진 잔고 기반으로 100M SHARK 민팅 → 110M SHARK를 2경로로 덤프하여 102,514 BNB 확보 → 100,301 BNB 상환 후 2,213 BNB($579,400) 순이익.
2. 종합 대시보드
2-1. Transaction Info
Date / Time 2021-05-24 21:41:49 UTC
Attack Type Reward Minting Manipulation
Attacker Profit 2,213.39 BNB (~$579,400)
Victim Loss ~$759,046 (LP 유동성 + SHARK 가격 붕괴)
2-2. 공격 실행 흐름
Step 1 — 사전 준비: LP 예치
SHARK-BNB LP를 Vault에 소량 예치
PantherSwap에서 소량의 SHARK-BNB LP를 생성하여 StrategyCompoundFLIP에 예치. getReward() 호출 자격(performanceFee > DUST) 확보.
Step 2 — Flash Loan
PancakeSwap에서 100,000 BNB 차입
PancakeSwap WBNB/BUSD LP 풀에서 플래시론으로 100,000 WBNB 차입. 동일 트랜잭션 내 수수료 포함 상환 필요.
100,000 BNB ($26,174,633)
Step 3 — 가격 펌핑 + 잔고 인플레이션
50K BNB → 391,175 SHARK 스왑 + SharkMinter에 직접 전송
50,000 BNB를 PantherSwap WBNB/SHARK 풀에서 391,175 SHARK로 스왑. 나머지 50,000 BNB + 10,987 SHARK를 SharkMinter에 직접 전송. generateFlipToken()이 이 잔고를 참조하여 22,263 LP를 생성 — 정상 LP 생성량(0.000016)의 13.5억배.
50,000 BNB → 391,175 SHARK (PantherSwap)
Step 4 — 과잉 민팅 (138M SHARK)
getReward() → mintFor() → 공격자 100M + Dev 18M + Referrer 20M
getReward() 호출 시 SharkMinter의 50,000 BNB 잔고가 generateFlipToken()에 투입되어 22,263 LP 생성. 이 극단적 LP 양이 sharkBNBAmount로 반환되어 100M SHARK가 공격자 CA에 민팅. Dev 18M + Referrer 20M(CA 10M + PantherRouter 10M) 추가.
총 138,000,000 SHARK 민팅
Step 5 — 이익 실현
110M SHARK 2경로 덤프 → 102,514 BNB → 상환 → 순이익
110M SHARK(100M 리워드 + 10M referrer)를 2경로로 덤프: ① 55.19M SHARK → 101,361 BNB (WBNB/SHARK), ② 55.19M SHARK → 415,820 BUSD → 1,152 BNB (BUSD/SHARK → WBNB/BUSD). 총 102,514 BNB 확보 후 100,300.9 BNB 상환, 2,213.39 BNB를 EOA로 인출.
NET PROFIT: 2,213.39 BNB (~$579,400)
2-3. 관련 엔티티 & PnL
ATTACKER (EOA) 공격자 EOA
+2,213.39 BNB (~$579,400)
ATTACKER (CA) 공격 컨트랙트
메인 실행 + Referrer 10M SHARK 수령
VICTIM AutoShark Finance
SharkMinter + SHARK-BNB LP Pool
-$759,046
FLASH LOAN PancakeSwap
+300.9 BNB (수수료)
DEV AutoShark Dev
18M SHARK 자동 스테이킹 (소각 약속)
INTERMEDIARY PantherSwap AMM
WBNB/SHARK + BUSD/SHARK + WBNB/BUSD 풀
간접 피해 (유동성 고갈)
2-4. 가격/잔고 조작 상세
정상 상태 (공격 전)
SHARK 가격 $0.4807
BNB 가격 $261.75
SharkMinter WBNB ~0
SharkMinter SHARK ~0
⚠ 조작 후 (mintFor 직전)
SharkMinter WBNB 50,000 BNB
SharkMinter SHARK 10,987 SHARK
generateFlipToken LP 22,263 LP
결과 민팅량 100,000,000 SHARK
조작 비용
Flash Loan 원금 100,000 BNB
Flash Loan 수수료 300.9 BNB
SHARK 매수 (펌프) 50,000 BNB
PantherSwap 풀 영향
WBNB/SHARK reserve0 (전) ~1,401 WBNB
WBNB/SHARK reserve0 (후) 39.89 WBNB
BUSD/SHARK reserve0 (후) 2,626 BUSD
2-5. Key Events
# Event From To Amount Deviation
1 Swap (Flashloan borrow) (#294) PancakeSwap LP Attacker CA 100,000 WBNB —
2 Swap (#299) Attacker CA PantherSwap WBNB/SHARK 50,000 WBNB → 391,175.80 SHARK $33.45/SHARK 실효 BNB/SHARK: 0.1278
3 Direct Transfer (#300-301) Attacker CA SharkMinter 50,000 WBNB + 10,987 SHARK —
4 Mint (#328-329) SharkMinter Attacker CA 100,000,000 SHARK ∞ 정상 대비 무한배
5 Swap (#356) Attacker CA PantherSwap WBNB/SHARK 55,190,094 SHARK → 101,361.65 WBNB $0.0048/SHARK −99.0% from $0.4807
6 Swap (#361→364) Attacker CA PantherSwap (2-hop) 55,190,094 SHARK → 415,820 BUSD → 1,152.64 WBNB $0.0075/SHARK −98.4% from $0.4807
7 Swap (Flashloan repayment) (#368) Attacker CA PancakeSwap LP 100,300.90 WBNB (원금+수수료) 0.3% fee 300.9 BNB
8 Profit (#366) Attacker CA Attacker EOA 2,213.39 WBNB $579,406 × $261.75/BNB
2-6. 유사 공격 비교표
프로토콜 날짜 체인 피해액 공격 기법 Flash Loan
— PancakeBunny 2021-05-19 BSC ~$45M BunnyMinter 잔고 조작 PancakeSwap + ForTube
★ AutoShark Finance 2021-05-24 BSC ~$759K SharkMinter 잔고 조작 PancakeSwap (100K BNB)
— Merlin Labs 2021-05 후반 BSC ~$680K CAKE 잔고 조작 (멀티 Tx) 없음 (EOA 직접)
— PancakeHunny 2021-06 BSC ~$300K HunnyMinter 잔고 조작 없음 (antiWhale 우회)
2-7. 근본 원인 & 교훈
취약점
tokenToSharkBNB()가 외부에서 조작 가능한 현재 잔고를 리워드 계산 입력으로 사용 — Mint #323에서 50,000 WBNB 투입 확인
generateFlipToken()이 SharkMinter의 WBNB/SHARK 잔고를 직접 참조 — 정상 Burn(0.000037 WBNB) 대비 Mint(50,000 WBNB)는 13.5억배 차이
PancakeBunny 동일 취약점 공개 후 5일간 포크 코드 미수정
Flash loan 방어(noContract modifier) 미적용
교훈
리워드 계산에 현재 잔고 대신 누적 기록(checkpoint) 또는 TWAP 오라클 사용 필요
포크 프로젝트는 원본의 보안 사고 발생 시 즉각 동일 취약점 패치 필수
4건의 감사에도 미발견 — 감사만으로는 불충분
Flash loan 방어를 기본 적용해야 함
2-8. 공격 당시 토큰 가격
WBNB
$261.75
tokenPriceCache
SHARK (공격 전)
$0.4807
tokenPriceCache
SHARK (덤프 후 실효)
~$0.005
풀 유동성 사실상 고갈
💡 가격 조작 핵심: SharkMinter의 내부 WBNB/SHARK 잔고 를 50,000 BNB + 10,987 SHARK로 부풀려 generateFlipToken()이 22,263 LP를 생성하도록 유도. 정상 LP 생성량(0.000016 LP)과 비교하면 약 13.5억배 .
3. 인터랙티브 Fund Flow
Step 1: LP 예치
Step 2: Flash Loan
Step 3: Swap + 전송
Step 4: 민팅
Step 5: 덤프 & 이익
Attacker EOA 0xd9c7… + CA 0x22de…
PancakeSwap Flash Loan
PantherSwap AMM
SharkMinter ⚠ 잔고 조작 → 138M SHARK
SHARK-BNB Vault
BUSD/SHARK + WBNB/BUSD
LP 생성
100,000 BNB
50K→391K SHARK 50K BNB+10,987 SHARK
getReward() 100M SHARK
110M SHARK 102,514 BNB 상환 100,301
BNB flow Token flow Repay / Trigger
Step 1: PantherSwap에서 SHARK-BNB LP를 소량 생성하여 Vault(StrategyCompoundFLIP)에 예치. getReward() 호출 자격 확보.
4. BNB Balance Waterfall
Flash loan 유입 유출 Exploit 유입 Net profit