Resolved 2026-08-02. postcss bumped 8.5.16 → 8.5.25 in #131. The advisory is cleared
and npm audit no longer reports it. Details below; the original assessment is preserved
underneath and still reads correctly — nothing in it was wrong, only its expectation that
Dependabot would propose the bump.
Resolution (2026-08-02)
Bumped postcss 8.5.16 → 8.5.25 in frontend/package.json, lock regenerated with npm.
Why it was applied by hand
This issue said "Dependabot targets dev for version updates and should propose it; if it does
not, apply it directly." It did not. After #126, #127 and #128 were closed there were no open
Dependabot PRs at all, so nothing was coming to do this automatically — and a HIGH advisory
waiting on a bot that is not going to act is worse than a four-line diff. The earlier plan to defer
it to its own PR was wrong for the same reason.
Which version actually clears it — verified in the source
The advisory reports affected <=8.5.17, first patched 8.5.18. That number was checked, not
taken, because GHSA-mh99-v99m-4gvg was re-scoped mid-flight and #125 was wrong as a direct result
(CLAUDE.md § Dependency hygiene — advisory metadata is evidence, not proof).
Unpacking the published tarballs, lib/previous-map.js's loadFile() in 8.5.18 gains the
containment check the advisory describes, and 8.5.17 has none of it:
if (cssFile) {
let relativePath = relative(dirname(cssFile), path)
if (relativePath === '..' || relativePath.startsWith('..' + sep) || isAbsolute(relativePath)) {
return undefined
}
}
A sourceMappingURL can no longer resolve outside the stylesheet's own directory — exactly the
"path traversal in previous source map auto-loading" the advisory names. 8.5.18 is therefore the
real fix floor, established independently of the version range.
8.5.25 was pinned rather than 8.5.18. The same check is still present there (relativePath
renamed to rel, semantics identical), it is the current release on the pinned 8.5 major, and
CLAUDE.md § Dependency hygiene asks for current, actively-maintained pins rather than the bare
minimum that clears a finding.
No overrides entry, no parent bump
Worth correcting one assumption: postcss is a direct devDependency here, not only a
transitive one under the vite/Mantine tree. Every package that also reaches it declares a peer or
caret range that 8.5.25 satisfies:
| Consumer |
Declared range |
[email protected] |
^8.5.3 |
postcss-preset-mantine |
>=8.0.0 (peer) |
postcss-mixins / postcss-nested |
^8.2.14 (peer) |
postcss-js |
^8.4.21 (peer) |
postcss-simple-vars |
^8.2.1 (peer) |
sugarss |
^8.3.3 (peer) |
So raising the single direct pin lifts the whole tree — npm ls postcss --all shows every consumer
deduped onto one 8.5.25 copy. No overrides entry was needed and no parent package was bumped,
so the "stop if this needs a major bump of a parent" condition never arose.
The diff
Regenerated with npm pkg set + npm install --package-lock-only — not by editing version strings
— so resolved URLs and integrity hashes moved with the version:
postcss 8.5.16 → 8.5.25
- its
nanoid floor ^3.3.12 → ^3.3.16, pulling nanoid 3.3.15 → 3.3.16
All dev: true. No new packages.
Verification
What this did not change
PostCSS runs during vite build; the runtime image copies only the built dist/ output. No
deployed Scrye was ever exposed, and nothing about the shipped image changes — the reachability
assessment below was correct and this bump does not alter it. The value here is closing a HIGH
finding that would otherwise sit in every future npm audit and re-scan, not remediating live
risk.
Closed on this issue's own stated criterion: "close by hand once postcss is pinned at 8.5.25+
and the frontend build and Vitest suite pass."
Ref: #131, docs/ARCHIVE.md §14 (2026-08-02), CLAUDE.md § Dependency hygiene.
Original issue text (2026-07-31) — preserved. The assessment holds; only its expectation that Dependabot would propose the bump did not.
Summary
npm audit reports GHSA-r28c-9q8g-f849 (HIGH) against postcss 8.5.16. PostCSS is a
devDependency — it runs during vite build and is not present in the runtime image or the
browser bundle. This issue is the tracking reference so the finding does not go invisible between
scans.
Not release-blocking.
The advisory
- GHSA-r28c-9q8g-f849 (HIGH) — PostCSS: Path Traversal in Previous Source Map Auto-Loading
(sourceMappingURL) leads to Arbitrary .map File Disclosure. A crafted sourceMappingURL
comment in a processed stylesheet can make PostCSS read an arbitrary .map file from disk and
inline its contents into the output source map.
- Vulnerable range:
<=8.5.17. Scrye pins postcss==8.5.16 (frontend/package.json
devDependencies), also reached transitively via postcss-preset-mantine and
postcss-simple-vars.
Reachability assessment
Build-time only, on trusted input.
- PostCSS is a
devDependency. The runtime image copies only the built dist/ output — no
node_modules, no PostCSS. Nothing about this advisory reaches a deployed Scrye.
- The stylesheets PostCSS processes are Scrye's own
src/**/*.css plus Mantine's, all from the
hash-pinned lockfile. There is no path by which a user, a scan target, or scanner output supplies
CSS to the build.
- The disclosure sink is the generated source map, which is a build artifact on the CI runner.
The residual risk is a supply-chain scenario — a malicious stylesheet entering the build tree —
which the lockfile and pip/npm pinning already address more directly.
Resolution
postcss 8.5.25 or later. This is a patch-level bump within the pinned major, so unlike #123
there is no version-policy obstacle — it just needs the routine bump and a build check. Dependabot
targets dev for version updates and should propose it; if it does not, apply it directly.
npm audit fix --force reports this as "outside the stated dependency range" only because the pin
is exact; a deliberate re-pin is the correct fix, not a forced resolution.
Review cadence
Take the bump whenever it next comes up — at the latest during the Before you tag Dependabot
triage in CONTRIBUTING.md § Releasing.
Closing this issue
Close by hand once postcss is pinned at 8.5.25+ and the frontend build and Vitest suite pass.
Closing keywords do not fire on PRs targeting dev.
Ref: CLAUDE.md § Dependency hygiene, docs/ARCHIVE.md §14 (2026-07-31).
Resolution (2026-08-02)
Bumped
postcss8.5.16 → 8.5.25 infrontend/package.json, lock regenerated with npm.Why it was applied by hand
This issue said "Dependabot targets
devfor version updates and should propose it; if it doesnot, apply it directly." It did not. After #126, #127 and #128 were closed there were no open
Dependabot PRs at all, so nothing was coming to do this automatically — and a HIGH advisory
waiting on a bot that is not going to act is worse than a four-line diff. The earlier plan to defer
it to its own PR was wrong for the same reason.
Which version actually clears it — verified in the source
The advisory reports affected
<=8.5.17, first patched 8.5.18. That number was checked, nottaken, because GHSA-mh99-v99m-4gvg was re-scoped mid-flight and #125 was wrong as a direct result
(
CLAUDE.md§ Dependency hygiene — advisory metadata is evidence, not proof).Unpacking the published tarballs,
lib/previous-map.js'sloadFile()in 8.5.18 gains thecontainment check the advisory describes, and 8.5.17 has none of it:
A
sourceMappingURLcan no longer resolve outside the stylesheet's own directory — exactly the"path traversal in previous source map auto-loading" the advisory names. 8.5.18 is therefore the
real fix floor, established independently of the version range.
8.5.25 was pinned rather than 8.5.18. The same check is still present there (
relativePathrenamed to
rel, semantics identical), it is the current release on the pinned 8.5 major, andCLAUDE.md§ Dependency hygiene asks for current, actively-maintained pins rather than the bareminimum that clears a finding.
No
overridesentry, no parent bumpWorth correcting one assumption:
postcssis a directdevDependencyhere, not only atransitive one under the vite/Mantine tree. Every package that also reaches it declares a peer or
caret range that 8.5.25 satisfies:
[email protected]^8.5.3postcss-preset-mantine>=8.0.0(peer)postcss-mixins/postcss-nested^8.2.14(peer)postcss-js^8.4.21(peer)postcss-simple-vars^8.2.1(peer)sugarss^8.3.3(peer)So raising the single direct pin lifts the whole tree —
npm ls postcss --allshows every consumerdeduped onto one 8.5.25 copy. No
overridesentry was needed and no parent package was bumped,so the "stop if this needs a major bump of a parent" condition never arose.
The diff
Regenerated with
npm pkg set+npm install --package-lock-only— not by editing version strings— so
resolvedURLs andintegrityhashes moved with the version:postcss8.5.16 → 8.5.25nanoidfloor^3.3.12→^3.3.16, pullingnanoid3.3.15 → 3.3.16All
dev: true. No new packages.Verification
npm ciinstalls 8.5.25, and the installednode_modules/postcss/lib/previous-map.jscarriesthe containment check.
npm run build✅npm auditno longer reportspostcss. The two remaining highs are thereact-router/react-router-dompair tracked in GHSA-qwww-vcr4-c8h2 (react-router RSC-mode CSRF bypass) — fixed by the 7.18.2 backport, not the 8.3.0 major #123.What this did not change
PostCSS runs during
vite build; the runtime image copies only the builtdist/output. Nodeployed Scrye was ever exposed, and nothing about the shipped image changes — the reachability
assessment below was correct and this bump does not alter it. The value here is closing a HIGH
finding that would otherwise sit in every future
npm auditand re-scan, not remediating liverisk.
Closed on this issue's own stated criterion: "close by hand once
postcssis pinned at 8.5.25+and the frontend build and Vitest suite pass."
Ref: #131,
docs/ARCHIVE.md§14 (2026-08-02),CLAUDE.md§ Dependency hygiene.Original issue text (2026-07-31) — preserved. The assessment holds; only its expectation that Dependabot would propose the bump did not.
Summary
npm auditreports GHSA-r28c-9q8g-f849 (HIGH) againstpostcss8.5.16. PostCSS is adevDependency — it runs during
vite buildand is not present in the runtime image or thebrowser bundle. This issue is the tracking reference so the finding does not go invisible between
scans.
Not release-blocking.
The advisory
(
sourceMappingURL) leads to Arbitrary.mapFile Disclosure. A craftedsourceMappingURLcomment in a processed stylesheet can make PostCSS read an arbitrary
.mapfile from disk andinline its contents into the output source map.
<=8.5.17. Scrye pinspostcss==8.5.16(frontend/package.jsondevDependencies), also reached transitively viapostcss-preset-mantineandpostcss-simple-vars.Reachability assessment
Build-time only, on trusted input.
devDependency. The runtime image copies only the builtdist/output — nonode_modules, no PostCSS. Nothing about this advisory reaches a deployed Scrye.src/**/*.cssplus Mantine's, all from thehash-pinned lockfile. There is no path by which a user, a scan target, or scanner output supplies
CSS to the build.
The residual risk is a supply-chain scenario — a malicious stylesheet entering the build tree —
which the lockfile and
pip/npmpinning already address more directly.Resolution
postcss8.5.25 or later. This is a patch-level bump within the pinned major, so unlike #123there is no version-policy obstacle — it just needs the routine bump and a build check. Dependabot
targets
devfor version updates and should propose it; if it does not, apply it directly.npm audit fix --forcereports this as "outside the stated dependency range" only because the pinis exact; a deliberate re-pin is the correct fix, not a forced resolution.
Review cadence
Take the bump whenever it next comes up — at the latest during the Before you tag Dependabot
triage in
CONTRIBUTING.md§ Releasing.Closing this issue
Close by hand once
postcssis pinned at 8.5.25+ and the frontend build and Vitest suite pass.Closing keywords do not fire on PRs targeting
dev.Ref:
CLAUDE.md§ Dependency hygiene,docs/ARCHIVE.md§14 (2026-07-31).