Venus Incident

Venus Incident

Summary#

On February 27, 2025, the wUSDM exchange rate was manipulated on Venus on zkSync.12

The attacker used two accounts to borrow and resupply wUSDM. The attacker then transferred 439,560 USDM directly (donate) to the wUSDM vault, raising the exchange rate from 1.0694 to 1.7641. Through self-liquidation, the attacker gained 86.72 WETH and 55,000 wUSDM.

The incident left Venus with about $902K in bad debt. The net loss after recoveries was about $716K.

Background#

USDM and wUSDM#

USDM is a rebasing stablecoin, which distributes yield by increasing token balances over time.

USDM balance = shares × rewardMultiplier

wUSDM is the non-rebasing share token of an ERC-4626 vault, enabling USDM to be used in DeFi protocols that do not support rebasing tokens. Yield is reflected in the amount of USDM redeemable per wUSDM.3

wUSDM/USD = convertToAssets(1 wUSDM) × USDM/USD

ERC-4626 and Exchange Rate#

Representative operations:

OperationMeaning
deposit()Deposit assets and receive shares
withdraw()Burn shares and withdraw assets
redeem()Burn shares and redeem assets
totalAssets()Assets held by the vault
convertToAssets()Convert shares to an asset amount
previewRedeem()Preview the assets received on redeem

For example, a deposit creates the following state:

Vault totalAssets: 100 USDC
Vault totalSupply: 100 shares
 
1 share = 1 USDC

After a direct transfer of 10 USDC:

Vault totalAssets: 110 USDC
Vault totalSupply: 100 shares
 
1 share = 1.1 USDC

An ERC-4626 vault holds an ERC-20 asset. Anyone can transfer the underlying token directly to the vault without calling deposit(), increasing totalAssets() without minting new shares.

Venus#

Venus allowed wUSDM to be used as both a borrowed asset and collateral. Supplying wUSDM minted vwUSDM, which represented the supplied position.

Venus used convertToAssets to calculate the value of wUSDM. An increase in this value raised both the collateral value and debt value of wUSDM positions.

The wUSDM market used the following risk parameters.4

ParameterValue
Collateral Factor75%
Liquidation Threshold78%
Liquidation Incentive10%
Supply Cap5,000,000 wUSDM
Borrow Cap4,000,000 wUSDM

Self-Liquidation#

On Venus, an external caller triggers liquidation through the Core Pool’s Liquidator contract, repaying part of an undercollateralized account’s debt in exchange for collateral (Of course, only if liquidation conditions are met). In this incident, the attacker controlled both Account A and Account B and used B to liquidate A through this ordinary mechanism; this is referred to here as self-liquidation.

Incident Flow#

Sequence Diagram#

This diagram is reconstructed primarily from the Chaos Labs / Venus Protocol post-mortem 15. The author also used OpenZeppelin’s technical analysis6 to clarify selected intermediate steps. Repeated operations are simplified, and the State A/B snapshots and their balances are derived from the reports.

Preconditions:

  • On February 24, wUSDM supply on zkSync fell from 5.33M to 1.27M, increasing the price impact of a direct donation.1
Unable to render diagram.

Root Cause and Mitigation#

  • Root cause: Venus used the wUSDM convertToAssets() rate without an upside guardrail. A direct USDM transfer increased totalAssets() without minting shares, inflating the value of wUSDM.16
  • Amplifier: Low wUSDM supply on zkSync made the donation effective. The exchange rate increased from 1.0694 to 1.7641, or about 65%.1
  • Mitigation:
    • Cap exchange-rate growth with a CAPO.
    • Pause collateral and borrowing when the exchange rate changes abnormally or vault liquidity becomes too low.
    • Validate the rate against an independent or cross-chain reference.16

Incident Response#

All times are UTC.1

Time (February 27, 2025)Event
03:45The attack transaction was executed.
13:41Venus paused the wUSDM market.
15:24Mountain Protocol burned 8,203 USDM in the wUSDM contract, restoring the exchange rate to 1.067.
15:33Venus set the collateral factor to 0% and the reserve factor to 100%.

Secondary Impact: Arbitrage reduced wUSDM supply on zkSync to below 10K; 575K wUSDM was acquired from SyncSwap and redeemed, and other Venus positions added about $49.6K of bad debt.1

Recovery and Accounting: As of the March 27 post-mortem, Venus had recovered 71.48 ETH and 11,942 wUSDM through liquidation fees. Venus reported $902,159 in outstanding bad debt and a $716,789 net loss after $163,757 in liquidation fees and $21,613 in virtual bad debt.1

References#

Footnotes#

  1. https://community.venus.io/t/post-mortem-wusdm-donation-attack-on-venus-zksync/5004 2 3 4 5 6 7 8 9

  2. https://explorer.zksync.io/tx/0x35a0172fb6bd450ceb29aa67dc85221826dfd0b7528375400b4ccf15c1eed0d8

  3. https://docs.mountainprotocol.com/legacy-docs/usdm-token

  4. https://community.venus.io/t/list-wusdm-to-core-pool-to-venus-on-ethereum-mainnet-arbitrum-optimism-and-zksync/4682/6

  5. https://docs-v4.venus.io/technical-reference/reference-isolated-pools/vtoken/vtoken

  6. https://www.openzeppelin.com/news/erc-4626-tokens-in-defi-exchange-rate-manipulation-risks 2 3