DeFiFoundry
50,000 USDC
View results
Submission Details
Severity: low
Invalid

Complete ETH withdrawal in GmxProxy::withdrawEth breaks contract operations

Summary

GmxProxy::withdrawEth allows the contract owner to withdraw all ETH from the contract, even though the contract needs to keep some ETH to work properly. This breaks future transactions because the contract won't have enough ETH to pay for gas fees.

Owner calls withdrawEth, and the contract doesn't work from now.

Vulnerability Details

  • The contract has a minimum ETH amount (minEth) set to 0.002 ETH

  • This minimum amount is needed to pay for transaction fees

  • But the withdrawEth() function lets the owner take out all ETH

  • This leaves the contract with zero ETH, making it unable to process new orders

Impact

  • If all ETH is withdrawn, the contract can't process new orders

  • Users' transactions will fail due to insufficient ETH for fees

  • Contract becomes unusable until someone adds more ETH

Tools Used

Manual Review

POC

add this test in the KeeperProxy.t.sol file, also add a receive function and make the test_CancelDeposit visibility to public

function test_proxyWithdraw() public {
address gmxProxy = address(PerpetualVault(vault).gmxProxy());
uint256 initialBalance = gmxProxy.balance;
console.log("Initial Balance:", initialBalance);
address owner = GmxProxy(payable(gmxProxy)).owner();
vm.prank(owner);
uint256 withdrawnAmount = GmxProxy(payable(gmxProxy)).withdrawEth();
assertEq(gmxProxy.balance, 0);
assertEq(initialBalance, withdrawnAmount);
// the below test fails, due to no ETH for gas
test_CancelDeposit();
}

Recommendations

function withdrawEth() external onlyOwner returns (uint256) {
uint256 balance = address(this).balance;
require(balance > minEth, "insufficient balance");
uint256 withdrawAmount = balance - minEth;
payable(msg.sender).transfer(withdrawAmount);
return withdrawAmount;
}
Updates

Lead Judging Commences

n0kto Lead Judge 5 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
Assigned finding tags:

Admin is trusted / Malicious keepers

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."

Appeal created

hi_there Submitter
5 months ago
0xl33 Auditor
5 months ago
n0kto Lead Judge
5 months ago
n0kto Lead Judge 4 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
Assigned finding tags:

Admin is trusted / Malicious keepers

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."

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.