NMS-20181: Dependency updates for core/web-assets, August 2026 - #8767
Merged
synqotik merged 6 commits intoAug 10, 2026
Merged
Conversation
synqotik
marked this pull request as ready for review
August 10, 2026 15:54
marshallmassengill
previously approved these changes
Aug 10, 2026
Contributor
There was a problem hiding this comment.
LGTM!
Minor findings for some future thing to look at. Would merge without any of these:
- uuid@<4: ^11.1.1 leaves request non-loadable. request@2.88.2's lib/{auth,oauth,multipart}.js all do require('uuid/v4'); that subpath was removed in uuid 7 and uuid 11.1.1's exports map only declares . and ./package.json. Verified: ERR_PACKAGE_PATH_NOT_EXPORTED: Package subpath './v4' is not defined. request@2.88.2 is the override's only consumer, and phantomjs-prebuilt is request's only consumer, so nothing loads it today (there's no pnpm.onlyBuiltDependencies, so pnpm 10 runs no install scripts). Net: a CVE row traded for a latent module-resolution failure.
- The real fix for that cluster is deleting phantomjs-prebuilt. It's a dead devDependency: no karma, tests are jest + jsdom, and nothing in src/, pom.xml, or webpack.config.js references it. Dropping it removes request and with it uuid@3, form-data@2, tough-cookie, sshpk, http-signature, hoek, stringstream, qs, extend, har-validator, lets you delete ~6 overrides, and retires the "request 6.1 / not fixed" row outright.
- tar: ^7.5.21 is also inert. cacache@15.3.0 declares tar: ^6.0.2 but has zero require('tar') anywhere in its JS. Keep it (it undoes an override that was actively forcing tar down to 4.4.19, which is the real find here), but the body's "Transient (cacache via copy-webpack-plugin / terser-webpack-plugin)" implies a live code path that doesn't exist.
- loader-utils scope claim is understated. Four packages resolved 0.2.17, not one: string-replace-webpack-plugin@0.1.3 plus the css-loader@0.9.1 / file-loader@0.8.5 / style-loader@0.8.3 it declares as deps. All four moved to 1.4.2. Outcome is still fine (see Cleared), but "the only vulnerable copy" isn't accurate.
- ip-address 10.2.0 → 10.5.0 changes released validation behavior. Probed 24 inputs across both versions; exactly one delta: leading-zero IPv4 octets now throw. 010.1.1.1, 1.2.3.04, 01.02.03.04 flip from valid to invalid. That feeds isValidIPAddress in admin/newInterface.jsp, admin/discovery/add-{specific,er,ir}.jsp, buildPathOutage.jsp, setPathOutage.jsp, and requisition constraints. 10.2.0 shipped in opennms-36.0.2-1, so this is a change to released behavior and belongs in the description. It's hardening (ambiguous octal), but note Java's InetAddress reads 010.1.1.1 as decimal 10.1.1.1, so the UI now rejects what the backend accepts.
- checkIpRange is broken for IPv6, and the test suite can't see it. Address6#bigInt() returns a native BigInt, so b.bigInt().compareTo(a.bigInt()) throws TypeError on both 10.2.0 and 10.5.0. Not a regression (predates this PR, back to the ip-address 9 move off jsbn), but add-er.jsp / add-ir.jsp range validation is dead for IPv6 and ipaddress.test.js only covers an IPv4 range, so "169 tests passing" doesn't touch it.
- TypeScript 6.0 buys nothing on a release branch. No script runs tsc; webpack transpiles via babel and there's no ts-loader, so "build passes" doesn't exercise the compiler. Actual consumers are ts-jest (peer >=4.3 <7, fine) and @typescript-eslint 7.18.0, whose SUPPORTED_TYPESCRIPT_VERSIONS is >=4.7.4 <5.6.0 and which was already out of range at 5.9.3. So nothing newly breaks, but a compiler major on release-36.x with a linter three majors behind is risk without payoff; the change that would actually help is @typescript-eslint 8.x on develop.
- .node-version still says 16.15.1 while engines says >=22 and tar@7 requires >=18. Maven pins nodeVersion v22.22.2 so CI is unaffected; local nvm/fnm users land on a Node the tree no longer supports. Cheap drive-by fix.
- ^ ranges on CVE pins drift. The body itself records two overshoots (@babel/core 7.29.6→7.29.7, ip-address 10.3.1→10.5.0), and install-deps is pnpm install --prefer-offline with no--frozen-lockfile, so a non-CI build can silently re-resolve past what was tested.
Contributor
Author
|
@marshallmassengill thanks, some of these seem valid, going to do another pass. |
TypeScript 6.0 buys nothing here: no script runs tsc (webpack transpiles via babel), and @typescript-eslint 7.18.0 on this branch supports <5.6.0 — a compiler major on release-36.x is risk without payoff. The TS 6 bump belongs on develop together with @typescript-eslint 8.x. 169 jest tests pass after the revert.
checkIpRange's IPv6 branch called compareTo() on a native BigInt (jsbn was dropped in ip-address 9), throwing TypeError and silently bypassing the range validation in add-er.jsp/add-ir.jsp for IPv6. Compare with >= like the IPv4 branch. Predates this PR. Also pin ip-address 10.5.0's new rejection of leading-zero IPv4 octets (ambiguous: octal to C parsers, decimal to Java) with explicit tests, and cover inverted and mixed-family ranges.
Was 16.15.1 while engines requires >=22, tar@7 requires >=18, and the Maven build pins v22.22.2 — aligns local nvm/fnm users with CI.
Nothing uses it: tests are jest + jsdom, there is no karma, and no
reference exists in src/, pom.xml, or webpack.config.js. Removing it
drops request@2.88.2 and its whole subtree (uuid@3, form-data@2,
har-validator, http-signature, sshpk, hoek, stringstream, ...) — 71
lockfile entries — and retires the unfixable 'request' CVE row.
Also prune the ten overrides that subtree was the last consumer of
(atob, cryptiles, deep-extend, form-data@>=2<3, fstream, growl, hoek,
sshpk, stringstream, uuid@<4). Verified the lockfile diff is pure
removal — no remaining package changed resolution. This also moots the
review finding that the uuid@<4 -> ^11.1.1 override left request
un-loadable (require('uuid/v4') hit ERR_PACKAGE_PATH_NOT_EXPORTED).
Build passes; 174 jest tests pass.
GHSA-vpq2-c234-7xj6 (CVSS 3.3, via jsdom's http-proxy-agent chain); advisory postdates the original scan. Patch-level fix. 174 tests pass.
Contributor
Author
|
@marshallmassengill fixed the relevant issues you raised |
marshallmassengill
approved these changes
Aug 10, 2026
marshallmassengill
left a comment
Contributor
There was a problem hiding this comment.
Changes look good.
mershad-manesh
approved these changes
Aug 10, 2026
synqotik
deleted the
jira/NMS-20181-dependabot-core-web-assets-august-2026
branch
August 10, 2026 22:33
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dependency Updates — Legacy UI (
/core/web-assets), August 2026Branch:
jira/NMS-20181-dependabot-core-web-assets-august-2026(based onrelease-36.x).Source data: open Dependabot PRs targeting
develop(Dependabot does not file PRs againstrelease-36.x).Package manager: pnpm 10.24.0. All updates verified with
pnpm run webpack(dev),pnpm run webpack-release(production), andpnpm test(21 suites, 174 tests passing — includes 9 new IP-validation tests, see Section 3).NOTE: We will need to address some of these issues in next major version or a minor version release, since they can only be fixed with major version dependency updates that require more significant code changes.
Section 1 — Dependabot Updates
Legacy UI (
/core/web-assets) — Dependabot Updates^semver resolved 7.29.7^semver resolved 10.5.0. Behavior change: 10.5.0 rejects leading-zero IPv4 octets (010.1.1.1,1.2.3.04) that 10.2.0 accepted. This is deliberate upstream hardening — leading zeros are ambiguous (octal to C parsers, decimal to Java) — but it changes released validation behavior inisValidIPAddress(used bynewInterface.jsp, the discovery add pages, path outage pages, and requisition constraints). Java'sInetAddressstill accepts these as decimal, so the UI is now stricter than the backend. Pinned with explicit tests inipaddress.test.js.~5.9.3. Nothing in this package runstsc(webpack transpiles via babel), so the compiler major bought no coverage, and @typescript-eslint 7.18.0 declares support for<5.6.0— a compiler three majors ahead of the linter is risk without payoff on a release branch. TS 6 belongs ondeveloppaired with a @typescript-eslint 8.x upgrade.loaderUtils.getOptionswas removed in v3). Applied scoped pnpm override"loader-utils@<1": "^1.4.2"instead — this moves all four packages that resolved the vulnerable 0.2.17 (string-replace-webpack-plugin@0.1.3and thecss-loader@0.9.1/file-loader@0.8.5/style-loader@0.8.3it declares as deps) to 1.4.2; CVE-2022-37601/37603 are fixed as of 1.4.1/1.4.2. Remaining tree copies are patched 1.4.2/2.0.4. Declared entry stays^2.0.4.webpack.config.jsloads it via CommonJSrequire('yargs')(SyntaxError: Cannot use import statement outside a module). Reverted; stays at 16.2.2. Applying would require reworking argv parsing inwebpack.config.js.Section 2 — OSV-Scanner Security Remediations
Scan before: 50 known vulnerabilities across 17 packages (2 Critical, 25 High). Scan after: 19 across 6 packages (1 Critical, 5 High, 13 Medium) — none remediable without breaking the webpack 4 toolchain. The biggest single win was removing
phantomjs-prebuiltoutright (see Section 3), which deleted the deprecatedrequestsubtree instead of patching around it.require('tar')in its code, so this was lockfile hygiene rather than a live code path)"tar": "^4.4.13"→"^7.5.21"(the old override was actively forcing tar down to 4.x — the real find here)"form-data@>=4 <5": "^4.0.6""immutable": "^5.1.8""brace-expansion@>=1 <2"→"^1.1.18""brace-expansion@>=2 <3"→"^2.1.4""js-yaml"→"^3.15.1""loader-utils@<1": "^1.4.2""ajv@<5": "^6.14.0"phantomjs-prebuilt(dead devDependency), which removedrequestand its entire subtree — including the previously-listedform-data@2.5.xanduuid@3.xrows, whose overrides are also gone"@tootallnate/once": "^2.0.1"(advisory GHSA-vpq2-c234-7xj6 postdates the original scan)Section 3 — Code-Review Follow-ups
Changes made in response to review feedback on this PR:
phantomjs-prebuilt— a dead devDependency (tests are jest + jsdom; no karma; no reference insrc/,pom.xml, orwebpack.config.js). This deleted 71 lockfile entries including the deprecatedrequest@2.88.2subtree, retired the unfixablerequestCVE row, and let ten pnpm overrides be pruned (atob,cryptiles,deep-extend,form-data@>=2 <3,fstream,growl,hoek,sshpk,stringstream,uuid@<4) — verified as a pure-removal lockfile diff with no resolution changes to anything that remains. It also moots a review finding that theuuid@<4 → ^11.1.1override had leftrequestun-loadable (require('uuid/v4')→ERR_PACKAGE_PATH_NOT_EXPORTED).checkIpRangefor IPv6 (src/main/assets/js/vendor/ipaddress-js.js) — the IPv6 branch calledcompareTo()on a nativeBigInt(jsbn was dropped in ip-address 9), throwingTypeErrorand silently bypassing range validation inadd-er.jsp/add-ir.jsp. Pre-existing bug, not introduced by this PR; now compares with>=like the IPv4 branch, with new tests covering IPv6 in-order/equal/inverted ranges, inverted IPv4, and mixed-family inputs.~5.9.3(see Section 1)..node-versionfrom 16.15.1 to 22.22.2, matchingengines(>=22) and the Maven build's pinnedv22.22.2, so local nvm/fnm users match CI.@tootallnate/onceoverride (see Section 2).A known caveat, also from review: several overrides use
^ranges, so non-CI installs (pnpm installwithout--frozen-lockfile) can re-resolve past the exact versions tested here — this PR's own body records two such overshoots (@babel/core 7.29.6→7.29.7, ip-address 10.3.1→10.5.0). Left as-is for now; switching CVE-motivated overrides to exact pins is a possible follow-up.External References