The _validatePrice() function in KeeperProxy relies on Chainlink price feeds to validate market prices before executing keeper actions. However, the function only enforces a user-defined maxTimeWindow for price freshness, rather than ensuring the price is recent at execution time. This allows a whitelisted keeper to submit a stale but technically valid price if the Chainlink oracle lags behind market conditions. To add, _check() compares each price independently without ensuring logical price relationships (e.g long vs. short token consistency), making it possible to execute trades at manipulated min/max price bounds. Attackers can exploit this by observing price swings and executing trades at an outdated, artificially favorable price before the oracle updates. For example:
This check only verifies the price is within an arbitrary owner-defined window rather than ensuring it is fresh (e.g., within 1 minute), allowing attackers to trade using delayed pricing.
Attackers can profit from executing trades at outdated prices, leading to arbitrage opportunities that drain protocol funds when oracle delays occur.
Enforce a stricter price freshness check by requiring that the Chainlink price update occurred within the last minute before execution (block.timestamp - updatedAt < 60).
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.
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. Keepers are added by the admin, there is no "malicious keeper" and if there is a problem in those keepers, that's out of scope. ReadMe and known issues states: " * System relies heavily on keeper for executing trades * Single keeper point of failure if not properly distributed * Malicious keeper could potentially front-run or delay transactions * Assume that Keeper will always have enough gas to execute transactions. There is a pay execution fee function, but the assumption should be that there's more than enough gas to cover transaction failures, retries, etc * There are two spot swap functionalies: (1) using GMX swap and (2) using Paraswap. We can assume that any swap failure will be retried until success. " " * Heavy dependency on GMX protocol functioning correctly * Owner can update GMX-related addresses * Changes in GMX protocol could impact system operations * We can assume that the GMX keeper won't misbehave, delay, or go offline. " "Issues related to GMX Keepers being DOS'd or losing functionality would be considered invalid."
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.