Skip to content

Fix docs build dependencies and guard the remaining SVG advisory - #415

Merged
rmcdaniel merged 2 commits into
mainfrom
fix/413-build-dependency-security
Oct 29, 2026
Merged

rmcdaniel merged 2 commits into
mainfrom
fix/413-build-dependency-security

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

The documentation build and development server retain five dependencies below their available compatible security fixes. Update undici, body-parser, fast-uri, qs and serialize-javascript without changing parent majors or the five maintained patches. The dependency preflight now checks every root and nested copy, with regression cases for each old version.

The unfixed deepmerge finding remains explicit. Its sole declaring package, @svgr/plugin-svgo, does not import or call it in the reviewed published entrypoint. The recorded disposition requires the exact dependency graph, locked version and installed entrypoint hash; version, consumer or source drift requires renewed review. This does not classify the affected dependency as fixed or the audit as clean.

The consumer scan includes ordinary, development, optional and peer dependency declarations. Root-development, nested-optional and nested-peer controls fail against the original scanner and pass with the correction. Existing image, cache and browser-floor assertions retain their semantics inside named tests.

Validation on Node 24.22.1: clean npm ci applied all five patches; all 21 dependency controls, three actual browser-launch controls, Node-toolchain checks and npm test passed. The full eight-locale static build and bounded loopback start passed with the unchanged dependency/runtime files. The resulting audit contains none of the five corrected packages and retains only the low-severity deepmerge advisory with four parent rollups. All 11 final-head checks and six normal main source/publication runs passed. Protected merge 7f1679269a8b15065517587d11bd75894eb4e2e5 deployed through normal publisher 40944728127 to exact gh-pages artifact e139c5851f4f61fdf6446254c94fcbb587880ed3; Pages built it at 20:03:39 UTC. Four live routes and all three CSS/JavaScript assets matched that artifact byte for byte at 20:03:53–20:03:57 UTC. Delivery evidence is recorded in #413.

Refs #413. Includes the undici update proposed in #414; its existing check results remain independent.

@rmcdaniel rmcdaniel left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security source review at 7365a812c3e1f308fe6292c3e47313aeaa73774a found one control gap before acceptance.

dependencyParents() inspects only each lock entry's dependencies. A root devDependency, or a nested optionalDependencies / peerDependencies declaration, can consume the same single hoisted deepmerge copy while the asserted parent list still reports only @svgr/plugin-svgo. That bypasses the stated sole-consumer re-review gate.

Please make the deepmerge consumer scan cover dependencies, devDependencies, optionalDependencies, and peerDependencies, with negative controls for at least root-dev and nested-optional declarations (and peer as supported).

The bounded disposition itself is otherwise supported: GitHub's advisory records 4.2.0–4.3.1 affected with no patched version, and the exact npm 8.1.0 tarball independently matches the recorded entrypoint SHA-256 and contains no deepmerge import or call. No production incident or operator action follows.

@rmcdaniel
rmcdaniel marked this pull request as ready for review October 29, 2026 19:52
@rmcdaniel

Copy link
Copy Markdown
Member Author

Final source correction — 2026-10-29 19:53:14 UTC

Head c5301bdab3165ba6d0ee414ac4f5cd58acfea2c7, tree 5530b4b76061426b0c16c571c0d69bcfcf287ff8, changes only the consumer scanner and its tests from 7365a812c3e1f308fe6292c3e47313aeaa73774a. Security review found that development, optional and peer declarations could bypass the original sole-declaring-package check. All four kinds are now scanned. The new root-development, nested-optional and nested-peer controls demonstrated three failures against the original scanner and pass with the correction. Existing image/cache/browser-floor assertions are unchanged inside named tests, resolving Sonar's assertions-outside-tests findings.

Final focused qualification passed 19:49:39 UTC: 21 dependency cases, three actual browser-launch controls, toolchain checks and npm test. The unchanged dependency/runtime files completed the full eight-locale static build at 19:51:08 UTC. Loopback-only local start served / and /docs/introduction/ with HTTP 200 and captured the actual browser request for http://127.0.0.1:3123/ safely, completing 19:51:27 UTC. No visual browser or exploit execution is claimed.

The resulting audit has zero high/moderate/critical findings and five low package rows: the unfixed deepmerge advisory plus its four parent rollups. All five corrected packages are absent. This remains an affected audit, with the exact reviewed-source disposition recorded in the policy.

Original-head normal full qualification 40942910555 succeeded at 19:51:48 UTC before the follow-up push. Final-head normal checks and Security delta review remain pending. #413 stays open through protected merge, exact Pages deployment acceptance and cleanup.

@rmcdaniel rmcdaniel left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security follow-up for final head c5301bdab3165ba6d0ee414ac4f5cd58acfea2c7 / tree 5530b4b76061426b0c16c571c0d69bcfcf287ff8: the consumer-graph finding is resolved with no new source finding.

The one-commit delta from 7365a812 changes only the graph helper and tests. It now scans normal, development, optional, and peer dependency declarations; negative controls cover the existing normal consumer plus root-dev, nested-optional, and nested-peer cases. Those three new controls fail against the prior scanner and all 21 controls pass on the final scanner. The exact npm tarball still matches the recorded entrypoint digest and contains no deepmerge import or call.

The bounded disposition remains accurate: the audit is still affected, the static published site has no request-time Node path, and graph/version/source changes force re-review. Final-head normal CI and deployed static-site acceptance remain the delivery gates.

@sonarqubecloud

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security final acceptance for immutable head c5301bdab3165ba6d0ee414ac4f5cd58acfea2c7: every final-head check is terminal-success and the PR is merge-clean. The source finding is resolved; proceed through the normal merge and static-site deployment path. Deployed public acceptance remains the delivery receipt.

@rmcdaniel
rmcdaniel merged commit 7f16792 into main Oct 29, 2026
11 checks passed
@rmcdaniel
rmcdaniel deleted the fix/413-build-dependency-security branch October 29, 2026 20:05
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.

1 participant