code4rena-2022-08-nounsdao-m03
[M-03] Loss of Veto Power can Lead to 51% Attack
Summary
실수로 vetoer를 잘못 설정하는 상황을 막지 않는다. vetoer를 잃으면 51% 공격이 가능해지므로 중요한 문제이다.
Keyword
input validation, 51% attack, sybil attack, dao
Vulnerability
- contracts/governance/NounsDAOLogicV2.sol#L156
- contracts/governance/NounsDAOLogicV1.sol#L150
- contracts/governance/NounsDAOLogicV2.sol#L839-L845
- contracts/governance/NounsDAOLogicV1.sol#L637-L643
proposal에 대한 거부권을 행사할 수 있는 vetoer라는 역할이 있다. 이는 initialize() 함수와 _setVetoer() 함수를 통해 설정할 수 있다.
initialize() 함수와 _setVetoer() 함수에는 새로운 vetoer 의 주소가 올바른지(address(0) 가 아닌지) 확인하는 로직이 없다. vetoer 주소를 실수로 address(0) 로 설정한다면 vetoer가 공석이 되어 거부권을 행사할 수 없게 된다. 이 때, 51% 공격을 하면 임의의 proposal을 성공시킬 수 있다. 이를 통해 treasury의 모든 토큰을 탈취할 수 있다는 시나리오가 가능하다.
Impact
실수로 vetoer를 잘못 설정할 수 있으며, vetoer를 잃으면 51% 공격이 가능해진다.
Mitigation
initialize() 함수와 _setVetoer() 함수에서 address(0) 체크를 한다. 또한 _setVetoer() 함수로 vetoer를 설정할 시 2 step으로 설정하게 한다.
실수로 소유하지 않은 주소를 vetoer로 설정하지 않도록, 기존 vetoer A가 컨트랙트콜 하여 새로운 vetoer B에게 approve 한 후, B 계정으로 컨트랙트콜 하여 vetoer 권한을 옮겨가는 방식이다. 존재하지 않는 주소에 vetoer를 넘기는 상황이 발생하지 않게 된다.
Memo
단순히 address validation이 부족하다 라는 취약점에 51% attack을 엮어서 심각도가 더 높아 보이게 한 점이 인상적이다.
tags: bughunting, nouns dao, lack-of-input-validation-vul, smart contract, solidity, 51% attack, sybil attack, dao, severity medium