OAK — OnChain Attack Knowledge

Worked example · 2026-08

Moonwell — the same protocol lost money to its price feed for the second time in six months, this time by listing a token thin enough to move by hand — Moonwell / Base — 2026-08-27

Loss
~$8.7M–$9M net (PeckShield, CertiK and ForkLog all land in this band), against $11,028,762 gross borrowed across four markets during the attack window. Assets taken were cbBTC, WETH, USDC and wstETH; 50.6 cbBTC was detected in the first tranche, with the largest single transaction 14.34 cbBTC (~$1.15M). Reported to exceed Moonwell's entire annual protocol revenue. Moonwell's response was to set borrow caps across all Base Core Markets to 1 wei and cut MAMO and WELL supply caps to 1 wei — a full stop, not a parameter adjustment. No compensation plan was announced as of 2026-08-28.
OAK Techniques observed
OAK-T9.001 (Oracle Price Manipulation — primary, confirmed mechanism. Moonwell priced MAMO collateral from instantaneous AMM spot with no TWAP window and no liquidity floor; the attacker traded against MAMO's shallow book, posted the inflated collateral, and borrowed blue-chip assets against it. See techniques/T9.001-oracle-price-manipulation.md). The magnitude of the price move is disputed in public reporting — The Crypto Times reports ~$0.01 → ~$0.43 (~43×, consistent with the "fortyfold" figure carried elsewhere), while other trackers report ~$0.0105 → ~$0.088 (~8×). OAK records the range and treats the gross borrow of $11,028,762 as the reliable magnitude, since it is the same across sources. OAK-T9.002 is not claimed — no flash loan is documented, and the three-hour window argues against one.
Attribution
unattributed. No named individual, group, address cluster, or link to a tracked OAK actor has been published.
Key teaching point
Listing an asset is a security decision with a dollar value attached, and most protocols make it as a growth decision. Nothing in Moonwell's code failed. The contracts read a price, applied a collateral factor, and issued loans exactly as written. The defect was the listing — accepting a token whose order book was shallow enough that the cost of moving its quoted price was far below the value borrowable against it — and the pricing choice that let an instantaneous AMM quote stand in for a valuation. The reusable control is a listing gate expressed in the same units as the risk: before an asset becomes collateral, compute the capital required to move its price by the amount that would make the position profitable, and cap the market's total borrow below that number. A collateral factor cannot do this job, because it scales a price rather than testing whether the price can be bought.

Summary

Moonwell is a Compound-family lending protocol on Base. MAMO is a Base ecosystem token that Moonwell had listed as collateral. MAMO's market was thin, and Moonwell's price feed for it read spot — the instantaneous AMM price, without a time-weighted average or a liquidity sanity check.

Between 06:09:45 and 09:30:13 UTC on 2026-08-27, an attacker traded against MAMO's shallow book to drive its quoted price up, deposited the revalued MAMO as collateral, and borrowed $11,028,762 of cbBTC, WETH, USDC and wstETH across four markets. MAMO's price then fell back toward its real level. Because the collapse happened after the loans were drawn, liquidation had nothing left to seize: by the time the positions were under water, the collateral backing them was worth a fraction of the debt. Net loss settled at roughly $8.7M.

Moonwell stopped the bleeding by taking borrowing on Base to zero — borrow caps on all Core Markets set to 1 wei, and MAMO and WELL supply caps cut to the same. That is a decision to halt the protocol rather than to retune it, and it reflects that no parameter setting fixes a manipulable feed.

Reporting counted this as Moonwell's third security incident of 2026. The second is already in this corpus: on 2026-02-15 a Chainlink OEV wrapper misconfiguration left the cbETH/USD feed missing its conversion multiplier, pricing cbETH at about $1.12 instead of ~$2,200, and liquidation bots seized 1,096 cbETH in four minutes for $1.78M of bad debt (see examples/2026-q1-q2-oracle-price-manipulation-cohort.md). Same protocol, same surface — the price of collateral — and a different root cause each time: in February the feed was misconfigured and reported a wrong price for a sound asset; in August the feed was correct and reported a real price for an asset whose market could be bought.

Timeline (UTC)

When Event OAK ref
(standing) Moonwell lists MAMO as collateral on Base and prices it from instantaneous AMM spot — no TWAP window, no liquidity floor (standing T9.001 surface)
2026-02-15 Prior incident, same surface: cbETH/USD feed misconfiguration prices cbETH at ~$1.12; bots seize 1,096 cbETH in 4 minutes; $1.78M bad debt (T9.001, separate root cause)
2026-08-27 06:09:45 Attack window opens; attacker begins trading against MAMO's shallow book T9.001 manipulation
06:09:45 → 09:30:13 Inflated MAMO posted as collateral; $11,028,762 borrowed across four markets (cbBTC, WETH, USDC, wstETH); first tranche includes 50.6 cbBTC, largest single transaction 14.34 cbBTC T9.001 extraction
shortly after MAMO price collapses back toward its real level; positions are under water with worthless collateral, so liquidation recovers nothing (liquidation defeated by ordering)
2026-08-27/28 Moonwell sets borrow caps on all Base Core Markets to 1 wei; MAMO and WELL supply caps to 1 wei; no compensation plan announced (operator response — full stop)

What defenders observed

  • Liquidation machinery is not a loss control against this ordering. Liquidators are paid to act when a position becomes under-collateralised. Here the position was fully collateralised at the moment of borrowing and only became bad after the price reverted, by which point the collateral was worthless. Liquidation protects against price movement; it does nothing about price manufacture.
  • The distinguishing input is depth, and it is public. Whether a feed can be bought is a function of the asset's order-book depth relative to the borrow it supports. That number is queryable at any block and was not part of Moonwell's risk configuration for MAMO. Every mitigation that would have worked — depth-scaled borrow caps, TWAP with a liquidity floor, or simply not listing MAMO — is downstream of measuring it.
  • A TWAP alone is a speed bump, not a fix. A time-weighted average raises the cost of manipulation roughly in proportion to the window. Against a book this shallow and a three-hour operation, a 30-minute TWAP raises the bill without changing the outcome. The liquidity floor, not the averaging, is the load-bearing part.
  • Repeat incidents on one surface are a governance signal, not bad luck. Moonwell's February loss was a misconfigured feed and its August loss was a manipulable one. Two different defects on the same surface within six months says the collateral-pricing decision process is the thing that needs review, not either individual feed.
  • "Set caps to 1 wei" is the honest admission. The response was to disable borrowing across every Core Market on Base, not to adjust MAMO's parameters. That is an operator concluding it could not enumerate which other listed assets shared the defect — which is itself the argument for a listing gate that produces a number before the asset goes live.

Public references

Discussion

Moonwell and Tectonic happened three days apart and are the same attack. In both cases a lending protocol accepted a token with a shallow market as collateral, priced it from that shallow market, and was drained for the difference between the cost of moving the price and the value of what could be borrowed after moving it. Tectonic's was larger and required a chain rollback to contain (see examples/2026-08-tectonic-tonic-self-collateral-inflation-cronos-state-rollback.md); Moonwell's ran for three hours on Base with no chain-level remedy available and simply ended with borrowing switched off. Two independent protocols, one week, one unexamined listing decision each.

The reason this class persists four years after Mango Markets is that the defence has been framed as an oracle-engineering problem, and it is a listing-policy problem. The oracle literature has produced real improvements — TWAPs, multi-source aggregation, deviation bounds, OEV-aware wrappers — and every one of them makes the feed a more faithful reporter of the market it reads. None of them helps when the market itself is for sale. Moonwell's own February incident is the instructive contrast: that one was an oracle-engineering failure, a missing conversion multiplier, and better oracle engineering is precisely its fix. August's was not, and applying February's lesson to it would have changed nothing.

The metric to carry forward is the one neither incident's reporting supplies directly: cost-to-move versus value-borrowable, per listed asset, at the time of listing and continuously afterwards. It is computable from public data, it is the quantity the attacker actually optimises, and in both August cases it had inverted long before anyone attacked. Contributors documenting future T9.001 collateral cases should record the collateral asset's market depth alongside the loss.

Techniques demonstrated (2)