When removing a signer:
s_isSigner[_account] = false;
does not clear the address's signature status in past transactions.
Likelihood:
Assumptions:
Initial signers: Alice, Bob, Charlie
REQUIRED_CONFIRMATIONS = 3
Alice initiates transaction #1, which Bob and Charlie have signed but not yet executed.
At this point, the owner calls:
revokeSigningRole(Alice);
A new signer is added:
grantSigningRole(David);
Vulnerability occurs:
Transaction #1 still has 2 confirmations (Bob, Charlie).
Now, it only needs to be signed again by the new signer David, bringing the confirmation count to 3, to execute!
Even if Alice is removed, her confirmation remains valid indefinitely.
An attacker can exploit this method to prematurely confirm sensitive transactions by rotating signers.
Impact:
Abuse of transaction authority: The "old signature" of a revoked signer can still drive transaction execution;
Governance insecurity: This undermines the credibility of multi-signature.
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.