fix(deps): close the undici, fast-uri, postcss and brace-expansion advisories #55

Merged
enricobuehler merged 1 commits from worktree-audit-undici into main 2026-08-05 05:51:07 +00:00
Owner

Turns audit.yml's three blocking bun-audit legs green. Merge this before cutting v0.25.0 — it is one of the two reds standing between main and a clean tag.

10 findings each in sdk and plugin-kit, 8 in web. Every one is a transitive dependency; none was fixable by bumping a direct dep.

web — stale pins in a mechanism that already existed

web already carried an overrides block whose undici and fast-uri pins had simply gone stale, so this is four bumps rather than a new idea:

package was now why
undici ^7.28.0 ^7.29.0 reported advisory (>=7.0.0 <7.29.0)
fast-uri ^3.1.4 ^3.1.5 reported advisory (>=3.0.0 <3.1.5)
postcss ^8.5.10 ^8.5.25 advisory published after the failing run
brace-expansion ^5.0.8 ^5.0.9 advisory published after the failing run

The last two were not in the red run but would have taken the next audit red anyway. All four stay inside their current major.

sdk / plugin-kit — why the fix looks the way it does

The single finding is undici 8.7.0/8.8.0 pulled in by @effect/platform-node, a devDependency pinned at 4.0.0-beta.98. That package already declares undici: ^8.7.0, which permits the fixed 8.10.0 — the vulnerable version survives purely as a stale lockfile resolution.

Nothing bumps it in place:

  • bun update only walks direct dependencies.
  • bun install --force preserves a resolution that still satisfies its range.
  • Every @effect/platform-node release through beta.103 declares the same ^8.7.0, so moving the dep changes nothing.
  • Bun rejects the scoped form outright: warn: Bun currently does not support nested "resolutions".

So a flat overrides entry is the only mechanism available, and it necessarily also moves sdk's top-level undici from 7.x to 8.x.

That was verified, not assumed. The only source use is sdk/src/config.ts, which does new Agent({ connect: { ca } }) behind a dynamic import and a try/catch with a documented plain-fetch fallback; Agent and its connect option are unchanged between undici 7 and 8. Both trees now dedupe to a single undici 8.10.0.

Consumers are deliberately untouched. overrides apply only at the root of the tree that declares them and are not honored when the package is installed as a dependency, so sdk's published optionalDependencies: { undici: "^7.0.0" } is left alone — a consumer resolves the latest 7.x, which is the fixed 7.29.0. The override governs this repo's own tree, which is exactly what audit.yml checks. Worth knowing: sdk's dev tree therefore exercises undici 8 while consumers get 7.

Two traps found on the way

A malformed lockfile that disguises itself as a tooling error. Running bun install over plugin-kit's existing lockfile emitted two byte-identical @punktfunk/host entries — its file:../sdk dependency crossed with the new override — and bun then refuses its own output with Error loading lockfile: InvalidPackageKey. That reads as a broken toolchain rather than a finding, so it would have taken the gate down while looking like something else entirely. Regenerating the lockfile from scratch produces a valid single entry; all three lockfiles were checked for duplicate keys.

A vacuous green that was rejected. Deleting the pinned nested entry from a lockfile makes bun audit report No vulnerabilities found while the vulnerable copy is still installed on disk — bun audit reads the lockfile, not node_modules. Recorded here because it is convincing and wrong.

Verification

  • bun audit clean in all three trees.
  • web builds and typechecks (its typecheck needs the build first, which generates routeTree.gen).
  • sdk typechecks, 72/72 tests pass against undici 8.10.0.
  • plugin-kit typechecks, 20/20 tests pass.

Not addressed here

The other red on main is ci.yml's Linux rust job failing with No space left on device — the runner is out of disk, unrelated to this change and still outstanding.

