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.