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