Root: Proposed transactions have no expiration, cancellation, or rejection mechanism and remain executable indefinitely once created.
Impact: Long-forgotten transactions can be unexpectedly executed in the future — potentially by newly added signers — using current contract funds, causing surprise withdrawals.
Normal Behaviour: Transactions that fail to reach the required confirmation quorum within a reasonable time frame should be considered rejected or expired, preventing future execution.
Issue: In MultiSigTimelock, once a transaction is proposed, it is stored permanently and remains executable as long as:
it eventually reaches the required number of confirmations, and
the timelock period (based on the original proposal time) has elapsed.
There is no mechanism to:
cancel a transaction,
mark it as rejected, or
enforce a maximum lifetime.
As a result, partially confirmed transactions can remain dormant for months or years and later be executed unexpectedly.
Likelihood: Medium
Partially confirmed transactions can easily occur in this system.
Signer sets are expected to change over time.
Impact: High
Long-abandoned transactions can be revived and executed without current signers realising the historical context
Funds intended for future operations are unexpectedly transferred.
Breaks the assumption that unapproved transactions naturally expire.
And in the worst case scenario, let's say the transaction contained malicious calldata in some form, due to which the owner didn't approve it. But now, he can't reject it either; letting enough time for the attacker to somehow reach to those signers and get the confirmation through (either by hacking or force blackmailing)
Well, this worst case might sound hypothetical, but it is indeed possible as well. Cuz when we are aware of some issue, we get rid of it, not keeping the possibility alive for a long time.
Add the following test to test/unit/MultiSigTimelockTest.t.sol. Please also read the comments, as they describe the attack/failure scenario.
Run the test using:
Introduce a mechanism to limit the lifetime of proposed transactions or eradicate stale transactions.
Possible approaches:
Option 1 — Proposal Expiry (Most Preferred)
Enforce a maximum execution window after proposal:
Option 2 — Explicit Cancellation
Allow the owner or a quorum of signers to cancel pending transactions.
Option 3 — Reset on Signer Changes (Least Preferred)
Invalidate all pending transactions when the signer set is modified.
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.