Calldata Injection: The $17M Vulnerability Pattern Hiding in Every DeFi Router
DeFi 라우터 2개 프로토콜이 검증되지 않은 calldata 주입 공격으로 1,700만 달러 손실, 10개 항목 체크리스트로 방어
AI 요약
Context
DeFi 라우터와 애그리게이터 계약은 사용자의 토큰 승인을 보유하고 저수준 호출을 실행해야 하는데, 호출 대상과 함수 선택자를 검증하지 않으면 공격자가 승인된 토큰을 임의로 전송할 수 있다. 2026년 1월 SwapNet($16.8M 손실)과 Aperture Finance($367만 손실)가 동일한 취약점으로 공격받았고, 3월 z0r0z V4 Router도 유사 결함을 공개했다.
Technical Solution
- 호출 대상 화이트리스트 유지: approvedTargets 매핑으로 명시적 승인 대상만 허용
- 함수 선택자 제한: allowedCalls[target][selector] 매핑으로 특정 함수 호출만 허용
- Permit2 도입으로 장기 승인 제거: 단일 사용 승인으로 지속적 승인 권리 폐지
- transferFrom/approve/transfer 선택자 블랙리스트: 임의 호출 경로에서 토큰 조작 함수 차단
- 소스 코드 공개 및 검증: 폐쇄 소스 계약의 감사 우회 방지
- Forta 모니터링 봇 배포: 라우터에서 비정상적인 transferFrom 이벤트 감지
- 긴급 일시 중지 메커니즘: 모든 외부 호출 함수에 pause 기능 추가
- 시간 잠금 관리 함수: 대상 화이트리스트 업데이트에 지연 강제
Impact
스왑넷 공격에서 한 트랜잭션으로 1,334만 달러 손실, 전체 1,680만 달러가 Ethereum/Arbitrum/Base/BNB Chain에서 유출, Aperture Finance는 ERC20 토큰 367만 달러와 Uniswap V3 포지션 NFT 반출 피해
Key Takeaway
Calldata 주입은 승인을 보유하고 사용자 제어 데이터로 호출하는 계약의 단순한 패턴이지만, 대상 검증, 선택자 제한, 승인 최소화라는 기본 사항을 생략하면 $17M+ 손실이 발생한다. DeFi 라우터·유동성 관리·DEX 애그리게이션을 담당하는 프로토콜은 모든 저수준 호출 경로를 감사해야 한다.
실천 포인트
DeFi 프로토콜에서 사용자 토큰 승인을 다루는 라우터나 애그리게이터를 개발할 때, 저수준 call() 호출 전에 대상 주소와 함수 선택자(처음 4바이트)를 명시적 화이트리스트로 검증하고 Permit2로 장기 승인을 단일 사용 승인으로 대체하면, 승인 자산의 무단 이체 공격을 근본적으로 차단할 수 있다.