Skip to content

fix(security): pin Node runtime floor to 22.23.4 (CVE-2026-111497 Brotli) - #2949

Merged
jung-thomas merged 3 commits into
DEVfrom
worktree-node-brotli-cve-pin
Oct 29, 2026
Merged

jung-thomas merged 3 commits into
DEVfrom
worktree-node-brotli-cve-pin

Conversation

@jung-thomas

Copy link
Copy Markdown
Contributor

What

Raise engines.node from >=22.12 to >=22.23.4 <23.

Why

CVE-2026-111497 — out-of-bounds write (CWE-787) via missing return-value check (CWE-252) in the Google Brotli C decoder. Node 22.x is vulnerable below 22.23.4. Our CF apps stage on the unversioned system nodejs_buildpack, so the floor is what gates which patch gets installed.

Exposure (why this is defense-in-depth, not a live-exploit hotfix)

The vulnerable decoder is reached only through undici auto-decompressing a Content-Encoding: br response. All of this backend's outbound fetches target trusted first-party / SAP / GitHub hosts over TLS. No inbound path Brotli-decodes untrusted request bodies. Real exploitation needs an attacker in the response path of a trusted upstream serving a crafted stream — high bar.

⚠️ Deploy gate — verify before deploying

engines.node on SAP BTP CF only constrains what the system buildpack installs; it does not override the buildpack version. If the eu10-005 landscape buildpack does not yet ship 22.23.4+, a deploy with this floor will fail staging ("no match for version"). Confirm first:

```bash
cf buildpacks | grep -i nodejs # note the version

or inspect staging: cf push a throwaway and check the installed node -v

```

If the buildpack is still behind, hold the deploy (the merge is still safe — it only affects staging when deployed) until SAP updates the landscape buildpack.

Scope

  • No code change; no runtime behavior change.
  • Caps <23 to stay on the buildpack-supported Node 22 line; moving to 24 is a separate decision.

Brotli C decoder out-of-bounds write (CWE-787/CWE-252). Node 22.x is
vulnerable below 22.23.4. Raise engines.node floor so the CF
nodejs_buildpack installs a patched 22.x at staging; cap <23 to stay on
the buildpack-supported 22 line.

Reachable only via undici auto-decompression of Content-Encoding: br
from outbound fetches (all trusted SAP/GitHub hosts over TLS), so this
is a defense-in-depth runtime bump, not an active-exploit hotfix.
…1497)

srv-qa deploys as a separate CAP module from its own package.json +
lockfile; dep-parity guard requires engines.node to match root.
…1497)

The separate tutorials-mcp MTA stages tutorials-srv-mcp from gen/srv-mcp,
whose package.json is copied from committed srv-mcp/. Raise its Node floor
to match so a patched 22.x is installed at staging. No tracked lockfile;
not an npm workspace member, so package.json alone is authoritative.
@jung-thomas
jung-thomas merged commit 45934ca into DEV Oct 29, 2026
6 of 7 checks passed
@jung-thomas
jung-thomas deleted the worktree-node-brotli-cve-pin branch October 29, 2026 16:22
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