Hi,
I have found out a potential vulnerability in the contract 'ScrvusdVerifierV1.sol' in which timestamp dependency issue occurs due to loss of validtion in parameter last_profit_update
.
The key details of this potential vulnerability can be given as follows:
In this potential bug, the verifyScrvusdByStateRoot
function uses last_profit_update
parameter (params[5]
) as surrogate to block.timestamp
and this value is then passed to IScrvusdOracle
for price updates. Due to no validation check for the last update, it can lead to the manipulation in price update for users.
If last_profit_update
value is manipulated (due to invalid proof or bug), then price update based on incorrect timestamp gives incorrect results.
Manual Code Analysis
Add validation checks for the last_profit_update
value, i.e. closely to block.timestamp
:
Use block.timestamp
instead of last_profit_update
if possible, it's more reliable source time.
- See [here]([https://github.com/CodeHawks-Contests/2025-03-curve?tab=readme-ov-file#blockhash-oracle)](https://github.com/CodeHawks-Contests/2025-03-curve?tab=readme-ov-file#blockhash-oracle) on how it is used to verify storage variable - All state roots and proofs must be verified by the OOS `StateProofVerifier` inherited as `Verifier` (where the price values and params are extracted), so there is no proof that manipulating timestamp/inputs can affect a price update - It is assumed that the OOS prover will provide accurate data and the OOS verifier will verify the prices/max unlock time to be within an appropriate bound/values - There is a account existance check in L96 of `ScrvusdVerifierV1.sol`, in which the params for price updates are extracted from
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.