code4rena-2023-01-biconomy-m01
[M-01] Griefing attacks on handleOps and multiSend logic
Summary
Front running으로 UserOperation을 선수쳐서 실행하면 Nonce가 변화하여 Relayer의 트랜잭션이 실패한다.
Keyword
front running, DoS, relayer, griefing attack
Vulnerability
- contracts/smart-contract-wallet/aa-4337/core/EntryPoint.sol#L68
- contracts/smart-contract-wallet/libs/MultiSend.sol#L26
Relayer는 EntryPoint.handleOps 함수를 호출하여 유저의 요청들 UserOperation 배열을 실행한다. 여러 유저의 요청이 섞여서 한 번에 처리된다. 만약 한 명의 유저가 실패하면 전체 트랜잭션이 revert 되게 된다.
Relayer가 실행한 컨트랙트콜은 다시 트랜잭션 멤풀에 들어가 실행된다. 이들이 정상적으로 처리되어야 Relayer가 가스비를 환급받을 수 있다.
![]()
이 때, 공격자는 Front running을 통해 Relayer가 실행한 UserOperation 중 하나를 선수쳐서 실행시킨다. 이로 인해 해당 유저의 Nonce가 업데이트 되고, Relayer가 실행하고자 하는 UserOperation 중 하나의 Nonce가 변경되었으므로 revert 된다.
배열의 맨 마지막 UserOperation이라면 Relayer는 모든 이전의 UserOperation를 확인하기 위해 Gas를 소비하고도 마지막 UserOperation에서 revert되어 Gas만 낭비하고 환급도 받지 못한다.
또한 이와 유사한 이슈가 libs.multiSend 에도 존재한다. libs.multiSend 는 Relayer → Smart Wallet - > MultiSend → Dapp 로 batch 트랜잭션을 처리하는 기능을 제공한다. 이 역시 batch 트랜잭션 중 하나라도 실패하면 전부 revert 되기 때문에 동일하게 공격자에게 방해받을 수 있다.
공격자가 직접적으로 이득을 보진 않지만 방해를 한다는 점에서 griefing attack 로 분류할 수 있다.
Impact
Relayer의 정상 작동을 방해하여 가스를 낭비하게 한다.
Mitigation
handleOps 의 경우 중복되는 require 같은 체크를 삭제한다. try-catch를 이용하여 각각의 트랜잭션이 non-atomic 하도록 수정한다.
tags: bughunting, smart contract, biconomy, account abstraction, erc4337, frontrunning, griefing attack, dos, account abstraction bundler, wallet, severity medium