Root: Revoking a signer through MultiSigTimelock::revokeSigningRole does not invalidate or remove their existing confirmations from pending transactions.
Impact: Transactions can be executed using approvals from accounts that are no longer authorised signers, violating the multisig security model.
Normal Behaviour: Once a signer is removed, their authority should be fully revoked, meaning any prior confirmations they provided should no longer count toward the execution quorum.
Issue: When a signer gets revoked via revokeSigningRole, the contract:
removes the signer role,
but does not clear the signer's previous confirmations, and
does not update the cached confirmation count for existing transactions.
As a result, confirmations from revoked signers remain valid and can still be used to reach the quorum for execution.
Likelihood: Medium
Signer revocation is a supported and expected administrative action.
Pending transactions may already contain confirmations from the revoked signer
Impact: High
Transactions can be executed based on approvals from unauthorised (revoked) signers.
Breaks the core multisig invariant that only current signers can authorise execution.
Undermines trust in signer revocation as a security control.
Please add the following test to test/unit/MultiSigTimelockTest.t.sol:
Run the test using:
Logs:
When revoking a signer, the revokeSigningRole function can also iterate over pending transactions, and:
remove their signature, and
decrement the confirmation count accordingly.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.