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

Merlin Labs

Vault의 CAKE 잔고를 직접 전송해 performanceFee를 부풀리고, 과도한 MERL 토큰을 반복 민팅한 뒤 ~240 ETH($680K)를 탈취
Reward Minting Manipulation PancakeBunny Fork Multi-Tx (×36)

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

All
Step 1: 소량 예치
Step 2: CAKE 전송
Step 3: getReward
Step 4: MERL 매도
Step 5: 반복 ×36
Multi-transaction attack — Block #7,668,573 onwards Attacker (EOA) 0x590… Merlin LINK-BNB Vault VaultFlipToCake MerlinMinter mintFor() CAKE Token PancakeSwap MERL Token PancakeSwap DEX PancakeSwap MasterChef CAKE Staking deposit LP 1 buy 180 CAKE send 180 CAKE → Vault 2 performanceFee inflated! mint 100 MERL 3 swap → BNB → ETH 4 ×36 반복 5
공격자는 EOA에서 여러 트랜잭션을 순차적으로 실행했다. Merlin Lab의 VaultFlipToCake 컨트랙트가 CAKE 잔고(balance)를 그대로 performanceFee로 사용하는 취약점을 악용하여, 외부에서 CAKE를 직접 전송한 뒤 getReward()를 호출해 과도한 MERL 토큰을 민팅받았다. 이 과정을 36회 반복하여 총 ~49,000 MERL을 획득하고, 이를 PancakeSwap에서 BNB로 스왑한 후 Anyswap 브릿지를 통해 ~240 ETH로 전환했다.

Block 2 — 종합 대시보드

2-1. Transaction Info

Block 7,668,573
Date / Time (UTC) 2021-05-26 03:59:05
Attack Type Performance Fee Manipulation (Reward Minting)
Attacker Profit ~240 ETH (~$680,000)
Victim Loss ~$680,000 (MERL 토큰 가치 희석)
Attack Duration 36 트랜잭션 (Multi-Tx)

2-2. 공격 실행 흐름

Step 1 — 예치 자격 확보
LINK-BNB Vault에 소량 LP 예치
공격자가 LINK-BNB LP 토큰을 VaultFlipToCake 컨트랙트에 소량 예치하여 getReward() 호출 자격을 확보한다.
소량 LP 예치
Step 2 — 핵심 조작
180 CAKE를 Vault 컨트랙트에 직접 전송
Vault 컨트랙트의 CAKE 잔고가 곧 performanceFee로 계산되므로, 외부에서 CAKE를 전송하면 허위 수익이 발생한다. CAKE를 PancakeSwap에서 구매하여 Vault 주소로 직접 transfer한다.
180 CAKE (~$3,510)
Step 3 — 보상 민팅
getReward() 호출 → ~100 MERL 민팅
Vault의 _getReward()가 부풀려진 performanceFee를 기반으로 MerlinMinter.mintFor()를 호출하고, MerlinMinter는 약 100 MERL을 공격자에게 민팅한다.
~100 MERL / 회
Step 4 — 반복 실행
Step 2–3을 36회 반복
nonContract modifier로 플래시론은 차단되었으나, EOA에서 개별 트랜잭션으로 동일 공격을 36회 반복 실행한다. 총 ~49,000 MERL 획득.
36 × ~100 MERL = ~49,000 MERL
Step 5 — 이익 실현
MERL → BNB → ETH 스왑 + 브릿지
획득한 MERL을 PancakeSwap에서 BNB로 스왑한 뒤, Anyswap 브릿지를 통해 Ethereum으로 ~240 ETH를 전송하여 탈출한다.
~240 ETH (~$680,000) NET PROFIT

2-3. 관련 엔티티 및 PnL

ATTACKER
Attacker (EOA)
+240 ETH (+$680K)
VICTIM
Merlin Lab (VaultFlipToCake)
MERL 토큰 가치 희석
VICTIM
MerlinMinter
민팅 컨트랙트 (mintFor)
~49K MERL 비정상 민팅
INTERMEDIARY
PancakeSwap / Anyswap
DEX + Cross-chain Bridge
MERL→BNB→ETH 변환 경로

2-4. Reward Minting Manipulation Detail

정상 performanceFee
정상 수확 (Harvested)3.96 CAKE ($69.67)
정상 performanceFee (30%)~1.19 CAKE ($20.90)
산출 방식earned() 기반
⚠ 조작된 performanceFee
ProfitPaid profit180.27 CAKE ($3,170)
실제 performanceFee54.08 CAKE ($951)
민팅 MERL/회100.26 MERL ($3,439)
증폭 배수×45.5배
공격 비용 (입력/회)
CAKE 전송~180 CAKE × 36 Tx
CAKE 가격$17.59/CAKE
총 비용 (추정)~$113,940
공격 수익 (출력)
획득 MERL~3,609 MERL (100.26 × 36)
스왑 후 ETH~240 ETH
USD 환산~$680,000

2-5. Key Events (1회차 Tx 기준 — 디코딩 데이터)

📋 범례: 아래 테이블은 36개 공격 트랜잭션 중 1회차의 실제 이벤트 로그를 디코딩한 결과입니다. 매 트랜잭션마다 동일 패턴이 반복됩니다.
LogEventFromToAmountUSD
117WithdrawPancakeSwapMerlin0.000001 CAKE $0.00
124DepositMerlinPancakeSwap3.96 CAKE $69.67
133Swap
CAKE→WBNB (ZapBSC)
MerlinPancakeSwap54.08 CAKE $951.05
MerlinPancakeSwap2.86 WBNB $982.42
$343.03/WBNB
139Swap
WBNB→MERL (ZapBSC)
PancakeSwapMerlin1.43 WBNB $491.21
MerlinPancakeSwap10.45 MERL $358.45
$34.30/MERL
147Mint (LP)PancakeSwapMerlin1.43 WBNB + 10.45 MERL $849.30
155StakedUnknownMerlin (Staking)13.03 MERL $447.11
150MERL Mint ⚠Null (민팅)Unknown (0x400f)100.26 MERL $3,439.14
$34.30/MERL
157ProfitPaidMerlinUnknownprofit: 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
PancakeBunny2021-05-19BSC$45MLP price oracle + performanceFeeYes
AutoShark2021-05-24BSC$745KSharkMinter reward manipulationYes (Flash Swap)
★ Merlin Labs2021-05-26BSC$680KCAKE balance → performanceFeeNo (Multi-Tx)
PancakeHunny2021-06-03BSC$200K+동일 fork 취약점Yes
ApeRocket2021-07-14BSC$260KCAKE 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: 매도 + 브릿지
Attacker (EOA) LINK-BNB Vault Merlin Lab MerlinMinter mintFor() PancakeSwap DEX MERL Token 민팅 대상 Anyswap BSC → ETH Bridge LP 예치 180 CAKE 직접 전송 performanceFee mint ~100 MERL → Attacker ×36 반복 (Step 2–3) 49K MERL swap BNB → ETH BNB / ETH flow MERL flow CAKE flow Loop
공격자가 LINK-BNB LP 토큰을 소량 예치하여 Vault의 getReward() 호출 자격을 확보한다. 이후 CAKE를 외부에서 직접 전송하고 getReward()를 호출하는 패턴을 반복한다.
CAKE 투입 (누적)
0
MERL 획득 (누적)
0
Status
예치 자격 확보

Block 4 — 공격자 자산 흐름 (Waterfall)

초기 투입 비용 (CAKE 구매) 수익 (MERL 매도) Net Profit