The report evaluates the design where the perpetual vault is set via the _perpVault parameter in GMXProxy. The concern is that if _perpVault
is assigned an externally owned account (EOA) instead of a properly implemented contract, required callback functions and business logic will be missing, leading to failures during execution.
Design Assumption: The GMXProxy contract expects the perpetual vault to implement various functions (e.g., afterOrderExecution, afterLiquidationExecution, afterOrderCancellation) as defined in the IPerpetualVault interface.
Risk: If an EOA is used for _perpVault, callback calls will fail, resulting in reverted transactions or unexpected behavior.
Implementation Issue: The setPerpVault function does not restrict the type of address passed, hence there's a risk of assigning an EOA inadvertently.
Callback Expectations: During order execution or cancellation, the GMXProxy contract makes external calls to the vault. Without a contract to handle these callbacks, these calls will not execute business logic properly.
Loss of Funds: Failed callbacks could interrupt critical workflow steps like token transfers, potentially leading to locked or lost funds.
System Disruption: The overall logic of GMXProxy might halt or behave erratically if the vault does not respond as expected.
Security Posture: The misconfiguration could be exploited if the vault functionality is assumed during auditing or deployment.
Manual review
Enforce Contract Checks: Implement a validation in setPerpVault to ensure that _perpVault is a contract by using extcodesize
to check for non-zero code size.
Interface Verification: Consider verifying that the provided address supports required functions.
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.