The ProtocolUpgradeHandler
contract lacks a mechanism to expire or cancel proposals that have reached the Ready
state, allowing a malicious executor to indefinitely delay critical protocol upgrades by never executing them.
Once a proposal reaches the Ready
state through either guardian or Security Council approval, it remains in this state indefinitely until executed:
Note that proposal executors are not trusted actors as the can be anybody as set by the creator of the proposal.
Key issues are:
No expiration for proposals in Ready
state
No way to cancel or override a ready proposal
No way to change the executor once proposal is created
No maximum timeframe for execution
A malicious or compromised executor could:
Block critical protocol upgrades indefinitely
Force the protocol to either:
Wait indefinitely for execution
Create a new proposal with a different executor, risking double-execution if the first proposal is eventually executed
Hold the protocol hostage during time-sensitive upgrades
Allow proposals to become outdated or irrelevant while preventing new ones from being proposed
The impact is severe as it could prevent necessary protocol improvements or security fixes from being implemented in a timely manner.
Manual review
Consider Implementing one or more of the following safeguards:
Add an execution deadline after which proposals expire
Allow guardians or Security Council to cancel proposals that have been in Ready
state too long
Allow changing the executor through a governance process if a proposal has been in Ready
state for too long.
Admin input validation, gas, missing events not related to bridges, NATSPEC, spellcheck, Address Zero, Indexed fields in Events, 0 impact, trusted admin/party action https://docs.codehawks.com/hawks-auditors/how-to-determine-a-finding-validity
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.