The KeeperProxy contract's _check()
function relies solely on timestamp validation to prevent stale oracle prices. While the contract checks that the price update timestamp is within an acceptable window, this alone does not guarantee the price data is from the latest oracle round. The absence of roundId
validation means the system could accept stale price data even when the timestamp check passes.
The issue is that updatedAt > block.timestamp - maxTimeWindow[token]
only verifies the age of the price data, not whether it's the latest round available from the oracle.
Use of outdated prices even when newer ones are available
Trading at incorrect prices
Oracle reports price data for roundId N
Network congestion occurs
Oracle updates to roundId N+1
Due to congestion, the node serving the contract is still seeing roundId N
System processes transactions using stale price data from roundId N
Trades execute at incorrect prices
Manual Review
Please read the CodeHawks documentation to know which submissions are valid. If you disagree, provide a coded PoC and explain the real likelihood and the detailed impact on the mainnet without any supposition (if, it could, etc) to prove your point.
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.