code4rena-2023-06-angle-protocol-h02
[H-02] The first disputer might lose funds although his dispute is valid
Summary
이의제기를 덮어쓰면 먼저 이의를 제기한 유저가 토큰을 돌려받지 못한다.
Keyword
logic flaw, frontrunning, token loss, griefing attack
Vulnerability
disputeTree 함수를 호출하여 이의를 제기할 수 있고, 이동안 머클 트리의 업데이트를 정지할 수 있다. 이를 해제하기 위해서는 governor 또는 guardian 계정으로 resolveDispute를 호출해야 한다.
resolveDispute에서, 이의가 유효한 경우 disputer에게 disputeToken을 돌려주고 머클 트리를 이전 상태로 되돌린다. 아닌 경우 disputeToken은 관리자가 가져가고, 이의를 제기할 수 있는 시간 리미트를 업데이트한다.
function disputeTree(string memory reason) external {
if (block.timestamp >= endOfDisputePeriod) revert InvalidDispute();
IERC20(disputeToken).safeTransferFrom(msg.sender, address(this), disputeAmount);
disputer = msg.sender;
emit Disputed(reason);
}
/// @notice Resolve the ongoing dispute, if any
/// @param valid Whether the dispute was valid
function resolveDispute(bool valid) external onlyGovernorOrGuardian {
if (disputer == address(0)) revert NoDispute();
if (valid) {
IERC20(disputeToken).safeTransfer(disputer, disputeAmount);
// If a dispute is valid, the contract falls back to the last tree that was updated
_revokeTree();
} else {
IERC20(disputeToken).safeTransfer(msg.sender, disputeAmount);
endOfDisputePeriod = _endOfDisputePeriod(uint48(block.timestamp));
}
disputer = address(0);
emit DisputeResolved(valid);
}disputeTree에서는 if (block.timestamp >= endOfDisputePeriod) revert InvalidDispute(); 로 이의를 제기할 수 있는 시간 내인지만 확인한다. 누군가 이의를 이미 제기했는지는 확인하지 않는다. 즉, 이미 누군가 disputeTree를 호출하여 disputer = msg.sender;가 설정된 상태에 다른 유저가 disputeTree를 호출할 수 있다.
resolveDispute에서 2번째 이의제기자에게 토큰을 환급해주더라도, 첫번째 이의제기자는 토큰을 환급받지 못한다.
최악의 경우 frontrun에 의해 disputeToken을 돌려받지 못할 수도 있다. resolveDispute로 이의를 인정하는 콜을 했을 때 frontrun으로 disputeTree를 호출하면 기존 이의제기자는 토큰을 환급받지 못한다.
Impact
유효한 이의를 제기한 유저가 토큰을 돌려받지 못한다.
Mitigation
기존에 이의를 제기한 유저가 있다면 더이상 이의를 제기할 수 없도록 막는다.
Memo
High냐 Medium이냐 논쟁이 있었다. 관리자가 recoverERC20 함수를 호출하여 직접 받을 주소와 양을 파라미터로 넘기면 토큰을 빼낼 수 있으므로, 토큰이 완전히 묶이는 상황은 아니었다. 하지만 이는 관리자의 추가적인 작업이 필요하며, 의도적인 방해 시도를 막지 못하므로 High과 Medium의 사이라고 판단했고, High를 유지했다.
tags: bughunting, angle protocol, smart contract, solidity, stablecoin, logic flaw, frontrunning, griefing attack, severity high