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

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