Turns `audit.yml`'s three blocking `bun-audit` legs green. **Merge this before cutting v0.25.0** — it is one of the two reds standing between main and a clean tag. 10 findings each in `sdk` and `plugin-kit`, 8 in `web`. Every one is a transitive dependency; none was fixable by bumping a direct dep. ## web — stale pins in a mechanism that already existed `web` already carried an `overrides` block whose `undici` and `fast-uri` pins had simply gone stale, so this is four bumps rather than a new idea: | package | was | now | why | |---|---|---|---| | `undici` | `^7.28.0` | `^7.29.0` | reported advisory (`>=7.0.0 <7.29.0`) | | `fast-uri` | `^3.1.4` | `^3.1.5` | reported advisory (`>=3.0.0 <3.1.5`) | | `postcss` | `^8.5.10` | `^8.5.25` | advisory published *after* the failing run | | `brace-expansion` | `^5.0.8` | `^5.0.9` | advisory published *after* the failing run | The last two were not in the red run but would have taken the next audit red anyway. All four stay inside their current major. ## sdk / plugin-kit — why the fix looks the way it does The single finding is `undici` 8.7.0/8.8.0 pulled in by `@effect/platform-node`, a devDependency pinned at `4.0.0-beta.98`. That package **already declares `undici: ^8.7.0`**, which permits the fixed 8.10.0 — the vulnerable version survives purely as a stale lockfile resolution. Nothing bumps it in place: - `bun update` only walks **direct** dependencies. - `bun install --force` preserves a resolution that still satisfies its range. - Every `@effect/platform-node` release through `beta.103` declares the same `^8.7.0`, so moving the dep changes nothing. - Bun rejects the scoped form outright: `warn: Bun currently does not support nested "resolutions"`. So a flat `overrides` entry is the only mechanism available, and it necessarily also moves sdk's top-level undici from 7.x to 8.x. **That was verified, not assumed.** The only source use is `sdk/src/config.ts`, which does `new Agent({ connect: { ca } })` behind a dynamic import and a `try`/`catch` with a documented plain-`fetch` fallback; `Agent` and its `connect` option are unchanged between undici 7 and 8. Both trees now dedupe to a single undici 8.10.0. **Consumers are deliberately untouched.** `overrides` apply only at the root of the tree that declares them and are not honored when the package is installed as a dependency, so sdk's published `optionalDependencies: { undici: "^7.0.0" }` is left alone — a consumer resolves the latest 7.x, which is the fixed 7.29.0. The override governs this repo's own tree, which is exactly what `audit.yml` checks. Worth knowing: sdk's dev tree therefore exercises undici 8 while consumers get 7. ## Two traps found on the way **A malformed lockfile that disguises itself as a tooling error.** Running `bun install` over plugin-kit's existing lockfile emitted two byte-identical `@punktfunk/host` entries — its `file:../sdk` dependency crossed with the new override — and bun then refuses its own output with `Error loading lockfile: InvalidPackageKey`. That reads as a broken toolchain rather than a finding, so it would have taken the gate down while looking like something else entirely. Regenerating the lockfile from scratch produces a valid single entry; all three lockfiles were checked for duplicate keys. **A vacuous green that was rejected.** Deleting the pinned nested entry from a lockfile makes `bun audit` report `No vulnerabilities found` while the vulnerable copy is still installed on disk — `bun audit` reads the lockfile, not `node_modules`. Recorded here because it is convincing and wrong. ## Verification - `bun audit` clean in all three trees. - `web` builds and typechecks (its typecheck needs the build first, which generates `routeTree.gen`). - `sdk` typechecks, 72/72 tests pass against undici 8.10.0. - `plugin-kit` typechecks, 20/20 tests pass. ## Not addressed here The other red on main is `ci.yml`'s Linux `rust` job failing with `No space left on device` — the runner is out of disk, unrelated to this change and still outstanding.
enricobuehler added 1 commit 2026-08-05 05:48:27 +00:00
fix(deps): close the undici, fast-uri, postcss and brace-expansion advisories
ci / web (pull_request) Successful in 1m8s
ci / rust-arm64 (pull_request) Successful in 1m33s
ci / docs-site (pull_request) Successful in 1m21s
ci / rust (pull_request) Failing after 7m49s
b79d90b463
audit.yml's three blocking bun-audit legs (web, sdk, plugin-kit) were all red on
main. Ten findings in sdk and plugin-kit, eight in web; every one of them a
transitive dependency, none reachable by bumping a direct dep.

