UpgradeBranch.sol does not disable initializers which allows a third party to become the owner of this implementation contract.
UpgradeBranch.sol is one of the implementation contracts that the rootProxy will point to once the rootProxy gets deployed. Since UpgradeBranch.sol does not disable initializers in its constructor, this opens the possibility for a third party to make himself the owner of UpgradeBranch.sol by calling initialize().
The problem here is that the UpgradeBranch itself contains the upgrade logic function:
It executes a delegatecall to any address, which means that the account that takes over the implementation can provide a malicious contract with selfdestruct()and destroy the implementation. The problem here is that the implementation contract itself is used to execute the upgrade logic( UUPS) instead the logic living on the Proxy (Transperent Upgradeable Proxy).
Sad simply, In order for the proxy to upgrade to another contract it relies on the implementation of UpgradeBranch, but if the implementation gets destroyed, there would be no way (no logic) to update to another contract or simply replace it ( as would be possible if the upgrade logic lives in the proxy itself)
Implementation can get destoyed, compromising future updates
Manual Review
Make the following changes to UpgradeBranch.sol :
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.