Back to Intelligence

Node.js HTTP/2 Flaws in 24.x/26.x: Patch 22.23.5, 24.22.3, 26.13.1 and Hunt for Crash/Data-Leak Impact

SA
Security Arsenal Team
November 12, 2026
10 min read

Node.js released fixes this week for 16 vulnerabilities across the supported release lines, including two built-in HTTP/2 issues that matter immediately to defenders: an unauthenticated crash affecting servers using native HTTP/2 on the 24.x and 26.x lines, and a second HTTP/2 defect that can cause a server to return pieces of its own memory to a client, including response data intended for other connections. Fixed releases are 22.23.5, 24.22.3, and 26.13.1. If you run Internet-facing Node.js APIs, reverse proxies behind Node origin servers, server-rendered front ends, gRPC-like HTTP/2 services, or container images that embed Node, treat this as a priority patch cycle even before public scores are fully normalized.

No CVE identifiers were included in the source summary, so this article does not invent any. The operational severity is still clear: remote, unauthenticated availability loss plus possible cross-session data exposure in the same component family. Until the Node.js security release page and downstream distro advisories are fully mirrored in your vulnerability scanner, drive remediation by release line and runtime version rather than waiting for a CVE feed to catch up.

What defenders need to know

Affected scope is version- and configuration-dependent. The crash condition is described for servers that use Node.js built-in HTTP/2 support on the 24.x and 26.x release lines. The memory-disclosure issue is also in HTTP/2 handling and can expose data belonging to other connections, which raises confidentiality concerns beyond a simple restart loop. All three supported lines received fixed versions: 22.23.5, 24.22.3, and 26.13.1. Even if your organization standardized on 22.x LTS, you still need to confirm that every deployment artifact actually picked up the patched runtime; base images, Lambda-like layers, Kubernetes sidecars, Bazel/Node toolchain caches, and npm Docker builds commonly lag behind the VM patch baseline.

Exploitation requirements appear favorable to an attacker: no authentication is described for the crash, and HTTP/2 endpoints are often exposed directly or terminated at a load balancer that forwards HTTP/2 to Node. The risk is highest where Node itself speaks HTTP/2, especially cleartext h2c inside a trusted boundary that has become less trusted due to service mesh, container egress, or misconfigured ingress. Where TLS is terminated upstream and Node only receives HTTP/1.1, direct exploitability is likely reduced, but do not assume; verify the actual protocol seen by the Node process with server.log, ALPN logs, and ingress configuration.

Technical analysis

The vulnerable component is the built-in HTTP/2 implementation, not an npm package you can patch with npm update http2. That distinction matters: remediations that only update dependencies will not move the needle if the runtime remains 24.22.2 or earlier on the 24 line, 26.13.0 or earlier on the 26 line, or an unpatched 22.x release. Inventory must answer three questions per workload: which Node binary executes, which release line and exact version it reports, and whether application code calls http2.createServer, http2.createSecureServer, http2.connect, or uses frameworks that enable HTTP/2 automatically.

The crash is an availability problem: an unauthenticated client can trigger a server crash on vulnerable 24.x/26.x native HTTP/2 services. In production this usually shows up as worker exits, container restarts, upstream 502/503 spikes, connection resets, and elevated CPU or event-loop teardown before the process dies. The second flaw is more insidious: a client may receive memory fragments, potentially including responses for other connections. That creates a data-handling incident, not merely a patching ticket. If you observe unexplained mixed responses, session tokens in the wrong client context, cache poisoning-like behavior, or customers reporting another user's data, preserve evidence before rolling restarts destroy volatile state.

Public exploitation status was not confirmed in the summary, and inclusion in CISA KEV was not stated. Treat active exploitation as plausible for Internet-facing HTTP/2 because the barrier is low and the protocol parser is exposed. Absence of a public PoC is not absence of risk; HTTP/2 implementation bugs are frequently rediscovered from release diffs. Your detection posture should therefore combine exposure inventory, crash telemetry, and data-integrity canaries rather than waiting for a reliable exploit signature.

Detection and response

There are no trustworthy exploit-specific indicators in the source item, so avoid brittle signatures that claim to detect the exact frame sequence. Focus on three durable observables: vulnerable runtime inventory, abnormal Node process termination correlated with HTTP/2 traffic, and cross-connection response anomalies at the edge. Keep rules narrow and tune by known Node service accounts, container image repos, and ingress names.

YAML
---
title: Node.js Runtime Launch for Exposure Inventory
id: 9f1b7c2a-3d6e-4a8f-b2c1-7e5d9a0c4b21
status: experimental
description: Low-severity inventory detection for Node server process launches. Use to build vulnerable-version exposure, not as an exploit alert.
references:
  - https://thehackernews.com/2026/11/nodejs-fixes-16-flaws-including-http2.html
