The contract's primary security feature is a value-based timelock. According to the README and code, any movement of funds ≥100 must be delayed by 7 days to allow stakeholders to intervene in case of a compromised quorum.
The vulnerability exists because the timelock duration is calculated based on the value of a single transaction rather than the cumulative value of pending or recent transactions.
An attacker (or a compromised quorum of 3 signers) can split a large 100 ETH transfer into 111 smaller transactions of 0.9 ETH each. Since each individual transaction is <1 ETH, the _getTimelockDelay function returns NO_TIME_DELAY, allowing the entire 100 ETH to be drained without the mandatory 7-day waiting period.
Likelihood:
If 3 of 5 signers are compromised (through key theft or collusion), executing this bypass is straightforward and can be automated via scripts.
The cumulative gas cost for multiple small transactions (estimated at 1-2 ETH) is insignificant compared to the potential theft of 100+ ETH.
Impact:
Complete elimination of the 7-day security window, which is the contract's primary defense against malicious quorum actions.
balance within minutes instead of the intended 7-day window, significantly reducing the time available for detection and response.
Run:
Output:
Enforce a minimum timelock delay for all transactions to prevent instant execution through smurfing:
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.