공격자는 EOA에서 여러 트랜잭션을 순차적으로 실행했다. Merlin Lab의 VaultFlipToCake 컨트랙트가 CAKE 잔고(balance)를 그대로 performanceFee로 사용하는 취약점을 악용하여, 외부에서 CAKE를 직접 전송한 뒤 getReward()를 호출해 과도한 MERL 토큰을 민팅받았다. 이 과정을 36회 반복하여 총 ~49,000 MERL을 획득하고, 이를 PancakeSwap에서 BNB로 스왑한 후 Anyswap 브릿지를 통해 ~240 ETH로 전환했다.
📋 범례: 아래 테이블은 36개 공격 트랜잭션 중 1회차의 실제 이벤트 로그를 디코딩한 결과입니다. 매 트랜잭션마다 동일 패턴이 반복됩니다.
Log
Event
From
To
Amount
USD
117
Withdraw
PancakeSwap
Merlin
0.000001 CAKE
$0.00
124
Deposit
Merlin
PancakeSwap
3.96 CAKE
$69.67
133
Swap CAKE→WBNB (ZapBSC)
Merlin
PancakeSwap
54.08 CAKE
$951.05
Merlin
PancakeSwap
2.86 WBNB
$982.42 $343.03/WBNB
139
Swap WBNB→MERL (ZapBSC)
PancakeSwap
Merlin
1.43 WBNB
$491.21
Merlin
PancakeSwap
10.45 MERL
$358.45 $34.30/MERL
147
Mint (LP)
PancakeSwap
Merlin
1.43 WBNB + 10.45 MERL
$849.30
—
155
Staked
Unknown
Merlin (Staking)
13.03 MERL
$447.11
150
MERL Mint ⚠
Null (민팅)
Unknown (0x400f)
100.26 MERL
$3,439.14 $34.30/MERL
157
ProfitPaid
Merlin
Unknown
profit: 180.27 CAKE performanceFee: 54.08 CAKE
$3,170.38 정상 수확 $69.67 대비 ×45.5배 부풀림
⚠ 핵심 괴리: Harvested(#120)의 정상 수확량은 3.96 CAKE ($69.67)뿐이나, ProfitPaid(#157)에서 profit이 180.27 CAKE ($3,170)로 기록됨. 차액 ≈176 CAKE는 공격자가 외부에서 Vault에 직접 전송한 CAKE가 balanceOf 기반 profit 계산에 포함된 결과. 이 부풀려진 profit의 30%인 54.08 CAKE가 performanceFee로 MerlinMinter에 전달되어 100.26 MERL이 과잉 민팅됨.
2-6. 유사 공격 비교표
프로토콜
날짜
체인
손실
공격 기법
Flash Loan
PancakeBunny
2021-05-19
BSC
$45M
LP price oracle + performanceFee
Yes
AutoShark
2021-05-24
BSC
$745K
SharkMinter reward manipulation
Yes (Flash Swap)
★ Merlin Labs
2021-05-26
BSC
$680K
CAKE balance → performanceFee
No (Multi-Tx)
PancakeHunny
2021-06-03
BSC
$200K+
동일 fork 취약점
Yes
ApeRocket
2021-07-14
BSC
$260K
CAKE balance + harvest()
Yes
2-7. 근본 원인 및 교훈
취약점 (Root Causes)
performanceFee가 CAKE.balanceOf(vault)를 직접 참조하여, 외부 전송으로 조작 가능
PancakeBunny의 동일 취약점을 포크하면서 수정하지 않음
nonContract modifier가 EOA 기반 반복 공격을 차단하지 못함
Hacken 감사(5/15) 후 11일 만에 공격 — 감사가 해당 로직을 검출 실패
교훈 (Lessons Learned)
보상 계산 시 실제 스테이킹 수익만 반영해야 함 (잔고 기반 계산 금지)
포크 프로젝트는 원본의 post-mortem을 반드시 검토하고 패치 적용 필수
단일 감사로는 불충분 — 지속적 모니터링 및 다중 감사 필요
EOA 반복 공격 대비: 시간 기반 제한(cooldown) 및 보상 캡 설정 권장
2-8. 공격 당시 토큰 가격 (이벤트 데이터 기준)
WBNB
$343.03
Swap #133 기준
CAKE
$17.59
공격자 입력 토큰
MERL (공격 전)
$34.30
Swap #139 기준
CAKE-LP (profit 단위)
$243.99
ProfitPaid #157 기준
💡 조작 핵심: Vault 컨트랙트가 CAKE.balanceOf(address(this))를 performanceFee로 직접 사용하므로, 공격자가 외부에서 CAKE를 전송하기만 하면 허위 수익이 발생하여 과도한 MERL이 민팅된다. 이는 오라클 조작이 아닌 잔고 기반 수익 계산의 구조적 취약점이다.
Block 3 — 인터랙티브 Fund Flow
Step 1: LP 예치
Step 2: CAKE 전송
Step 3: MERL 민팅
Step 4: ×36 반복
Step 5: 매도 + 브릿지
공격자가 LINK-BNB LP 토큰을 소량 예치하여 Vault의 getReward() 호출 자격을 확보한다. 이후 CAKE를 외부에서 직접 전송하고 getReward()를 호출하는 패턴을 반복한다.