When a new vulnerability is published, two questions come first: is it real and serious, and which of my sites run the affected software? OpenWAF answers both. The lookup reads the CVE or GitHub advisory from its public sources (cve.org, CISA KEV, FIRST EPSS, GitHub advisories, NVD). The exposure check compares it with every proxied site of your organization and tells you what the edge already does against it.
Both are read-only and available to every role. A token limited to a client or to a zone only sees its own sites.
Ask
Ask your assistant, for example «Does CVE-2026-111497 affect any of my sites?». It calls two tools:
vuln_lookupwith{"id": "CVE-2026-111497"}: the record, CVSS, affected versions, KEV and EPSS. Ifexistsisfalse, the id is not known to its sources: stop there.vuln_exposurewith{"id": "CVE-2026-111497"}: one row per proxied site, with the match, the confidence, the evidence and the state of the edge mitigation.
openwaf-cloud ctl vulns show CVE-2026-111497
openwaf-cloud ctl vulns exposure CVE-2026-111497Add --json for the full API answer. The token comes from OPENWAF_TOKEN or OPENWAF_TOKEN_FILE.
curl -s "https://dash.openwaf.dev/v1/vulns/CVE-2026-111497" \
-H "Authorization: Bearer $OPENWAF_TOKEN"
curl -s "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/vulns/CVE-2026-111497/exposure" \
-H "Authorization: Bearer $OPENWAF_TOKEN"Ids are CVE (CVE-2026-12345) or GitHub advisory (GHSA-xxxx-xxxx-xxxx) ids, in any case. The full fields are in the API reference.
Read the answer
Each site gets a match, a confidence from 0 to 1 and the evidence behind it:
match | Meaning | confidence |
|---|---|---|
affected | The affected product was seen and its version is inside an affected range. | 0.9 when the version comes from a generator tag or a header; 0.7 when it comes from a ?ver= hint. |
posible | The product was seen, or the site's stack setting says it runs it, but the version is not visible or not comparable. | 0.5 when the product was seen; 0.3 when only the stack setting says so or the homepage could not be read. |
no_detectado | Nothing on the homepage points to the affected product or version. | 0.9 for a WordPress plugin on a site that is not WordPress; 0.8 when the version is outside the range or the CMS or framework was not seen; 0.6 for a WordPress plugin the homepage does not load; 0.5 for server-side products; 0.2 when the site has no fingerprint yet. |
versions lists what was seen (for example {"wordpress": "6.6.2", "plugin:woocommerce": "9.3.1"}), fingerprinted_at when, and fingerprint_via whether the homepage was read through the edge (edge) or from your origin (origin). summary counts the sites per match.
Start with affected, then posible. For each one, check the version on the server itself and patch.
How sites are judged
The check is passive. OpenWAF never scans your sites, sends exploit payloads or crawls pages. It uses two things:
- The site's
stacksetting (wordpress,nextjs,generic,static). - A fingerprint of its homepage, refreshed once a day. The control plane makes one
GET https://<host>/as a visitor, through the edge, with the User-AgentOpenWAF-Fingerprint/1 (+https://openwaf.dev; …). If the edge answers with a challenge, a block or an error (for example in under attack mode), it makes oneGET /to the site's origin with the site'sHostheader instead. Origins on private addresses are never contacted. Redirects are not followed and at most 2 MiB are read.robots.txtis not consulted: it is your own site, the request is a single identified homepage request per day, and it is not crawling.
From the homepage it extracts <meta name="generator"> (WordPress version, WooCommerce, Elementor…), the WordPress core version from its block library and emoji assets, the plugin and theme slugs of /wp-content/plugins/<slug>/ and /wp-content/themes/<slug>/ with their ?ver=, the Server and X-Powered-By headers (CDN and edge servers are ignored), X-Nextjs-* headers and the Next.js (/_next/static/, __NEXT_DATA__) and Nuxt (/_nuxt/, __NUXT__) markers. Next.js, Nuxt and Express imply Node.js.
The vulnerability is matched by product:
- WordPress plugins and themes by their wordpress.org slug, taken from the record's package or from its Wordfence, Patchstack, WPScan or wordpress.org references.
- Other products by name or CPE product: WordPress, Next.js, Nuxt, Express, Node.js, PHP, nginx, Apache HTTP Server, LiteSpeed, OpenResty, IIS, Caddy, Drupal, Joomla and others.
Version ranges are compared when they can be parsed (CVE JSON 5 ranges, GHSA ranges such as >= 1.0, < 1.2.1, NVD CPE ranges).
Limits
no_detectadodoes not mean «not affected». It means the homepage shows nothing that matches. A server-side library, a backend behind the site or a component that leaves no trace in the HTML is invisible to this check.?ver=is a hint. Plugins often use their own version there, but not always; a?ver=equal to the WordPress version is ignored.- Plugins that only load in
/wp-adminare invisible. The homepage only shows the plugins that load on it. - A new site has no fingerprint until the next daily run (
fingerprinted_at: null, confidence 0.2).
Tip: set the site's stack setting (stack=wordpress, stack=nextjs). Sites whose homepage cannot be read, or that hide their technology, then still count as posible for vulnerabilities of that stack. In the dashboard: Security → Firewall → Application; with the CLI:
openwaf-cloud ctl zones set example.com stack=wordpress --reason "WordPress site"Edge mitigations
When the edge has a protection for a vulnerability, the answer lists it in mitigations and shows its state on each site. For CVE-2026-111497 (Node2Shell), the edge has shield 1009 «Brotli Request Body», which refuses request bodies with Content-Encoding: br, and every Node.js backend is flagged posible. Each site's mitigations[].state is:
state | Meaning |
|---|---|
active | The shield blocks on this site. |
log_only | The WAF is in log mode: the shield only records, requests reach the origin. |
off | The WAF is off: the shield doesn't run. |
exempt_paths | A WAF exception for rule 1009 switches it off on the paths in exempt_paths. |
An edge mitigation reduces the risk; it doesn't patch your servers. Patch them as the advisory says.