Why this category exists separately from SC07 and SC09
Business logic is the most misunderstood category in the OWASP list because it sounds like a catch-all. It is not. OWASP carved it out specifically for design-level flaws that can be exploited even when every individual line passes static analysis. Where SC07 catches a rounding bug and SC09 catches a * that overflows, SC02 catches the case where the math is right but the protocol's economics are wrong.
How the 2025 incidents played out
-
Stream Finance lost $93M, the largest single business-logic incident of the year (cited directly by OWASP's data-sources page).
-
Abracadabra lost $12.9M when GMX V2 CauldronV4 collateral accounting allowed a failed deposit, self-liquidation, and borrowing against "ghost" collateral - the collateral-vs-debt invariant was violated even though every individual check passed.
-
Yearn Finance yETH stableswap lost $9M to a fixed-point solver collapse: an imbalanced add and remove of liquidity minted ~2.35×10^56 tokens against no collateral. Pure design flaw in the curve math.
Why it jumped from #3 to #2
Two reasons. First, the 2025 incident set was disproportionately driven by business-logic bugs at scale (Stream alone is ~10% of the total $905.4M dataset). Second, OWASP expanded the scope of the category to include reward and fee logic, eligibility bypasses, path-dependent state, and cross-module invariant violations - areas that were previously folded into "Logic Errors" but are now explicitly called out.
How AI auditors handle this category
This is the category where AI auditors are weakest. The 2026 benchmarks show frontier LLMs detecting business-logic bugs in roughly 31% of test cases compared to 78% for senior human auditors. The gap exists because business logic requires reasoning about protocol incentives and cross-module state - not pattern matching. Fuzzing tools like Echidna and Medusa close some of the gap on invariant detection, but generating the right invariants still depends on a human's understanding of what the protocol is trying to enforce.