web already carried the right mechanism — an `overrides` block whose `undici` and
`fast-uri` pins had simply gone stale — so it needed four bumps, not a new idea:
undici 7.28.0 -> ^7.29.0 and fast-uri 3.1.4 -> ^3.1.5 for the reported advisories,
plus postcss ^8.5.10 -> ^8.5.25 and brace-expansion ^5.0.8 -> ^5.0.9 for two more
that were published after the failing run and would have gone red on the next
audit anyway. All four stay inside their current major.

sdk and plugin-kit were harder and the fix deserves an explanation. Their single
finding is undici 8.7.0/8.8.0 pulled in by @effect/platform-node, a devDependency
pinned at 4.0.0-beta.98. That dependency already declares `undici: ^8.7.0`, which
permits the fixed 8.10.0 — the vulnerable version survives purely as a stale
lockfile resolution. Nothing bumps it in place: `bun update` only walks direct
dependencies, `bun install --force` preserves a resolution that still satisfies
its range, and every platform-node release through beta.103 declares the same
`^8.7.0`, so moving the dep changes nothing. Bun rejects the scoped form outright
("Bun currently does not support nested resolutions"), so a flat `overrides` entry
is the only mechanism available, and it necessarily also moves sdk's top-level
undici from 7.x to 8.x.

That is safe here, and was verified rather than assumed. The only source use is
sdk/src/config.ts, which does `new Agent({ connect: { ca } })` behind a dynamic
import and a try/catch with a documented plain-fetch fallback; `Agent` and its
`connect` option are unchanged between undici 7 and 8. sdk typechecks and its 72
tests pass against 8.10.0; plugin-kit typechecks and its 20 tests pass. Both trees
now dedupe to a single undici 8.10.0.

Consumers are deliberately untouched: `overrides` apply only at the root of the
tree that declares them and are not honored when the package is installed as a
dependency, so sdk's published `optionalDependencies: { undici: "^7.0.0" }` is
left alone — a consumer resolves the latest 7.x, which is the fixed 7.29.0. The
override governs this repo's own tree, which is exactly what audit.yml checks.
Worth knowing: sdk's dev tree therefore exercises undici 8 while consumers get 7.

One trap found on the way. Running `bun install` over plugin-kit's existing
lockfile emitted a lockfile with two byte-identical `@punktfunk/host` entries —
its `file:../sdk` dependency crossed with the new override — and bun then refuses
its own output with "Error loading lockfile: InvalidPackageKey". That reads as a
tooling error rather than a finding, so it would have taken the audit gate down
while looking like something else entirely. Regenerating the lockfile from scratch
produces a valid single entry; all three lockfiles are checked for duplicate keys.

Also worth recording, because it nearly shipped: deleting the pinned nested entry
from a lockfile makes `bun audit` report "No vulnerabilities found" while the
vulnerable copy is still installed on disk. bun audit reads the lockfile, not
node_modules. That is a vacuous green, not a fix, and was rejected.

Verified: `bun audit` clean in all three trees; web builds and typechecks (its
typecheck needs the build first, which generates routeTree.gen); sdk 72/72 and
plugin-kit 20/20 tests pass.
enricobuehler merged commit 52a9d02355 into main 2026-08-05 05:51:07 +00:00
enricobuehler deleted branch worktree-audit-undici 2026-08-05 05:51:08 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unom/punktfunk#55