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:
| Operation | Meaning |
|---|---|
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 USDCAfter a direct transfer of 10 USDC:
Vault totalAssets: 110 USDC
Vault totalSupply: 100 shares
1 share = 1.1 USDCAn 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
| Parameter | Value |
|---|---|
| Collateral Factor | 75% |
| Liquidation Threshold | 78% |
| Liquidation Incentive | 10% |
| Supply Cap | 5,000,000 wUSDM |
| Borrow Cap | 4,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 increasedtotalAssets()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:
Incident Response#
All times are UTC.1
| Time (February 27, 2025) | Event |
|---|---|
| 03:45 | The attack transaction was executed. |
| 13:41 | Venus paused the wUSDM market. |
| 15:24 | Mountain Protocol burned 8,203 USDM in the wUSDM contract, restoring the exchange rate to 1.067. |
| 15:33 | Venus 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#
-
https://community.venus.io/t/post-mortem-wusdm-donation-attack-on-venus-zksync/5004 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
https://explorer.zksync.io/tx/0x35a0172fb6bd450ceb29aa67dc85221826dfd0b7528375400b4ccf15c1eed0d8 ↩
-
https://community.venus.io/t/list-wusdm-to-core-pool-to-venus-on-ethereum-mainnet-arbitrum-optimism-and-zksync/4682/6 ↩
-
https://docs-v4.venus.io/technical-reference/reference-isolated-pools/vtoken/vtoken ↩
-
https://www.openzeppelin.com/news/erc-4626-tokens-in-defi-exchange-rate-manipulation-risks ↩ ↩2 ↩3