code4rena-2023-06-lybra-m19

[M-19] CLOCK_MODE() will not work properly for Arbitrum or Optimism due to block.number

보고서

Summary

L2에서는 block.number가 부정확할 수 있으므로 이를 기준으로 삼지 않아야 한다.

Keyword

erc6372, block.number, l2, arbitrum, optimism

Vulnerability

이 서비스는 Arbitrum 체인을 지원한다. Openzeppelin의 GovernorTimelockControl를 상속하여 거버넌스를 구현했는데, 이는 ERC6372를 이용한다.

     function CLOCK_MODE() public override view returns (string memory){
       require(clock() == block.number, "Votes: broken clock mode");
        return "mode=blocknumber&from=default";
    }
 
    function clock() public override view returns (uint48){
        return SafeCast.toUint48(block.number);
    }

Arbitrum 문서에 따르면 Arbitrum에서 block.number는 가장 최근 동기화된 L1 블록 번호를 반환한다. 1분에 한 번씩 시퀀서의 블록 넘버가 실제 L1 블록 넘버와 동기화된다.

따라서 L2에서 block.number를 시계로 이용하면 타이밍이 부정확할 수 있다.

Impact

투표 기능이 Arbitrum에서 제대로 작동하지 않을 수 있다.

Mitigation

block.number 대신 block.timestamp를 이용한다.


tags: bughunting, lybra finance, smart contract, solidity, l2, arbitrum chain, solidity block number, governance, erc6372, severity medium