Protocol can be repeatedly gas griefed in AutoRange external call
Lines of code
Vulnerability details
Summary
Revert controlled AutoRange bot can be gas griefed and execute() reverted by malicious onERC721Received implementation
Vulnerability Details
The initiator of a transaction pays the transaction gas; in the case of AutoRange::execute() and AutoRange::executeWithVault(), this will be a Revert controlled bot which is set up as an operator.
Newly minted NFTs are sent to users via NPM::safeTransferFrom() which uses the onERC721Received callback.
An attacker can implement a malicious implementation of this callback; waste all the transaction gas and revreting the function to grief the protocol.
It is expected that the gas spent by bots initiating transactions will be covered by protocol fees; however no protocol fees will be generated from the attacker's position as AutoRange::execute() will not complete; so the protocol will experience a loss.
Furthermore, once attacker has set the token's config from positionConfigs, the protocol has no way to stop the griefing occuring each time the bot detects that the tokenId meets the conditions for a Range Change.
Token Config is only removed from positionConfigs at the end of execute() which the gas grief will prevent from being reached making it a recurring attack.
The only recourse to the protocol is shutting down the contract completely by removing the bot address as an operator and DOSing the contract.
All this makes the likelihood of this attack quite high as it is a very inexpensive attack; user does not even need an open position and loan in the vault. A determined attacker
POC
Attacker would need to create a malicious contract to which they send their NPM NFT.
Via this contract they can then add token config for this NFT to the AutoRange contract via AutoRange::configToken().
The malicious contract would need to have a malicious implementation such as the one below which uses as much gas as possible before reverting.
solidityfunction onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external override returns (bytes4) { uint256 initialGas = gasleft(); uint256 counter = 0; // Loop until only small amount gas is left for the revert uint256 remainingGasThreshold = 5000; while(gasleft() > remainingGasThreshold) { counter += 1; } // Explicitly revert transcation revert("Consumed the allotted gas"); }
Impact
Protocol fees can be completely drained; particularly if a determined attacker sets token configs for multiple NFTs in AutoRange all linked to the same malicious contract.
Lack of fees can DOS multiple functions like the bot initiated AutoRange functions and affect the protocol's profitability by draining fees.
Tools Used
Manual Review Foundry Testing
Recommendations
Enact a pull mechanism by transferring the newly minted NFT to a protocol owned contract such as the AutoRange contract itself from where the user initiates the transaction to transfer the NFT to themselves.
Assessed type
Other
