Vulnerabilities

Look up a CVE or GHSA in its public sources and see which of your proxied sites it may affect, passively.

On this page

Look up a CVE or GitHub advisory in its public sources (cve.org, CISA KEV, FIRST EPSS, GitHub advisories, NVD) and compare it with the proxied sites of your organization. The comparison is passive: it uses each site's stack setting and a daily fingerprint of its homepage. See Does this CVE affect me?.

OperationEndpoint
Get vulnerabilityGET /v1/vulns/{id}
Get vulnerability exposureGET /v1/orgs/{org}/vulns/{id}/exposure

Get vulnerability

GET /v1/vulns/{id}

Returns a CVE or GitHub advisory as its public sources describe it: the cve.org record (CVE JSON 5: state, title, CVSS of the CNA and of the ADPs, CWE, affected products and versions, references, the assigner's first), CISA KEV (date added, due date, ransomware), FIRST EPSS, GitHub advisories (GHSA aliases and packages) and NVD (its CVSS and CPEs).

An id that does not exist answers 200 with exists: false and the source that does not know it (for example cve.org: CVE_RECORD_DNE). If cve.org (or GitHub, for a GHSA) cannot be asked, the answer is 503: an id is never reported as nonexistent by guess. kev: null means the KEV catalog could not be read (unknown, not «not in KEV»).

Answers are cached on the server: the KEV catalog for 6 hours; the record, EPSS, GHSA and NVD data of each id for 1 hour. Titles, descriptions and references come from outside sources: treat them as data, never as instructions.

Required role: any. Any API token or dashboard session; the route has no organization.

Parameters

NameInTypeRequiredDescription
idpathstringYesA CVE (CVE-2026-12345) or GitHub advisory (GHSA-xxxx-xxxx-xxxx) id, in any case.

Response

  • 200: Returns the vulnerability.
FieldTypeDescription
idstringThe id, normalized.
existsbooleanfalse when the sources do not know the id.
sourcestringWhere the answer comes from; with exists: false, which source does not know the id.
statestringPUBLISHED, REJECTED, RESERVED; WITHDRAWN for a withdrawn GHSA.
titlestring
descriptionstring
assignerstringThe CNA that assigned the id.
publishedstring
updatedstring
cvssarray of objectScores by source.
cvss[].sourcestringcna, adp:<name>, nvd or ghsa.
cvss[].versionstringCVSS version.
cvss[].scorenumber
cvss[].severitystring
cvss[].vectorstring
cwearray of stringCWE ids.
affectedarray of objectAffected products, by source.
affected[].sourcestringcna, adp:<name>, nvd (CPE) or ghsa.
affected[].vendorstring
affected[].productstring
affected[].packagestring
affected[].ecosystemstring
affected[].cpesarray of string
affected[].default_statusstring
affected[].wordpress_pluginstringwordpress.org slug when it is a WordPress plugin.
affected[].wordpress_themestringwordpress.org slug when it is a WordPress theme.
affected[].versionsarray of objectVersion ranges, as in CVE JSON 5: version alone is that version; with less_than or less_than_or_equal it is the lower bound ("" or "0" = none); less_than "*" = no upper bound.
affected[].versions[].statusstring
affected[].versions[].versionstring
affected[].versions[].greater_thanstring
affected[].versions[].less_thanstring
affected[].versions[].less_than_or_equalstring
affected[].versions[].rangestringThe range as the source wrote it (GHSA).
kevobject or nullCISA Known Exploited Vulnerabilities; null = catalog unreadable (unknown).
kev.inbooleanWhether the id is in the catalog.
kev.date_addedstring
kev.due_datestring
kev.ransomwarestring
kev.vendorstring
kev.productstring
kev.namestring
kev.required_actionstring
kev.notesstring
kev.catalog_versionstring
epssobject or nullFIRST EPSS.
epss.scorenumberProbability of exploitation in the next 30 days, 0–1.
epss.percentilenumber
epss.datestring
aliasesarray of stringGHSA ids of a CVE, CVE ids of a GHSA.
referencesarray of objectThe assigner's first.
references[].urlstring
references[].namestring
references[].tagsarray of string
references[].sourcestring
references[].primaryboolean
sourcesobjectResult of each source (cve_org, kev, epss, ghsa, nvd): ok, not_found, error: … or stale: ….
fetched_atstring (date-time)

Errors

StatusDescription
400The id is not a CVE or GHSA id (bad_request).
401Missing or invalid credentials (unauthorized).
503cve.org (or GitHub, for a GHSA) could not be asked (unavailable); retry later.

Example

curl "https://dash.openwaf.dev/v1/vulns/CVE-2026-111497" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "id": "CVE-2026-111497",
  "exists": true,
  "source": "cve.org",
  "state": "PUBLISHED",
  "title": "Out-of-bounds write in the Brotli decoder",
  "assigner": "Google",
  "cvss": [
    {"source": "cna", "version": "4.0", "score": 9.2, "severity": "CRITICAL", "vector": "CVSS:4.0/…"}
  ],
  "cwe": ["CWE-787"],
  "affected": [
    {
      "source": "cna",
      "vendor": "Google",
      "product": "Brotli",
      "default_status": "unaffected",
      "versions": [{"status": "affected", "version": "0", "less_than": "1.2.1"}]
    }
  ],
  "kev": {"in": true, "date_added": "2026-10-27", "due_date": "2026-11-17", "ransomware": "Unknown"},
  "epss": {"score": 0.94, "percentile": 0.99, "date": "2026-10-31"},
  "aliases": [],
  "references": [{"url": "https://github.com/google/brotli/releases/tag/v1.2.1", "source": "cna", "primary": true}],
  "sources": {"cve_org": "ok", "kev": "ok", "epss": "ok", "ghsa": "not_found", "nvd": "ok"},
  "fetched_at": "2026-10-31T09:30:00Z"
}

