Skip to content

Fix 6 wrong CPE identities, a duplicate WebLogic rule and ProgressBar.js's detection - #511

Merged
enthec-opensource merged 1 commit into
enthec:mainfrom
rvw:fix/cpe-identities
Sep 16, 2026
Merged

enthec-opensource merged 1 commit into
enthec:mainfrom
rvw:fix/cpe-identities

Conversation

@rvw

@rvw rvw commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Summary

I did an analysis on Wappalyzer CPEs and compared them to NVD. Six rules have a CPE that NVD does not file the product's CVEs under, one has a CPE for a different product entirely, two duplicate the same technology, and one rule's pattern matches another product's file. This PR fixes all four, each verified against the current NVD CPE dictionary and CVE data.

Wrong CPE identity

Rule Was Now Why
Angular (a.json) a:angularjs:angular a:angular:angular angularjs:angular is AngularJS in NVD's dictionary (15 names, 0 CVEs). Angular's 24 CVEs, and 1,339 dictionary names from 0.9.0 onward, are filed under angular:angular.
jQuery UI (j.json) a:jquery:jquery_ui a:jqueryui:jquery_ui jquery:jquery_ui has 0 CVEs. jqueryui:jquery_ui has 7: CVE-2010-5312, CVE-2012-6662, CVE-2016-7103, CVE-2021-41182, CVE-2021-41183, CVE-2021-41184, CVE-2022-31160.
Kentico CMS (k.json) a:kentico:kentico_cms a:kentico:xperience kentico:kentico_cms has 3 CVEs, on 5.5 R2 and 8.2. Kentico's current product (Xperience) files its CVEs — 50 of them, 6 CRITICAL, including CVE-2025-2746/2747/32370 — under kentico:xperience.
Plesk (p.json) a:parallels:parallels_plesk_panel a:plesk:plesk parallels:parallels_plesk_panel is the pre-2017 Parallels-era product (48 names up to 11.0.9, 42 CVEs, none on a current release). Current Plesk CVEs (11, mostly on 18.0.x) are under plesk:plesk.
ProfilePress (p.json) a:profilepress:profilepress a:properfraction:profilepress profilepress:profilepress has 0 CVEs. properfraction:profilepress has 35, 4 of them CRITICAL (CVE-2021-34621, CVE-2021-34623, CVE-2021-34624, CVE-2024-9947), across 477 dictionary names.
Transifex (t.json) a:transifex:transifex (removed) This rule reads Transifex Live's JavaScript widget (Transifex.live.lib_version). transifex:transifex names the old desktop app, versions 0.1 to 0.10 — a different product NVD lists 2 CVEs for. There's no NVD product for the JS widget, so the rule is left without a cpe rather than pointing at the wrong one.

Duplicate rule: Oracle WebLogic Server / Weblogic Server

o.json's "Oracle WebLogic Server" has no detection patterns of its own — it's only reached through "Oracle Dynamic Monitoring Service"'s implies — and its cpe is a:bea:weblogic_server, WebLogic's pre-Oracle identity (130 dictionary names up to 10.0, none of its 150 CVEs on a version anyone still runs).

w.json's "Weblogic Server" detects the real Server response header, and had no cpe at all. Current WebLogic CVEs (354, 141 dictionary names) are filed under a:oracle:weblogic_server.

This PR folds the duplicate: "Oracle Dynamic Monitoring Service" now implies "Weblogic Server", "Weblogic Server" gets cpe:2.3:a:oracle:weblogic_server:*:*:*:*:*:*:*:*, and "Oracle WebLogic Server" is removed.

ProgressBar.js detects WordPress's bundled jQuery UI widget

scriptSrc matched any progressbar(.min).js and read a ?ver= query parameter:

"progressbar(?:\.min)?\.js(?:\?v(?:er)?=((?:\d+\.)+\d+))?\;version:\1",
"(?:((?:\d+\.)+\d+)\/)?progressbar(?:\.min)?\.js\;version:\1"

WordPress core registers its bundled jQuery UI progressbar widget at wp-includes/js/jquery/ui/progressbar.min.js?ver=<jquery-ui-version> (currently 1.14.2). Any WordPress site loading that core script gets detected as ProgressBar.js, at jQuery UI's version — not ProgressBar.js's own, which tops out at 1.1.1 (npm, last published 2023).

The patterns now require the package's own hosting:

  • cdnjs: …/ajax/libs/progressbar.js/<version>/progressbar(.min).js — version read
  • npm CDNs (jsDelivr, unpkg): …/progressbar.js@<version>/dist/progressbar(.min).js — version read
  • a self-hosted copy of the npm package: …/progressbar.js/dist/progressbar(.min).js — detected, no version

