code4rena-2024-08-chakra-m12
[M-12] SettlementSignatureVerifier’s required_validators is not updated, resulting in a low or high number of signatures being required
Summary
서명자를 변경할 때, 서명과 관련된 두 컨트랙트를 함께 변경해야 한다. 그런데 필요한 서명자의 수를 변경하는 set_required_validators_num 함수에서는 두 컨트랙트가 함께 변경되지 않았다.
Keyword
bridge, cross chain, logic flaw
Vulnerability
BaseSettlement 컨트랙트에서 validator를 설정하는 함수인 BaseSettlement.add_validator 와 BaseSettlement.remove_validator 는 연동된 SignatureVerifier 컨트랙트의 validator도 함께 변경한다. 하지만 이와 다르게 BaseSettlement.set_required_validators_num 함수는 SignatureVerifier 의 SettlementSignatureVerifier.set_required_validators_num 를 호출하지 않는다. 따라서 필요한 validator의 서명자 수는 설정되지 않을 것이다.
function set_required_validators_num(
uint256 _required_validators
) external onlyRole(MANAGER_ROLE) {
uint256 old = required_validators;
required_validators = _required_validators;
emit RequiredValidatorsChanged(msg.sender, old, required_validators);
}이로 인해 필요한 서명자의 수가 서로 일치하지 않게 된다. 잘못된 서명자 수를 기준으로 서명을 확인하여 관리자가 의도했던 것보다 더 적거나 많은 서명을 요구하게 된다.
Impact
SettlementSignatureVerifier의 required_validators 이 업데이트 되지 않아 잘못된 서명자 수를 이용하게 된다. 더 적은 또는 많은 수의 서명을 요구한다.
Mitigation
BaseSettlement.set_required_validators_num 에서 SettlementSignatureVerifier.set_required_validators_num 를 호출하여 필요한 validator 수를 일치시킨다.
function set_required_validators_num(
uint256 _required_validators
) external onlyRole(MANAGER_ROLE) {
+ signature_verifier.set_required_validators_num(_required_validators);
uint256 old = required_validators;
required_validators = _required_validators;
emit RequiredValidatorsChanged(msg.sender, old, required_validators);
}tags: bughunting, chakra, smart contract, starknet, solidity, bridge, cross chain, logic flaw, severity medium