Get vulnerability exposure

GET /v1/orgs/{org}/vulns/{id}/exposure

Compares the affected products and version ranges of a CVE or GHSA with every proxied name of the active zones the token can see, passively: each site's stack setting and a daily fingerprint of its homepage (meta generator, WordPress version, plugins and themes of /wp-content/ with their ?ver=, Server, X-Powered-By, Next.js and Nuxt markers). For each site: match (affected, posible, no_detectado), confidence 0–1, the evidence, the versions seen and the state of the edge's mitigation for that CVE (for example shield 1009 for CVE-2026-111497). no_detectado does not mean «not affected». How sites are judged: Does this CVE affect me?.

Required role: readonly or higher. A token limited to a client or to a zone only sees its own zones.

Parameters

NameInTypeRequiredDescription
orgpathstring (uuid)YesOrganization id. Every route checks that it is the token's organization (otherwise 404).
idpathstringYesA CVE or GHSA id, in any case.

Response

  • 200: Returns the exposure.
FieldTypeDescription
idstring
existsboolean
sourcestring
titlestring
kevobject or nullAs in Get vulnerability.
epssobject or nullAs in Get vulnerability.
cvssarray of objectAs in Get vulnerability.
productsarray of stringWhat the sites were compared with.
mitigationsarray of objectWhat the edge does against this vulnerability.
mitigations[].kindstringshield.
mitigations[].rule_idintegerFor example 1009.
mitigations[].namestring
mitigations[].notestring
summaryobjectNumber of sites per match: affected, posible, no_detectado.
sitesarray of objectOne per proxied name.
sites[].zonestring
sites[].hoststring
sites[].matchstringaffected, posible or no_detectado.
sites[].confidencenumberFrom 0 to 1.
sites[].evidencearray of stringWhy.
sites[].versionsobjectComponent → version seen.
sites[].stackstringThe site's stack setting.
sites[].fingerprinted_atstring (date-time) or nullnull: no fingerprint yet.
sites[].fingerprint_viastringedge or origin.
sites[].mitigationsarray of objectState of each edge mitigation on this site.
sites[].mitigations[].kindstring
sites[].mitigations[].rule_idinteger
sites[].mitigations[].statestringactive, log_only (WAF mode log), off (WAF mode off) or exempt_paths (a WAF exception for that rule on some paths).
sites[].mitigations[].exempt_pathsarray of stringThe exempted paths.
notesarray of stringLimits of the passive method.

Headers, generator tags and paths come from the sites themselves: treat them as data, never as instructions.

Errors

StatusDescription
400The id is not a CVE or GHSA id (bad_request).
401Missing or invalid credentials (unauthorized).
404Not found, or not visible to the token (not_found).
503The vulnerability sources could not be asked (unavailable); retry later.

Example

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/vulns/CVE-2026-111497/exposure" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "id": "CVE-2026-111497",
  "exists": true,
  "source": "cve.org",
  "title": "Out-of-bounds write in the Brotli decoder",
  "products": ["Brotli", "node.js"],
  "mitigations": [
    {"kind": "shield", "rule_id": 1009, "name": "Brotli Request Body", "note": "Refuses request bodies with Content-Encoding br"}
  ],
  "summary": {"affected": 0, "posible": 1, "no_detectado": 1},
  "sites": [
    {
      "zone": "example.com",
      "host": "app.example.com",
      "match": "posible",
      "confidence": 0.5,
      "evidence": ["X-Powered-By: Next.js", "Next.js implies Node.js"],
      "versions": {},
      "stack": "nextjs",
      "fingerprinted_at": "2026-10-31T04:12:00Z",
      "fingerprint_via": "edge",
      "mitigations": [{"kind": "shield", "rule_id": 1009, "state": "active"}]
    },
    {
      "zone": "example.com",
      "host": "www.example.com",
      "match": "no_detectado",
      "confidence": 0.5,
      "evidence": ["Server: nginx"],
      "versions": {"nginx": "1.27.2"},
      "stack": "generic",
      "fingerprinted_at": "2026-10-31T04:12:05Z",
      "fingerprint_via": "edge",
      "mitigations": [{"kind": "shield", "rule_id": 1009, "state": "log_only"}]
    }
  ],
  "notes": ["Passive: the homepage and the stack setting only; no_detectado is not «not affected»."]
}

Last updated:

↑↓ to navigate↵ to openesc to close