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 V3arrow-up-right

  • 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:

  1. MYT VaultV2 calling allocate would supply 100 USDC into the pool, in return the strategy receive 100 aUSDC

  2. after some time 100 aUSDC became 105 aUSDC from rebase

  3. now the MYT VaultV2 can only deallocate 100 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 :

  1. this however leaving the Strategy with 5 aUSDC that stuck inside the contract with no way to be used/withdraw.

  2. 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:

  1. where the vault only withdraw the allocated amount and showing that the remaining rebased aToken is left in the contract.

  2. 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?