56902 sc high strategy adapter aavev3opusdcstrategy would not work well with atoken rebasing mechanism
Submitted on Oct 21st 2025 at 16:47:14 UTC by @farismaulana for Audit Comp | Alchemix V3
Report ID: #56902
Report Type: Smart Contract
Report severity: High
Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/strategies/optimism/AaveV3OPUSDCStrategy.sol
Impacts:
Permanent freezing of unclaimed yield
Protocol insolvency
Description
Brief/Intro
Strategy implementation of AAVE does not handle the growing/rebase amount of aToken (example: aUSDC). the allocate and deallocate is done in term of USDC and does not consider that the aToken in AaveV3OPUSDCStrategy and other AAVE adapter implementation is rebasing. thus making the rebasing amount stuck inside the strategy.
Vulnerability Details
Morpho VaultV2 have the allocate and deallocate that later would be calling MYTStrategy .
Function allocate would supply the amount provided into AAVE pool, thus receiving aToken.
For deallocate, the strategy would withdraw from AAVE pool, burning the aToken and receive the asset back.
The issue lies in how deallocate can only provide specific amount because in the Morpho VaultV2 deallocateInternal would check the return value of deallocate from adapter and deduct it into its internal cap allocation:
so in this scenario, it is impossible to withdraw more amount than what is used at the allocation call.
consider a scenario where the strategy would deposit 100 USDC into the pool:
MYT VaultV2 calling
allocatewould supply 100 USDC into the pool, in return the strategy receive 100 aUSDCafter some time 100 aUSDC became 105 aUSDC from rebase
now the MYT VaultV2 can only
deallocate100 USDC from the adapter which as shown below would be used to withdraw from the pool 100 USDC amount which in turn would burn same amount of aToken and receive the underlying.
AaveV3OPUSDCStrategy :
this however leaving the Strategy with 5 aUSDC that stuck inside the contract with no way to be used/withdraw.
if for example, the VaultV2 try to withdraw all the aUSDC, it would throw underflow because the allocation check in
VaultV2::deallocateInternal
Impact Details
Loss of AAVE yield of aToken from supplying into the pool.
this is a crucial issue because of how the AlchemistV3 and Transmuter relied on yield generation of strategy to work. if this issue is not fixed, there are potency of protocol breaking.
References
https://github.com/alchemix-finance/v3-poc/blob/a192ab313c81ba3ab621d9ca1ee000110fbdd1e9/src/strategies/optimism/AaveV3OPUSDCStrategy.sol#L38-L51
https://github.com/morpho-org/vault-v2/blob/7c04afc9817e8c1edf548367007cdbdfd9fb2866/src/VaultV2.sol#L604-L610
Proof of Concept
Proof of Concept
there are two scenario here:
where the vault only withdraw the allocated amount and showing that the remaining rebased aToken is left in the contract.
vault try to withdraw all the aToken, which would underflow.
after configuring the .env, apply diff to src/test/strategies/AaveV3OPUSDCStrategy.t.sol
forge test --mt test_strategy_deallocate_rebaseToken
the rebase aToken would stuck inside the strategy with no method to withdraw it. if the vault try to deallocate more amount to account the rebased amount, it would revert.
Was this helpful?