fix: upgrade builder-util-runtime to 9.7.0 (CVE-2026-54673) - #86
Conversation
Automated dependency upgrade by OrbisAI Security
|
Thanks for catching this — and worth stating up front that it's more relevant than a build-tool CVE usually is. That said, I'd like to land it differently, because Every consumer pins the version exactly, not as a range: So The reason I'd rather not force it: Upstream has already moved, so we don't need to force anything: I tested both routes locally with Minimal — bump Full — also bump My preference is the minimal one: it closes the shipped exposure, is a supported combination, and drops the Two asks either way:
|
|
Thanks for the detailed review; you're right, forcing the override on a toolchain that pins exact versions is riskier than it looks, and breaking auto-update is a much worse failure mode than the CVE itself. I'll switch to the minimal route. Updated approach: bump electron-updater to ^6.8.9, drop the overrides block entirely. This resolves builder-util-runtime to 9.7.0 under electron-updater/node_modules/, leaves the top-level electron-builder devDependency at 9.5.1 (excluded from the packaged app), and matches a version combination electron-updater's maintainers actually support. On CVE-2026-54673: [explanation, see below]. Since electron-updater runs at runtime inside the packaged app and performs the update-check requests, our usage is affected. I'll run npm run build: mac (and update the lockfile via npm install --package-lock-only first) before pushing, and update the PR description with the vector. |
Replaces the `overrides: { "builder-util-runtime": "9.7.0" }` approach
with a minimal `electron-updater` bump to `^6.8.9`.
The override forced a version that all five electron-builder toolchain
packages pin exactly to 9.5.1, silently applying an incompatible version.
If the mismatch broke electron-updater subtly, users couldn't auto-update —
worse than the CVE for a desktop app.
electron-updater 6.8.9 natively resolves builder-util-runtime to 9.7.0
under node_modules/electron-updater/; the electron-builder devDep toolchain
keeps 9.5.1 under its own nested paths and is not shipped in the app.
This is a supported version combination with no overrides needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ws < 8.20.2 has an uninitialized-memory disclosure and a memory-exhaustion DoS from tiny fragments. ws is a direct production dependency and ships in the packaged app, so unlike the rest of the current audit output this one reaches users. Real-world exposure is narrow: the only consumer is mcp-bridge.js, whose WebSocketServer binds host 127.0.0.1 behind a UUID auth token and an `mcp` subprotocol gate, so reaching it needs a local process already running as the user. Bumping anyway — it is a same-major patch move with no API change. Verified 8.21.1 still satisfies the bridge: server binds to loopback, handleProtocols accepts, and a client handshake with subprotocol "mcp" completes. For the record on the rest of `npm audit`: 17 of the 19 findings are electron-builder's own toolchain (tar, lodash, js-yaml, dmg-builder, …), which runs at package time and is excluded from the app. builder-util-runtime is flagged only on electron-builder's nested 9.5.1 copies — the shipping copy resolves to 9.7.0 via electron-updater 6.8.9 (#86). The remaining shipping one is js-yaml, reachable only through update-feed parsing, i.e. only exploitable by whoever already controls the release feed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Summary
Switch from
overrides-based fix to a minimalelectron-updaterbump to resolve CVE-2026-54673 (GHSA-p2f4-r6v6-j797).Vulnerability
CVE-2026-54673 / GHSA-p2f4-r6v6-j797 —
builder-util-runtime < 9.7.0(CVSS 4.0: 8.2 HIGH, CWE-200)HttpExecutor.prepareRedirectUrlOptionsstripped credential headers using a case-sensitive property check:This meant
PRIVATE-TOKEN(GitLab personal access token flow) and mixed-caseAuthorizationkeys were never inspected — they passed the guard and were forwarded intact to cross-origin redirect destinations.Concrete path: During an auto-update check against a private GitLab release,
electron-updaterrequests asset URLs. GitLab commonly redirects asset downloads cross-origin (to S3/GCS). Any credential inPRIVATE-TOKENor a non-lowercaseAuthorizationkey is forwarded to the redirect destination, leaking it to anyone who controls or can observe that destination.Our exposure:
electron-updateris a runtime dependency — it ships inside the packaged app and performs update-check requests at runtime. This app uses GitHub releases (not GitLab), so the specific authenticated-GitLab-PAT path isn't exercised. However,builder-util-runtime's redirect handler is shared infrastructure for all provider flows; upgrading to the patched version closes the class of vulnerability regardless of provider. Fixed inbuilder-util-runtime >= 9.7.0/electron-builder v26.15.0via PR #9834.Approach change (per maintainer review)
The previous commit used
overrides: { "builder-util-runtime": "9.7.0" }to force the patched version. This was correctly flagged: all fiveelectron-buildertoolchain packages pinbuilder-util-runtimeto exactly9.5.1, so the override silently applied a version none of them declared compatibility with. If that mismatch brokeelectron-updatersubtly, users couldn't auto-update — a worse failure mode than the CVE itself for a desktop app.Minimal fix: bump
electron-updaterto^6.8.9, dropoverrides.electron-updater 6.8.9natively resolvesbuilder-util-runtimeto9.7.0. Theelectron-builderdevDependency toolchain keeps9.5.1under its own nestednode_modules/and is excluded from the packaged app. This is a supported version combination.Changes
package.json:electron-updater^6.3.0→^6.8.9; removedoverridesblockpackage-lock.json: regenerated (npm install --package-lock-only);node_modules/builder-util-runtimeresolves to9.7.0;electron-buildertoolchain keeps9.5.1under nested pathsVerification
Lockfile resolution:
npm run build:macpasses — packaging confirmed working with the updated dependency tree.Automated security fix by OrbisAI Security