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

Call 이라는 data struct를 배열로 받고, target.call() 을 통해 배열로 전달된 callData 를 target contract에 실행시킵니다.
여기서 해당 tx의 실행 주체는 uniswap multicall contract가 됩니다.
이를 악용한 공격 수법을 알아보겠습니다.
공격자는 피해자에게 다음과 같은 Approve 트랜잭션에 서명하도록 합니다.
피해자의 입장에서는 수많은 트랜잭션이 일어나고, 유명한 Uniswap 컨트랙트가 spender 이므로 별다른 의심없이 해당 트랜잭션에 서명하게 됩니다.
이 과정에서 Uniswap Contract는 피해자의 지갑이 보유하고 있는 토큰에 대한 제어권을 갖게 됩니다.
Uniswap Contract가 피해자의 토큰에 대한 제어권을 갖게 되면, 공격자는 Uniswap Contract에 대해 transferFrom 메소드를 다음과같이 호출합니다.
여기서 transferFrom 은 다음과 같이 작동합니다.
transferFrom(sender, recipient, amount);
tx를 전송하는 주체(msg.sender)는 sender로 부터 allowance 를 취득해야하고,
allowance가 충분할 경우 sender의 지갑에서 recipient에게 amount만큼 전송합니다.
이 과정을 도식화 하면 다음과 같습니다.

비슷한 사례로 Gnosis safe wallet (multi sig wallet)을 통한 공격도 있었습니다.
공격의 순서는 다음과 같습니다
이 과정을 도식화 하면 다음과 같습니다.
