56800 sc medium minimum collateral change lets liquidators seize compliant accounts

#56800 [SC-Medium] Minimum collateral change lets liquidators seize compliant accounts

Submitted on Oct 20th 2025 at 20:10:23 UTC by @pxng0lin for Audit Comp | Alchemix V3arrow-up-right

  • Report ID: #56800

  • Report Type: Smart Contract

  • Report severity: Medium

  • Target: https://github.com/alchemix-finance/v3-poc/blob/immunefi_audit/src/AlchemistV3.sol

  • Impacts:

    • Direct theft of any user funds, whether at-rest or in-motion, other than unclaimed yield

Description

Bug Description

setMinimumCollateralization() in src/AlchemistV3.sol only checks value >= FIXED_POINT_SCALAR. It never validates the stored collateralizationLowerBound. Lowering the minimum below the bound leaves the bound unchanged and liquidate() starts targeting positions that still satisfy the new minimum.

Brief/Intro

Changing the minimum collateralization is enough to put the system in an invalid state. No price move is required; any position sitting between the new minimum and the stale lower bound becomes liquidatable immediately.

Scenario

  • Governance lowers minimumCollateralization from 150% to 105% but leaves collateralizationLowerBound at 110%.

  • A depositor sitting at 130% withdraws until their ratio is 109% (still above the new minimum). In the PoC this leaves the account with ~65.4 MYT shares supporting 60 alTokens of debt.

  • Liquidators call liquidate() and seize the account because 109% is below the unchanged 110% bound. The liquidation drains 60 MYT shares, leaving the user with ~5.4 shares and zero debt.

Details

  • setCollateralizationLowerBound() already enforces value <= minimumCollateralization (src/AlchemistV3.sol:308-314).

  • setMinimumCollateralization() lacks the mirror check (src/AlchemistV3.sol:292-301). Governance can set the minimum below the bound.

  • liquidate() (src/AlchemistV3.sol:786-839) compares ratios only against collateralizationLowerBound. Accounts that satisfy the new minimum but miss the bound are liquidated.

  • There is no event or validation to catch this configuration error.

Impact

  • Forced liquidations: Solvent users lose collateral without a market trigger (e.g., 60 of the remaining 65.4 MYT shares are seized in the PoC).

  • Protocol configuration risk: A single governance action exposes every account.

References

  • src/AlchemistV3.sol

  • interfaces/IAlchemistV3.sol

Proof of Concept

Proof of Concept

  • Create the test file e.g. AlchemistV3CollaterilizationLowB.t.sol in the existing */src/test directory.

  • Add the code below.

  • Run in terminal with command forge t --mt testProxySetupAllowsLiquidationDespiteHigherMinCollateral -vvv

Code

Results:

Was this helpful?