All vulnerabilities
CRITICALWeb3exploited in the wild

WEB3-KILOEX-2025

Web3 · Multichain · KiloEx (perpetuals DEX price feed)

Summary

On April 14, 2025 the perpetuals DEX KiloEx lost about $7.5 million across BNB Chain, Base, opBNB, and Taiko to what was reported as oracle price manipulation but was really an access-control failure. KiloEx's price feed (KiloPriceFeed.setPrices) was meant to be reachable only through a keeper-gated call chain, but the top-level MinimalForwarder.execute function was publicly callable and validated an attacker-supplied signature against attacker-supplied data, letting anyone forge a trusted call that reached setPrices and write an arbitrary price. The attacker set a market price far below true value, opened a leveraged position, then set the price far above value and closed it in the same flow, extracting fabricated profit from the vault; the sequence was repeated across all four chains, with a single transaction netting $3.12M. Reporting that framed it as flash-loan oracle manipulation was imprecise: no market liquidity was moved, the price was simply written directly through the unprotected forwarder. After KiloEx offered a 10% (~$750K) whitehat bounty and no legal action, the attacker returned essentially all of the funds by April 18, 2025.

How to avoid it in your code

  • Restrict every oracle/price-setting function to an explicit keeper or owner role checked on msg.sender; never leave a forwarder or relayer path open.
  • Validate meta-transaction forwarders so a caller cannot supply an arbitrary from address or self-signed payload to impersonate a privileged caller.
  • Bound and sanity-check submitted prices for deviation and staleness, and reject values outside a plausible range.
  • Apply least privilege across the whole call chain so no single unprotected entry point can reach a sensitive setter.
  • Monitor price updates and large position open/close pairs within one transaction, with a tested pause path.

References

Related vulnerabilities

All Web3 →