MultiSig Timelock

First Flight #55
Beginner FriendlyWallet
100 EXP
View results
Submission Details
Impact: medium
Likelihood: high
Invalid

Signing Role Can Not Propose Transaction

Signing Role Can Not Propose Transaction

Description

  • The project's documentation states that Propose new transactions (permission is tied to the role, so any signer can propose). However, the proposeTransaction function is restricted by the onlyOwner modifier, which prevents accounts with the SIGNING_ROLE but not the OWNER role from proposing transactions. This breaks the invariant stated in the documentation.

function proposeTransaction(address to, uint256 value, bytes calldata data)
external
nonReentrant
noneZeroAddress(to)
@> onlyOwner
returns (uint256)
{
return _proposeTransaction(to, value, data);
}

Risk

Likelihood:

  • The current implementation ensures that only the contract owner can propose new transactions, regardless of other signing roles.

Impact:

  • Signing roles lose a fundamental power described in the project's specifications, limiting the decentralization and intended functionality of the multi-signature wallet.

Proof of Concept

function testSigningRoleCanNotPropose() public grantSigningRoles {
vm.prank(SIGNER_TWO);
vm.expectRevert();
multiSigTimelock.proposeTransaction(SPENDER_ONE, OWNER_BALANCE_ONE, hex"");
}

Recommended Mitigation

Change the access control modifier on the proposeTransaction function from onlyOwner to onlyRole(SIGNING_ROLE).

function proposeTransaction(address to, uint256 value, bytes calldata data)
external
nonReentrant
noneZeroAddress(to)
- onlyOwner
+ onlyRole(SIGNING_ROLE)
returns (uint256)
{
return _proposeTransaction(to, value, data);
}
Updates

Lead Judging Commences

kelechikizito Lead Judge
about 1 month ago
kelechikizito Lead Judge 28 days ago
Submission Judgement Published
Invalidated
Reason: Other

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!