code4rena-2024-10-kleidi-m01

[M-01] Gas griefing, attack via creating the proposals

보고서

Summary

관리자 계정이 탈취되었을 때 방어를 위한 일시정지 기능을 DoS할 수 있다. 일시정지 시 타임록에 등록되어 있는 모든 제안을 삭제하는데, 공격자가 많은 제안을 등록해두면 가스 부족으로 트랜잭션을 취소시킬 수 있다.

Keyword

griefing attack, dos, gas limit

Vulnerability

Safe 월렛 관리자의 키가 노출된 경우, 공격자는 많은 제안을 타임록에 요청할 수 있다. Pause 가디언이 공격을 감지하고 컨트랙트를 일시정지 요청하면 등록된 모든 제안이 취소된다. 이 때, 많은 제안이 등록되어 있다면 가스 limit으로 인해 트랜잭션이 실패하거나 가디언의 가스를 낭비시킬 수 있다.

    function pause() public override {
        /// check that msg.sender is the pause guardian, pause the contract
        super.pause();
 
        bytes32[] memory proposals = _liveProposals.values();
@>      for (uint256 i = 0; i < proposals.length; i++) {
            bytes32 id = proposals[i];
 
            delete timestamps[id];
            assert(_liveProposals.remove(id));
 
            emit Cancelled(id);
        }
    }

Impact

방어를 위해 만들어둔 일시정지 기능이 작동할 수 없게 된다.

Mitigation

타임록에 Epoch 를 두고 일시정지 시에는 Epoch를 업데이트한다. 이렇게 하면 제안을 하나하나 삭제하지 않고 단순히 Epoch를 업데이트하여 이전 제안 전체를 무효화할 수 있다. 또는 일시정지 시에 제안을 삭제하지 말고 실행만 막도록 한다. 제안의 삭제는 일시정지와는 따로 진행한다.


tags: bughunting, kleidi, smart contract, solidity, gnosis safe, wallet, griefing attack, dos, gas limit, severity medium