author: Security Arsenal
date: 2026/11/20
tags:
  - attack.discovery
  - attack.t1057
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    Image|endswith:
      - '\node.exe'
    CommandLine|contains:
      - 'server.js'
      - 'app.js'
      - 'index.js'
      - 'dist/server'
      - 'build/server'
      - '--experimental-http2'
  filter_known_services:
    CommandLine|contains:
      - 'nodejs-healthcheck'
falsepositives:
  - Developer workstations and CI build agents
level: low
---
title: Node Process Fatal Signal in Linux Application Logs
id: 4d2a9f18-6b7c-4e31-9a55-0c1f8d7e2a90
status: experimental
description: Detects Node.js fatal process signals in application or syslog telemetry that may indicate parser-triggered crashes. Correlate with HTTP/2 ingress before declaring an incident.
references:
  - https://thehackernews.com/2026/11/nodejs-fixes-16-flaws-including-http2.html
author: Security Arsenal
date: 2026/11/20
tags:
  - attack.impact
  - attack.t1499
logsource:
  category: application
  product: linux
detection:
  selection_node:
    Message|contains:
      - 'node'
      - 'nodejs'
  selection_crash:
    Message|contains:
      - 'SIGSEGV'
      - 'SIGABRT'
      - 'segmentation fault'
      - 'Abort trap'
      - 'fatal error'
      - 'process exited'
  condition: selection_node and selection_crash
falsepositives:
  - Legitimate application bugs, OOM kills, and unrelated native module crashes
level: medium
KQL — Microsoft Sentinel / Defender
let fixed = dynamic(['22.23.5','24.22.3','26.13.1']);
union isfuzzy=true
(DeviceProcessEvents
 | where FileName in~ ('node','node.exe','nodejs')
 | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, AccountName),
(Syslog
 | where ProcessName has_any ('node','nodejs') or SyslogMessage has 'node'
 | where SyslogMessage has_any ('SIGSEGV','SIGABRT','segmentation fault','Abort trap','fatal error','process exited','OOMKilled','restart')
 | project TimeGenerated, Computer, ProcessName, SyslogMessage, SeverityLevel),
(CommonSecurityLog
 | where DeviceProduct has_any ('nginx','envoy','haproxy','apache','istio','ingress')
 | where AdditionalExtensions has_any ('502','503','504') or DeviceCustomString1 has_any ('502','503','504')
 | project TimeGenerated, DeviceProduct, SourceIP, DestinationIP, DestinationPort, RequestURL, AdditionalExtensions)
| extend NodeFixedGuess = case(
    ProcessCommandLine has '22.23.5' or ProcessCommandLine has '24.22.3' or ProcessCommandLine has '26.13.1', 'fixed-string-present',
    FileName has 'node', 'verify-runtime-version',
    'n/a')
| summarize Events=count(), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated) by DeviceName, Computer, FileName, ProcessCommandLine, NodeFixedGuess
| order by LastSeen desc
VQL — Velociraptor
-- Inventory Node processes, listeners, and nearby package metadata during incident scoping
SELECT Pid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE Name =~ '^(node|nodejs)(\.exe)?$'
   OR CommandLine =~ 'server\.js|app\.js|index\.js|dist/server|build/server'

LET listeners = SELECT Pid, Name, LocalAddr, LocalPort, RemoteAddr, RemotePort, State
FROM netstat()
WHERE Name =~ '^(node|nodejs)(\.exe)?$' AND State =~ 'LISTEN'

SELECT * FROM listeners

LET manifests = SELECT FullPath, Size, Mtime
FROM glob(globs='/proc/*/cwd/**/package.json')
WHERE Mtime > now() - 86400*14

SELECT FullPath, Size, Mtime FROM manifests
Bash / Shell
#!/usr/bin/env bash
set -euo pipefail

need_root=0
if [ "$(id -u)" -ne 0 ]; then need_root=1; fi

say() { printf '%s\n' "$*"; }

say '== Runtime version =='
if command -v node >/dev/null 2>&1; then
  node -v
  command -v node
else
  say 'node not on PATH; check containers, nvm, and service units'
fi

say '== Running node processes and listeners =='
ps -eo pid,comm,args | awk '$2 ~ /^(node|nodejs)$/ {print}'
if command -v ss >/dev/null 2>&1; then
  ss -lntup 2>/dev/null | grep -E 'node|nodejs' || true
fi

