When a signer’s role is revoked, they lose permission to call revokeConfirmation, even for confirmations they submitted while authorized. While this access control is individually reasonable, it causes confirmations to become irreversible after signer rotation, creating operational and governance risks and amplifying stale-approval execution issues.
Normal behavior: Signers are allowed to revoke their own confirmations before a transaction is executed, providing a safety mechanism in case a signer changes their decision or a transaction is later deemed unsafe. This mechanism is intended to support safe governance and flexible decision-making in a multisig environment.
Issue: Once a signer’s role is revoked, they permanently lose the ability to revoke confirmations they previously submitted while authorized. Although this access control is individually logical, it causes prior confirmations to become irreversible after signer rotation, preventing safe cleanup of approvals and amplifying risks related to stale confirmations in changing signer sets.
Likelihood:
Signer rotation (revoking/replacing signers) is a standard operational practice for multisigs (key rotation, compromised signer response, inactivity).
The issue occurs deterministically whenever a signer confirms a tx and is later revoked: revokeConfirmation becomes unavailable due to onlyRole(SIGNING_ROLE).
Impact:
This primarily affects governance/operational flexibility: approvals can become stuck and cannot be withdrawn by the original signer after rotation.
The security impact is mostly indirect and is strongest when combined with Finding #1 (stale confirmations counting toward execution).
Jaust paste in test/unit/MultiSigTimelockTest.t.sol
Allow an account that previously confirmed a transaction to revoke its own confirmation even after its signing role has been revoked. This preserves revokeConfirmation as a safety mechanism during signer rotation while still preventing non-signers from revoking arbitrary confirmations.
Concretely:
replace the external revokeConfirmation access gate from onlyRole(SIGNING_ROLE) to a custom check:
current signers can revoke (as before), and
former signers can revoke only if they had previously confirmed that transaction.
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.