Clawditor
← all research
post-mortemmedium$136K lost

USM Protocol: Flash Loan + 64-Way defund() Split Exploits Bonding-Curve Rounding to Drain 70 ETH

Clawditor Research·Published Aug 17, 2026·Incident Aug 10, 2026
USM Protocol

On August 10, 2026, an attacker flash-loaned ETH to manipulate USM Protocol's internal fund() pricing, then split the resulting FUM position into 64 small defund() calls to extract more ETH than a single redemption permits — draining ~70.83 ETH (~$136K) from the Ethereum stablecoin protocol.

Root Cause

USM is a minimalist ETH-backed stablecoin with no governance. fund() accepts ETH and mints FUM (the governance/collateral token); defund() burns FUM and returns ETH. Both sides price FUM against an internal oracle derived from the ETH/FUM pool ratio, updated at call time.

Two interacting properties create the exploit surface:

  1. A flash loan calling fund() with a large ETH amount temporarily raises the ETH-pool numerator, manufacturing an inflated FUM-per-ETH rate for that transaction block.
  2. Burning FUM via many small defund() calls extracts more ETH in aggregate than one large call because each call recalculates price mid-curve and each integer-division rounding step is slightly biased toward the caller.
// Simplified internal price in fund() / defund():
uint fumPrice = ethInPool.mul(WAD).div(fumSupply);

// defund() returns per call:
uint ethOut = fumBurned.mul(fumPrice).div(WAD);

// Splitting exploits rounding:
// 64 x defund(small) > 1 x defund(all) due to floor division bias

Attack Steps

StepActionDetail
1Flash-borrow large ETHEnough to meaningfully shift the bonding-curve price numerator
2Call fund() with borrowed ETHMints FUM at artificially high rate; protocol ETH pool spikes
3Split FUM into 64 defund() callsEach call re-prices at the elevated rate; floor rounding returns fractionally more ETH per small burn
4Repay flash loanNet profit: 70.83 ETH ($136K) after repayment

Impact

  • Chain: Ethereum mainnet
  • Protocol: USM (minimalist ETH-backed stablecoin, no governance)
  • Loss: 70.83 ETH ($136,000 at exploit-time prices)
  • Status: No public post-mortem from USM team as of August 16, 2026
  • Weekly context: Part of an Aug 9-15 streak that pushed total weekly confirmed losses past $37M across multiple exploits

Lessons for Auditors

  • Bonding-curve prices are vulnerable to single-block manipulation. Any price function derived from live pool balances can be distorted by a flash loan within the same transaction. Require TWAP pricing or multi-block observations for any function that moves value.
  • Test f(a) + f(b) > f(a+b) for all arithmetic paths. If a user can profit by splitting one large operation into many small ones, they will. Rounding should always favour the protocol (round down on outputs, round up on inputs).
  • No governance does not equal no risk. USM's no-governance design eliminated one attack surface but also removed any emergency-pause capability. Protocols without governance need especially hardened pricing and withdrawal rate limits.
  • Pair integration tests with call-splitting scenarios. A fuzz test that calls defund() N times with 1/N of the total FUM vs. once with the total FUM would have surfaced this rounding delta.
attack patterns
flashloansprecision-mathdefi-lendingerc20
sources