say '== Version gate =='
ver="$(node -v 2>/dev/null | sed 's/^v//')"
case "$ver" in
  22.23.5|24.22.3|26.13.1) say 'PASS: exact fixed release detected' ;;
  22.*) [ "$(printf '%s\n' '22.23.5' "$ver" | sort -V | head -n1)" = '22.23.5' ] && say 'PASS: 22 line at or above fixed' || say 'FAIL: upgrade 22.x to 22.23.5' ;;
  24.*) [ "$(printf '%s\n' '24.22.3' "$ver" | sort -V | head -n1)" = '24.22.3' ] && say 'PASS: 24 line at or above fixed' || say 'FAIL: upgrade 24.x to 24.22.3' ;;
  26.*) [ "$(printf '%s\n' '26.13.1' "$ver" | sort -V | head -n1)" = '26.13.1' ] && say 'PASS: 26 line at or above fixed' || say 'FAIL: upgrade 26.x to 26.13.1' ;;
  *) say 'WARN: unknown or EOL release line; move to a supported fixed line' ;;
esac

say '== HTTP/2 usage grep =='
for d in /srv /opt /var/www /home/node /app; do
  [ -d "$d" ] || continue
  grep -RIn --exclude-dir=node_modules -E 'require\(.http2.\)|from .http2.|createSecureServer|createServer\(' "$d" 2>/dev/null | head -n 50 || true
done

say '== Container image versions =='
if command -v docker >/dev/null 2>&1; then
  docker images --format '{{.Repository}}:{{.Tag}}' | grep -Ei 'node|nodejs' || true
fi
if command -v kubectl >/dev/null 2>&1; then
  kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{end}{"\n"}{end}' 2>/dev/null | grep -Ei 'node|nodejs' || true
fi

say '== Restart loop evidence =='
if command -v journalctl >/dev/null 2>&1; then
  journalctl -u node\*.service -u \*node\*.service --since '24 hours ago' --no-pager 2>/dev/null | grep -Ei 'SIGSEGV|SIGABRT|segmentation fault|fatal|exited|failed|restart' || true
fi

exit 0

Response actions: if any 24.x/26.x native HTTP/2 service is Internet-exposed and unpatched, isolate it at the ingress or disable HTTP/2 to the Node origin until patched. If you find crash bursts, capture process stdout/stderr, core dumps where policy permits, ingress ALPN/protocol logs, and upstream status timelines before restarting. For the memory-leak scenario, preserve suspicious client response bodies and edge logs, then assess whether session tokens, PII, PCI data, or tenant-specific objects could have crossed connections. Rotate exposed secrets only when evidence supports disclosure; blind mass rotation can destroy availability without reducing risk.

Remediation

Upgrade immediately to the fixed release for your line: Node.js 22.23.5, 24.22.3, or 26.13.1. Do not patch only npm dependencies; rebuild containers, refresh golden AMIs, update nvm/asdf/mise pins, invalidate CI caches, and redeploy serverless layers that vendor the runtime. Confirm post-deployment with node -v from the exact execution context: host systemd unit, container entrypoint, init container, sidecar, and any process manager such as PM2 that may hold an old binary path.

If you cannot patch within the change window, reduce exposure by placing Node behind a terminating proxy that does not forward attacker-controlled HTTP/2 to the vulnerable runtime, block h2c upgrade/prior-knowledge traffic from untrusted networks, restrict direct access to Node listeners with security groups and mTLS, and add aggressive restart plus request-canary monitoring. These are workarounds, not fixes. Validate ingress behavior explicitly: some proxies normalize to HTTP/1.1 to backends, while others pass HTTP/2 end-to-end or re-originate h2c internally.

Use the Node.js security releases page as the source of truth and track distro backports separately if you install Node from apt, dnf, apk, or vendor images rather than nodejs.org tarballs: https://nodejs.org/en/blog/vulnerability/ and the project release index at https://nodejs.org/en/download/releases/. The referenced news coverage is at https://thehackernews.com/2026/11/nodejs-fixes-16-flaws-including-http2.html. If your vulnerability scanner lacks checks this week, create a temporary software-version detection for exact fixed strings and fail builds on 24.x below 24.22.3 and 26.x below 26.13.1; include 22.x below 22.23.5 as a must-fix for the broader 16-flaw release.

After patching, run a 72-hour heightened monitoring period: alert on Node fatal signals, restart loops, 5xx correlation with client resets, anomalous response-body entropy or mixed-cache symptoms, and any customer reports consistent with cross-session exposure. For regulated environments, document whether vulnerable HTTP/2 services touched cardholder data, ePHI, or production secrets during the exposure window; the memory-disclosure path can trigger incident-response and legal review even when availability is restored quickly.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.