Multicall Contract 취약점 사례

Natreeum's Blog·2026년 1월 8일

Blockchain

목록 보기
3/6

Uniswap Multicall

Uniswap Multicall 컨트랙트의 코드를 살펴보면 다음과 같습니다.

Call 이라는 data struct를 배열로 받고, target.call() 을 통해 배열로 전달된 callData 를 target contract에 실행시킵니다.

여기서 해당 tx의 실행 주체는 uniswap multicall contract가 됩니다.

이를 악용한 공격 수법을 알아보겠습니다.

공격자는 피해자에게 다음과 같은 Approve 트랜잭션에 서명하도록 합니다.

  • Spender : Uniswap Multicall Contract
  • Amount : uint256 최대치

피해자의 입장에서는 수많은 트랜잭션이 일어나고, 유명한 Uniswap 컨트랙트가 spender 이므로 별다른 의심없이 해당 트랜잭션에 서명하게 됩니다.

이 과정에서 Uniswap Contract는 피해자의 지갑이 보유하고 있는 토큰에 대한 제어권을 갖게 됩니다.

Uniswap Contract가 피해자의 토큰에 대한 제어권을 갖게 되면, 공격자는 Uniswap Contract에 대해 transferFrom 메소드를 다음과같이 호출합니다.

  • sender : 피해자 지갑주소
  • recipient : 공격자 지갑 주소
  • amount : 수량

여기서 transferFrom 은 다음과 같이 작동합니다.
transferFrom(sender, recipient, amount);
tx를 전송하는 주체(msg.sender)는 sender로 부터 allowance 를 취득해야하고,
allowance가 충분할 경우 sender의 지갑에서 recipient에게 amount만큼 전송합니다.

이 과정을 도식화 하면 다음과 같습니다.

Gnosis Safe

비슷한 사례로 Gnosis safe wallet (multi sig wallet)을 통한 공격도 있었습니다.

공격의 순서는 다음과 같습니다

  1. 공격자는 safe wallet(proxy)을 생성합니다
  2. 공격자는 피해자에게 safe wallet에 대한 approve를 서명하도록 유도합니다.
  3. 피해자가 approve tx에 서명을 하면, 공격자는 proxy 컨트랙트의 execTransaction 메소드를 호출
  4. proxy 컨트랙트는 마스터 컨트랙트의 execTransaction을 delegateCall을 통해 호출

이 과정을 도식화 하면 다음과 같습니다.

개발 시 주의할 점

  • 공개된 multicall contract 에 approve 를 수행해서는 절대 안됨
  • multicall 기능이 필요하다면, tx를 대신해서 수행하는 메소드에 권한을 추가하여(whitelisted) 제한적으로 사용

참고 : https://research.checkpoint.com/2024/unveiling-the-scam-how-fraudsters-abuse-legitimate-blockchain-protocols-to-steal-your-cryptocurrency-wallet/

profile
BlockChain DEV

0개의 댓글