The setUpdateWeightRunnerAddress
function in QuantAMMWeightedPool allows changing the UpdateWeightRunner contract address, but the pool has no way to set rules on the new contract since _setRule()
is only callable during initialization. This is particularly problematic because UpdateWeightRunner maintains multiple pool-specific mappings keyed by msg.sender.
The vulnerability exists because:
1- UpdateWeightRunner
mappings keyed to msg.sender
(pool address):
2- Rules are set through _setRule()
which is only called during initialize()
function with initializer modifier
3- When setUpdateWeightRunnerAddress()
changes the UpdateWeightRunner
:
The pool has no mechanism to call setRuleForPool()
on the new contract since:
_setRule()
is locked behind initializer
No other function exists to set rules post-initialization
Since the pool can't call setRuleForPool()
, then the new UpdateWeightRunner
contract will have no way to interact or call the pool since almost in every action to a pool, it uses the variables from the mappingsrules
or poolRuleSettings
etc ,for example:
When UpdateWeightRunner
address is changed:
Pool becomes permanently unable to update weights since:
Rules cannot be set on new contract
All pool configurations are lost (rules, oracles, settings)
Only the pool itself can set its configurations (msg.sender mappings)
No post-initialization setting mechanism exists
Core pool functionality is broken
Manual code review
Add a new function to allow setting rules after UpdateWeightRunner
changes:
Likelihood: Low, when setting a new UpdateWeightRunner (for hotfixes) Impact: High, DoS performUpdate and force redeployment
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.