Tested against 11 URLs (4 legitimate ProgressBar.js CDN/package loads, 2 self-hosted copies, 5 WordPress/unrelated progressbar*.js files) in both JavaScript and Go's RE2 engine: every case matches the intended outcome.

Verification

Ran locally (this repo's CI uses the same scripts under .github/workflows/scripts/):

  • structure_validator.py, order_validator.py, schema_validator.py, category_validator.py, group_validator.py, icon_path_validator.py — pass
  • technology_validator.py for every changed file (a, j, k, o, p, t, w) — pass
  • All 7 changed files parse as valid JSON, and order_validator.py confirms alphabetical technology-name order is preserved in each

….js's detection

NVD files these products' CVEs under a different identity than the rule's cpe carries:

- Angular: angularjs:angular is AngularJS (15 names, 0 CVEs); Angular's 24 CVEs are under
  angular:angular
- jQuery UI: jquery:jquery_ui has 0 CVEs; jqueryui:jquery_ui has 7, including
  CVE-2021-41182/41183/41184 and CVE-2022-31160
- Kentico CMS: kentico:kentico_cms has 3 CVEs on old releases (5.5 R2, 8.2); current Kentico
  (Xperience) CVEs are under kentico:xperience
- Plesk: parallels:parallels_plesk_panel is the pre-2017 Parallels-era product, with no CVE on a
  current release; plesk:plesk has today's CVEs
- ProfilePress: profilepress:profilepress has 0 CVEs; properfraction:profilepress has 35,
  including 4 CRITICAL

Transifex's cpe (transifex:transifex) names the old desktop app, versions 0.1-0.10; this rule
reads Transifex Live's JavaScript widget, which NVD does not list a product for. Dropped rather
than left pointing at the wrong product.

"Oracle WebLogic Server" has no patterns of its own, is reached only through Oracle Dynamic
Monitoring Service's implies, and carries BEA's pre-Oracle identity (bea:weblogic_server: 130
names up to 10.0, none of its 150 CVEs on a current release). "Weblogic Server" detects the real
Server header and had no cpe. Folded the duplicate into it and added its correct identity,
oracle:weblogic_server (354 CVEs).

ProgressBar.js matched any progressbar(.min).js and read ?ver=, so a site running WordPress's
bundled jQuery UI progressbar widget (served at that same file name) was detected as
ProgressBar.js under jQuery UI's version numbers. The patterns now require the package's own
cdnjs, npm-CDN or dist paths.
@enthec-opensource
enthec-opensource merged commit 90ce9a5 into enthec:main Sep 16, 2026
34 checks passed
enthec-opensource pushed a commit that referenced this pull request Sep 16, 2026
…ever carried

These rules detect a real product with a real NVD identity, but have never had a cpe at all, so
no CVE data was ever reachable for them:

- MailChimp for WordPress: detects the mailchimp-for-wp WordPress plugin (wp-content/plugins path,
  the mc4wp JS global). Current CVEs for this plugin are filed under ibericode:mailchimp (4 CVEs,
  142 dictionary names from 2.2 to 4.9.17), not the older mailchimp_for_wordpress_project identity
  a downstream fork's rule once carried.
- Progress MOVEit: the X-Moveitisapi-Version header and the MOVEit Transfer mobile app IDs
  (meta.apple-itunes-app / google-play-app) are Transfer's own signals. NVD files Transfer's CVEs,
  including CVE-2023-34362 and CVE-2024-5806, under progress:moveit_transfer.
- Divi: the WordPress theme/plugin this rule detects (requires: WordPress, the Divi/js/custom.js
  path) has its CVEs filed under elegantthemes:divi (7 CVEs), a different dictionary entry from
  elegant_themes:divi, which has 0.
- UniFi OS: reads unifiConstant.VERSION, which the UniFi Network Application's web UI sets, not
  the consoles' own operating system. NVD files the Network Application's CVEs (9, 73 dictionary
  names from 6.2.23 to 10.5.54) under ui:unifi_network_application; ui:unifi_os names the
  consoles' OS instead (1 CVE, unrelated to what this rule reads).

Follow-up to #511, which corrected 6 rules whose cpe already named the wrong product. Mixpanel is
deliberately not included here: NVD's dictionary has no product for Mixpanel's browser SDK (the
only mixpanel_project:mixpanel entry is an unrelated Drupal module), so there is no identity to
add.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants