EVM Vulnerability Taxonomy (jevscan-evm)
September 19, 2026 ยท View on GitHub
A taxonomy for a top-down yes/no classifier. The scanner asks the category question per source file, then runs the detector library. There are 14 categories. The machine-readable version is sources/taxonomy.json: each node has a question (a literal true/false statement about source that states the exploitable impact), sources, and code_patterns.
Tree
- access_control (Access control and privilege): Privileged state changes or fund movements reachable by callers who should not have that power.
- proxy_upgradeability (Proxy, upgradeability, and storage layout): Proxy, clone, and upgrade patterns whose storage, initialization, or upgrade authority can be abused.
- oracle_price_manipulation (Oracle and price manipulation): Prices or exchange rates that attackers can manipulate or that are consumed without validation.
- flash_loan_economic (Flash-loan and economic attacks): Economic mechanisms whose assumptions break when an attacker has large transient capital or multi-step control.
- reentrancy (Reentrancy): External calls that let an attacker re-enter before state is consistent.
- accounting_share_math (Accounting and share math): Internal bookkeeping of deposits, shares, debt, fees, and rewards that diverges from reality.
- arithmetic_precision (Arithmetic and precision): Math errors in rounding, scaling, casting, and overflow that users can exploit.
- signature_replay (Signatures and replay): Off-chain signatures, permits, and meta-transactions that can be forged, replayed, or misused.
- cross_chain_messaging (Cross-chain, bridge, and L2 messaging): Message passing between chains or layers where sender, payload, or delivery is not validated.
- external_call_token_integration (External calls and token integration): Unsafe assumptions about external contracts and tokens: return values, fee-on-transfer, rebasing, approvals, arbitrary targets.
- business_logic_state_machine (Business logic, input validation, and state machine): Protocol rules implemented incorrectly: missing validation, broken state transitions, wrong ordering, or violated invariants.
- dos_griefing (Denial of service and griefing): Ways an attacker can block operations or permanently lock funds, even without profit.
- frontrunning_mev (Front-running, MEV, and randomness): Transaction-ordering dependence, missing slippage/deadline protection, and predictable randomness.
- legacy_low_level (Legacy and low-level EVM pitfalls): Classic EVM hazards: tx.origin auth, delegatecall to untrusted code, selfdestruct, storage/assembly misuse, hash collisions.
Sources and how they were reconciled
- OWASP Smart Contract Top 10 2025 and 2026 (the 2026 list is built from 122 deduplicated 2025 incidents, about $905M in losses): these set the backbone. Access control, oracle manipulation, logic errors, input validation, reentrancy, unchecked external calls, flash loans, arithmetic, insecure randomness, and DoS each map to a category. 2026 adds Proxy & Upgradeability (SC10) and splits Arithmetic Errors (rounding and precision) from overflow (SC07 vs SC09). Both changes are adopted here.
- SWC Registry: deprecated, but it gives canonical IDs for the low-level issues (SWC-101, 104, 105, 106, 107, 109, 112, 113, 114, 115, 116, 117, 120, 121, 122, 124, 128, 133). Most of these fit inside a modern category. The rest go in
legacy_low_level. - DASP Top 10: 2018-era. It confirms reentrancy, access control, arithmetic, unchecked calls, DoS, bad randomness, front-running, and time manipulation. Short addresses and "unknown unknowns" were dropped or folded into other categories.
- Immunefi severity classification: an impact-based system (direct theft, permanent or temporary freezing, protocol insolvency, theft of unclaimed yield, griefing). Every question states one of these impacts, and gas and informational issues are excluded, so a "yes" means something reportable.
- Solodit finding tags and the Cyfrin audit checklists: these supplied audit-frequency detail that the top-10 lists lack. Examples are ERC4626 share inflation, reward accounting, fee-on-transfer and weird ERC20s, slippage and deadline, rounding direction, liquidation logic, and LayerZero/CCIP receivers.
- Consensys smart-contract best practices: known attacks and Trail of Bits (not so) smart contracts plus the ToB token-integration checklist: sources for the reentrancy variants, DoS, front-running, and the
legacy_low_leveland token-integration patterns. - Loss-weighted DeFi data from Halborn Top 100 DeFi Hacks 2025 and the rekt.news and DefiLlama hack lists: these justify making
cross_chain_messaging,accounting_share_math, andflash_loan_economicseparate top-level categories even though no single top-10 list has all three. Bridges and accounting/rounding bugs (for example the 2025 Balancer V2 rounding exploit) account for a large share of losses.
Reconciliation rules:
- Categories are organized by root-cause mechanism, which is what a classifier can see in one file. Impact is not a category; each question states it.
- Overlapping labels were merged. "Logic errors" and "input validation" became
business_logic_state_machine. "Insecure randomness" went underfrontrunning_mevbecause both are ordering and predictability problems. - Off-chain key compromise and phishing cause the largest real losses but are not visible in source code, so they are excluded. On-chain privilege design stays in
access_control. - Known overlaps are deliberate: donatable share-price oracles (oracle vs accounting), liquidation (economic vs logic), and initializers (access control vs proxy). Detectors can hang off either parent.
- Best-practice and informational items have no question, even when a contest rated them Medium. Examples are single-step ownership transfer (a typo'd new owner, with no attacker) and a floating
pragma(a compiler or target-chain choice made at deployment). Neither is an exploitable flaw in the code as written, and a linter finds both deterministically. The Beedle benchmark keeps them in the ground truth (M-6, M-9), so they show as misses there.