OMENWAVE

CVE CHAINING · THREAT PATHWAY RESEARCH
← Back to explorer

Methodology & Disclaimer

How Omenwave models plausible chaining potential

Omenwave reasons about how one vulnerability's capabilities could, in principle, satisfy the preconditions of another — drawn entirely from public metadata. This page explains what the tool does, exactly how it decides, how to read its scores, and where its limits are. It is written for defenders.

Methodology v1.3.1 Classification rules v0.1.1 Framing Research & awareness Contains No exploitation detail Updated 2026-10-06
Two versions, tracked separately

The methodology version (this page and the model write-up) is tracked independently of the rule version (RULE_VERSION — the engine's classification and chaining logic). The prose can be corrected without changing scoring, and the scoring can change without rewriting the prose; the changelog records both. This same summary is published in machine-readable form at GET /methodology, so anyone can check our work programmatically.

01What Omenwave is — and is not

Real, comprehensive CVE-A → CVE-B chain data does not exist as a public dataset. Rather than hardcode a handful of famous chains, Omenwave derives an abstract capability profile for every CVE from its published metadata, then reasons about which profiles could fit together. The result is a map of modelled potential: capability logic, not observed activity.

What it is

  • A model of potential chaining pathways, inferred from public CVSS, CWE and CPE metadata.
  • A prioritisation and awareness aid — a way to argue for patching a “minor” CVE by showing what it could unlock.
  • Transparent and versioned: every edge carries a confidence level and a plain-language reason.

What it is not

  • Not a record of confirmed, real-world exploit chains.
  • Not an exploit tool, and it contains no exploitation instructions or how-to-chain guidance.
  • Not proof that any pathway is reachable or practical in a given environment.

Everything Omenwave produces describes attacker position and kill-chain stage in the abstract — “what a step yields” and “what the next step needs” — never technique, payload or procedure.

02Data sources & attribution

Omenwave ingests three public feeds on your own server and stores only their metadata. It transforms that metadata; it does not redistribute the feeds.

SourceUsed forStatus & attribution
NVD 2.0 API
NIST National Vulnerability Database
CVE core record, description, CVSS vector, CWE, CPE (vendor / product). NVD data is produced by a U.S. Government agency and is generally in the public domain. Omenwave does not imply any endorsement by NIST. See nvd.nist.gov for authoritative terms.
CISA KEV
Known Exploited Vulnerabilities
The “seen exploited in the wild” flag and ransomware association. A public catalog published by CISA. Used here as a real-world signal. See cisa.gov.
EPSS
by FIRST.org
A 0–1 probability that a CVE will be exploited in the near term. EPSS is provided free of charge by FIRST.org and is free to use with attribution. See first.org/epss for the current terms.

Where exact licence wording matters for your deployment, treat the official source pages above as authoritative — the descriptions here are factual summaries, not licence terms. Omenwave is an independent research tool and is not affiliated with, sponsored by, or endorsed by NIST, CISA or FIRST.org.

03The capability model

For each CVE, the classification engine (classification.py, rule version v0.1.1) reads the CVSS base vector as its primary signal and uses CWE as an enrichment/override. A CVE with a missing or uninformative CWE still classifies — at lower confidence. The output is a profile with a precondition, a postcondition and a stage.

Which CVSS score is used

A CVE record can carry several CVSS scores. The engine uses one, chosen by a published source policy: CVSS 3.1, then 3.0, then 4.0, then 2.0, preferring NVD’s Primary score within a version. CVSS 3.x comes first because the model’s rules are written in its terms. When only CVSS 4.0 is available it is mapped onto those terms: confidentiality, integrity and availability take the higher of the vulnerable-system and subsequent-system impacts; any subsequent-system impact counts as a scope change; and passive or active user interaction counts as user interaction required.

Machine-readable form: cvss_source_policy in GET /methodology.

Rule versions in the stored corpus

Classification runs when a CVE is ingested, and the result is stored with the rule version that produced it. When the rule changes, every stored classification is recomputed from its stored CVSS and CWE inputs before the next update. That recomputation is a model update, not a change to the CVE, so it never appears in the Newly-Discovered feed. The share of the corpus classified by the current rule is published live at the top of this page and in GET /methodology. An automated behavioural fingerprint of the classifier fails the build whenever classification output changes without a new rule version, so the version label always describes what is served.

Kill-chain stage

Every CVE is placed at one coarse, research-oriented stage. Chaining generally moves forward through them, though the precondition logic — not a rigid stage order — is what actually gates a hop.

RECON→ INITIAL_ACCESS→ EXECUTION→ CRED_ACCESS→ PRIV_ESC→ LATERAL_MOVEMENT→ IMPACT

Access level (attacker position)

An attacker holds a position. A CVE requires a minimum position to be used, and grants a (usually higher) position on success. These sit on a three-rung lattice:

NONE
No prior access — network-reachable, unauthenticated.
USER
User-level / low-privilege authenticated access.
PRIV
Privileged / administrative access.

The requirement (req_access) is derived from CVSS Privileges Required; the requirement's reach (req_vector) from Attack Vector (NETWORK / ADJACENT / LOCAL / PHYSICAL). A step never grants less than it required — it keeps at least the position it started with.

Capability tags

From CVSS impact metrics (confidentiality / integrity / availability), scope change, and CWE, each CVE is tagged with the capabilities it yields:

CODE_EXEC
Can run code in some context (classic full C/I/A impact, or a code-exec CWE).
PRIV_GAIN
Raises the attacker's privilege level (signalled by CVSS scope change crossing a boundary).
AUTH_BYPASS
Bypasses authentication or authorization — becomes at least USER.
CRED_ACCESS
Obtains credential material.
INFO_DISCLOSURE
Reads data it should not (confidentiality impact short of full RCE).
LATERAL
Enables reaching other hosts or services.
TAMPER
Modifies data / integrity without full control.
DOS
Availability impact only.

The granted position follows from the tags: PRIV_GAIN lifts to PRIV; CODE_EXEC yields at least USER, or PRIV when the CVSS scope changed; AUTH_BYPASS yields at least USER. Disclosure tags do not raise the position by themselves — but the material they produce can satisfy a downstream requirement (handled as a credential bridge, below).

Terminal

A CVE is terminal when its capabilities are only DOS and/or TAMPER and it grants nothing beyond what it required. A terminal CVE is an end-state (for example, a pure denial-of-service): it yields nothing to chain forward, so the engine returns no next hops from it.

Classification confidence

How well-supported a profile is, surfaced rather than hidden:

04How a plausible next hop is decided

The chaining engine (chaining.py) proposes a hop A → B under one governing principle:

The rule

A candidate must require something the source provides. B's precondition has to be satisfied by what A grants. A CVE that requires nothing — network-reachable, no privileges — is an independent entry point, not a continuation, so it is never offered as a next hop.

The four bridges

When a source's postcondition satisfies a candidate's precondition, the engine labels why with one of four bridges:

BridgeMeaning
local-presenceThe candidate needs local or physical access; the source already placed the attacker on the system (via code execution or ≥ USER access).
access-levelThe candidate needs USER or PRIV authentication; the source already grants that level or higher.
credentialThe candidate needs authentication; the source disclosed credential material that can provide it.
credential-weakThe candidate needs authentication; the source disclosed information that may contain usable credentials — a weaker, lower-confidence link.

Why front-door → front-door links are excluded

This is a deliberate design choice made for credibility. If a candidate requires nothing to begin with — an unauthenticated, network-reachable vulnerability — then reaching it does not depend on the previous step. Linking two such “front doors” would inflate every graph with coincidences and imply causation where there is none. Omenwave only draws an edge when the earlier step genuinely lowers the bar for the next, so a pathway means something. For the same reason, a hop back to a pure RECON step is never treated as re-entry once a chain has moved past reconnaissance.

Edge confidence

Each proposed edge is scored for logic plausibility (distinct from the classification confidence of the endpoints). Points accrue from four factors, and the total maps to a level:

high — strong, adjacent, well-supported   medium — plausible but with gaps   low — weak or distant

Ranking

Among all satisfied candidates, the engine ranks logic plausibility first, then real-world signal: edge confidence dominates, then CISA KEV membership, then EPSS probability, then CVSS base score, with a small nudge for same-product proximity. The highest-ranked hops surface first.

05Reading the scores

The explorer summarises a traced pathway with three headline figures. Each answers a different defender's question.

Chain Risk0 – 100

A blended index of the whole traced pathway: it weighs the peak CVSS across the chain, the peak EPSS, how far the chain reaches (position gained), its depth, and whether any step is KEV-listed. Read it as relative concern between pathways, not an absolute probability. Bands: Low · Moderate · Elevated · Critical.

Max ReachUSER / ADMIN

The highest attacker position any step in the chain grants. USER means the pathway tops out at user-level access; ADMIN (a PRIV grant) means it models a route to full administrative control. This is the “how bad does it get” figure.

Break-the-chaincount of downstream hops

For any CVE on the pathway, the number of downstream hops that would be severed by patching it. This is the tool's core defensive payoff: it turns a “minor” CVE into a leverage point, showing how much of a modelled pathway a single fix removes. A high number is a strong argument to patch that CVE first.

06Limitations & honest framing

Trust is the whole point of Omenwave: it aims to be a source people can check, not one they must take on faith. That obligates us to be explicit about what the model does not know. Treat every pathway as a hypothesis to investigate, not a finding.

The five points below are the honest framing that governs everything the tool outputs. They are surfaced verbatim, in machine-readable form, at GET /methodology.

Plausible pathways
Not confirmed chains. Every edge is modelled potential — that what one step yields could satisfy what the next step needs — never an assertion that a chain will work, is reachable, or has been observed. The correct reading of any pathway is “worth investigating,” not “this is how you’d be attacked.”
Evidence per edge
Each hop carries a structured, auditable justification: what the source provides, what the destination requires, the bridge that links them, and the confidence factors. The reasoning is shown so it can be checked, disputed, or overridden — not asserted.
Public metadata only
The engine reasons from CVSS, CWE and CPE. It never inspects source code, advisories or exploit behaviour, so it inherits every gap and error in that metadata. Older CVEs (pre-CVSS v3) and those tagged NVD-CWE-noinfo / NVD-CWE-Other classify at lower confidence; some CVEs lack a CVSS vector entirely.
CPE-matching noise
Vendor/product association comes from CPE, which is coarse and sometimes inconsistent across records; same-product proximity — which nudges ranking and edge confidence — can be over- or under-stated as a result. Beyond CPE the engine has no view of your topology, configuration, compensating controls, or whether two vulnerable components can actually reach each other, so a satisfied precondition is a logical fit, not proof of reachability, and not evidence that both CVEs even co-occur in a given environment.
No exploitation detail
The model describes attacker position and kill-chain stage in the abstract only. It contains no technique, payload or procedure, by design. A tidy, high-confidence edge can still be unrealistic in the real world; confidence reflects the model’s internal support, not ground truth. The very detail operational misuse would require is deliberately withheld.

06.5Validation against documented chains

An authority should show its accuracy, not ask for faith. Omenwave is tested against a curated set of documented, public multi-CVE attack chains (ProxyLogon, ProxyShell, ProxyNotShell, OMIGOD, Log4Shell→PwnKit, noPac and more). For each, the harness runs the same classification and chaining logic the live tool uses and asks: does the model reproduce the documented pathway, in the right kill-chain stage order? Full methodology, dataset citations and honest limitations are in the validation report (docs/VALIDATION-REPORT.md).

Loading latest benchmark…

06.6Is confidence calibrated?

Confidence is only worth showing if it tracks reality. Using the same documented-chain benchmark, we ask a sharper question: do edges the model rates with a stronger bridge or higher confidence actually coincide with a documented real-world adjacency more often? A rate here is a calibration signal — how often a modelled edge lines up with a documented link — not a probability that a chain works or is exploited. Live from GET /confidence/calibration.

Loading calibration…

07Intended & responsible use

Omenwave exists to help defenders reason about consequences. Appropriate uses include:

Not for

Omenwave must not be used for targeting, operational attack planning, or any offensive activity. It is a defensive research and awareness instrument. It deliberately withholds the very detail — technique, payload, procedure — that operational misuse would require.

08Disclaimer

Research & awareness only

Omenwave presents modelled plausible chaining potential derived from public CVE metadata (CVSS, CWE, CPE). It is not a confirmed real-world exploit chain and contains no exploitation detail. For research and awareness only.

The tool is provided as is, without warranty of any kind, express or implied, including accuracy, completeness or fitness for a particular purpose. Modelled pathways are hypotheses, not verified attack paths, and must be independently validated before any operational decision.

Omenwave is an independent project and is not affiliated with, sponsored by, or endorsed by NIST, CISA, or FIRST.org. All source data remains subject to its originators' terms; consult the official sources linked above.

Classification and chaining logic are versioned (RULE_VERSION 0.1.1) so that changes to the model are auditable over time. The authoritative rules live in backend/app/classification.py and backend/app/chaining.py, and this methodology is itself versioned (v1.3.1) and published at GET /methodology.

09Versioned changelog

Two version numbers move independently, and every material change is recorded here so the model can be checked against its own history:

Methodology version
This page and the model write-up — prose, framing, limitations, and the published summary.
Rule version
RULE_VERSION — the engine’s classification and chaining logic, the constant defined in classification.py.
MethodologyRuleDateChange
v1.3.1 v0.1.1 2026-10-06 Corrections and model-integrity fixes. No change to classification or chaining logic. (1) Benchmark provenance. The 1.3.0 harness evaluated the 50 benchmark CVEs that have a hand-authored fixture from that fixture, while labelling them as live-corpus data whenever the CVE merely existed in the corpus. The published “70 of 70 resolved from the live corpus” was therefore wrong. The harness now evaluates every CVE in the corpus with the classification the site actually serves. It labels fixture-classified CVEs as fixtures, reports any drift between the served classification and the current rule, and lists where fixtures disagree with NVD. The benchmark figures in section 06.5 are regenerated on that basis and may differ from the 1.3.0 figures. (2) Rule coverage. A rule change used to reach only CVEs that NVD later modified, so stored classifications could stay on an older rule while the site advertised the new one. Stored classifications are now brought onto the current rule before every update, and the corpus share on the current rule is published. (3) CVSS 4.0. Records whose CVSS 4.0 score was read with CVSS 3.x field names lost their impact values and were classified as denial-of-service only. The source policy is now CVSS 3.1 > 3.0 > 4.0 (mapped) > 2.0 (see Which CVSS score is used), and affected records are re-fetched.
v1.3.0 v0.1.1 2026-09-23 Validation benchmark expanded from 25 to 36 documented real-world chains (honest result: 18/36 reproduced fully + 1 partial, edge recall 0.50, stage-order correctness 0.89). The 11 additions are independent of the original set (ArcaneDoor, Accellion/Clop, ZeroQlik, CosmicSting, OWASSRF, Kaseya, Ivanti EPMM/CS 2025, PAN-OS 2025, Mitel MiCollab, Ivanti CSA), each cited to a public write-up; the model reproduced them at the same ~0.50 rate as the original chains — evidence it is not tuned to its examples. Harness: documented chains now resolve each CVE from the live corpus (the data the /next endpoint uses) rather than a hand-authored fixture. No change to classification or chaining logic.
Correction (v1.3.1): the harness change described here was implemented incorrectly. 50 of the 70 benchmark CVEs were still classified from hand-authored fixtures and only labelled as live-corpus data, so the figures in this entry are not live-corpus figures.
v1.2.0 v0.1.1 2026-09-21 Validation benchmark expanded from 7 to 25 documented chains. Classification fix (rule v0.1.1): a CVE granting code execution is now staged EXECUTION before the info-disclosure/RECON fallback, so a co-present info-disclosure tag can no longer mislabel an authenticated code-exec bug as RECON and suppress a legitimate forward edge (repaired the FortiOS and F5 BIG-IP chains; +2 documented-adjacent edges, 0 regressions). Public-surface hardening: stricter throttle on the public write endpoint, generous limit on un-prefixed reads, anti-framing + baseline security headers.
v1.1.0 v0.1.0 2026-09-20 Methodology published as versioned JSON at GET /methodology and surfaced in the UI via a model-version badge. Added this “Limitations & honest framing” section (plausible pathways not confirmed chains; per-edge evidence; public-metadata sourcing; CPE-matching noise; no exploitation detail) and this changelog. No change to classification or chaining logic.
v1.0.0 v0.1.0 2026-01-01 Initial published methodology: the capability model (stages, req_access / req_vector, grant_access, caps vocabulary, terminal), CVSS + CWE derivation, the four bridge rules, edge-confidence scoring, ranking with KEV / EPSS, and the research-and-awareness disclaimer.

The machine-readable form of this changelog — with both version numbers per entry — is served at GET /methodology. When the model or its framing changes, bump the appropriate version, prepend an entry above, and mirror it in the endpoint’s METHOD_CHANGELOG and in docs/METHODOLOGY.md.


← Back to explorer