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