Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
📦 npm
Not in CISA KEV

CVE-2026-54673 — builder-util-runtime

Fix: electron-userland/electron-builder@22a7532

CVE-2026-54673 is a Information Exposure vulnerability in builder-util-runtime. A fix is available for builder-util-runtime — see the affected versions and patch details below.

electron-updater: Cross-origin redirect leaks `PRIVATE-TOKEN` and mixed-case `Authorization` credentials in `builder-util-runtime`

Also known asGHSA-p2f4-r6v6-j797
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Oct 10, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-54673.

EPSS Exploitation Probability

via FIRST.org ↗
0.4%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs33th percentile — riskier than 33% of all scored CVEsHighest risk
0.00%0.30%0.60%0.91%0.2%0.2%0.2%0.4%0.4%Jul 26Sep 26Oct 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

Real-World Exposure

1 pkg affected

How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.

107other npm packages depend on this — each one inherits the vulnerability until it's patched upstream
builder-util-runtimenpm
7.4Mdownloads / week

Description

Summary

In electron-builder's builder-util-runtime package, the HTTP redirect handler (HttpExecutor.prepareRedirectUrlOptions) only stripped a credential header whose key string matched exactly lowercase "authorization". Other credential-bearing headers — most notably PRIVATE-TOKEN (used by GitLab's personal access token flow) and mixed-case Authorization (used by GitLab's Bearer/OAuth flow) — were not stripped and could be forwarded to an attacker-controlled cross-origin redirect destination.


Details

Root cause

HttpExecutor.prepareRedirectUrlOptions (introduced in builder-util-runtime via PR #9211, first released in v26.0.20) performed its cross-origin credential strip with a single case-sensitive property check:

// vulnerable code (electron-builder v26.0.20 – v26.14.x) [via builder-util-runtime <9.7.0]
if (headers?.authorization) {
  if (HttpExecutor.isCrossOriginRedirect(originalUrl, parsedRedirectUrl)) {
    delete headers.authorization   // only removes the exact key "authorization"
  }
}

JavaScript object property access is case-sensitive. The guard headers?.authorization evaluates to undefined (falsy) when the key is "Authorization", "AUTHORIZATION", or any other casing, so the branch is never entered and no header is deleted for those cases.

Affected updater flows

The clearest reproduced path is the private GitLab updater flow.

packages/electron-updater/src/providers/GitLabProvider.ts sets one of two credential headers depending on the token type:

// GitLabProvider.setAuthHeaderForToken (affected versions)
if (token.startsWith("Bearer")) {
  headers.authorization = token        // Bearer / OAuth token  →  key is lowercase
} else {
  headers["PRIVATE-TOKEN"] = token     // personal access token →  key is "PRIVATE-TOKEN"
}

During a private release update check, the updater requests a release asset through GitLab's direct_asset_url. GitLab commonly redirects asset downloads to an external object-storage origin (e.g., S3, GCS). Because the redirect crosses origins:

  1. A personal access token in PRIVATE-TOKEN is never inspected by the vulnerable strip guard — it is forwarded intact.
  2. A Bearer token set as headers.authorization (lowercase) is stripped correctly.
  3. A Bearer token set as headers.Authorization (capital A) or any other mixed-case variant bypasses the guard and is forwarded intact.

GitLab is the concrete reproduced case; any other provider or custom updater configuration that places credentials in a non-lowercase-authorization header is equally affected.

Before v26.0.20

Versions prior to v26.0.20 did not contain prepareRedirectUrlOptions at all. All credential headers were forwarded unchanged on every redirect, regardless of origin. This represents a broader, pre-existing version of the same class of vulnerability.


Proof of concept (reproduction shape)

  1. Configure the updater with an authenticated GitLab provider, supplying a personal access token (non-Bearer). The provider will set PRIVATE-TOKEN: <token> on requests.
  2. Trigger an update check. The updater fetches release metadata and then requests a release asset URL.
  3. The trusted GitLab origin returns a 3xx cross-origin redirect (e.g., to S3 object storage).
  4. HttpExecutor.prepareRedirectUrlOptions is called. The guard headers?.authorization is falsy (the key is "PRIVATE-TOKEN"). No header is deleted.
  5. The request to the redirect destination is issued with PRIVATE-TOKEN: <token> present in the headers.

Observed result: The personal access token is forwarded to the redirect destination. An attacker who controls or can observe the redirect destination receives the token.


Impact

This is a credential disclosure vulnerability. An automatic update check can leak:

  • GitLab personal access tokens (PRIVATE-TOKEN)
  • Bearer/OAuth tokens sent under a mixed-case Authorization key
  • Any other credential header not named exactly "authorization" in lowercase

Disclosure of a GitLab PAT grants the attacker whatever repository and API permissions the token carries, enabling unauthorized access to private source code, packages, or release artifacts.


Patches

Fixed in electron-builder v26.15.0 [included via v9.7.0 builder-util-runtime] via PR #9834 (commit 22a7532bd).

The incomplete property-access guard was replaced with a separator-agnostic, case-insensitive lookup against a registry of known sensitive header names:

// fixed code (v9.7.0+)
const normalizeName = (name: string): string =>
  name.toLowerCase().replace(/[-_]/g, "")

const SENSITIVE_REDIRECT_HEADERS = new Set([
  "authorization", "proxyauthorization", "privatetoken",
  "xapikey", "xauthtoken", "xaccesstoken", "xgitlabtoken",
  "cookie", "xcsrftoken",
])

// In prepareRedirectUrlOptions, on cross-origin redirect:
for (const key of Object.keys(headers)) {
  if (SENSITIVE_REDIRECT_HEADERS.has(normalizeName(key))) {
    delete (headers as Record<string, unknown>)[key]
  }
}

normalizeName converts to lowercase and strips - and _ separators, so PRIVATE-TOKEN, Private-Token, Authorization, AUTHORIZATION, X-Api-Key, etc. are all matched. The fix also exports addSensitiveRedirectHeader() to allow custom publishers to register additional headers.

Upgrade path: Update builder-util-runtime to >= 9.7.0.


Workarounds

There is no configuration-level workaround that prevents header forwarding in affected versions. The only mitigation short of upgrading is to avoid authenticated GitLab updater flows on versions < 9.7.0.

If operating in a network environment where you control all possible redirect destinations, you may be able to prevent the token from reaching an attacker-controlled host through network-layer controls, but this is not a reliable mitigation.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
📦npmbuilder-util-runtimeall versions9.7.0npm install builder-util-runtime@9.7.0

Affected Products

2 products · 2 configurations
Application
builder-util-runtimeelectron
< 9.7.0
range
Application
electron-builderelectron
< 26.15.0
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for builder-util-runtime, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update builder-util-runtime to 9.7.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-54673 is resolved across your whole dependency graph.

  3. Workarounds

    Assume what was exposed is already known: rotate any credential, token or key that the affected component could return, restrict the endpoint to callers that genuinely need it, and strip sensitive fields from responses and error output at the boundary rather than relying on the client not to read them.

Fixing This On Your OS

If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.

Red HatModerate

A flaw was found in electron-updater where credential-bearing HTTP headers (PRIVATE-TOKEN, mixed-case Authorization) are not stripped during cross-origin redirects. This could allow an attacker who controls a redirect destination to capture authentication credentials used during application update checks.

Workaround published by Red Hat
Mitigation for this issue is either not available or the currently available options do not meet the Red Hat Product Security criteria comprising ease of use and deployment, applicability to widespread installation base or stability.
Source: Red Hat security advisory for CVE-2026-54673 (CC BY 4.0)

Frequently Asked Questions

## Summary In `electron-builder`'s `builder-util-runtime` package, the HTTP redirect handler (`HttpExecutor.prepareRedirectUrlOptions`) only stripped a credential header whose key string matched exactly lowercase `"authorization"`. Other credential-bearing headers — most notably `PRIVATE-TOKEN` (used by GitLab's personal access token flow) and mixed-case `Authorization` (used by GitLab's Bearer/OAuth flow) — were not stripped and could be forwarded to an attacker-controlled cross-origin redirect destination. --- ## Details ### Root cause `HttpExecutor.prepareRedirectUrlOptions` (introduce
O3 Security · Impact-Aware SCA

Is CVE-2026-54673 in your dependencies?

Find it across npm, including transitive dependencies.

CVE-2026-54673: builder-util-runtime — Fixed in 9.7.0