LIVE — Threat Intelligence Active ZyberWalls.com
Independent Cybersecurity Research
Home / Node.js Zero-Day: One Request Can Crash Your Server

Node.js Zero-Day: One Request Can Crash Your Server

ZW
ZyberWalls Research Team Independent cybersecurity researchers covering zero-days, CVEs, breach analysis and threat intelligence. All facts verified from primary sources.

Node.js runs inside more applications than most people realize. The chat feature on your favorite app. The API your payment processor uses. The backend of countless startup products and enterprise tools. If software talks to the internet in 2026, there is a reasonable chance Node.js is somewhere in the middle of it.

On March 24, 2026, the Node.js team released an emergency security patch fixing nine vulnerabilities — two of them rated High severity — that allow attackers to crash Node.js servers remotely without any login, password, or special access. Just send a specific type of request and the server goes down.

If you run Node.js in production and haven't updated yet, read this before you do anything else.

Node.js March 2026 Security Release — Key Facts
  • Release date: March 24, 2026
  • Total vulnerabilities fixed: 9 — 2 High, 4 Medium, 2 Low, 1 Permission bypass
  • Most dangerous: CVE-2026-21637 — remote crash, no authentication required
  • Second most dangerous: CVE-2026-21710 — one HTTP header crashes the entire server process
  • Affected versions: Node.js 20.x, 22.x, 24.x, and 25.x — all active release lines
  • Safe versions: v20.20.2 / v22.22.2 / v24.14.1 / v25.8.2
  • Exploitation: No authentication needed for the two High severity flaws
  • Available on: Windows, macOS, Linux — all platforms via nodejs.org
Node.js server crash caused by malicious request exploiting proto header and TLS vulnerability leading to system failure

The Two Crashes That Matter Most

CVE-2026-21637 — One Bad Connection Request Kills the Server

When you visit a website that uses HTTPS — the secure, padlock version — your browser and the server perform a quick handshake before sending any real data. During this handshake, your browser tells the server which website it is trying to reach. The server uses this information to pick the right security certificate.

Node.js has a function called SNICallback that handles this step. The problem: if a client sends an unexpected or malformed website name during this handshake, the function throws an error. Node.js doesn't catch that error. Instead it bubbles up uncaught, bypasses all the normal error handlers, and crashes the entire server process immediately.

No login needed. No special tools. Send one carefully crafted connection request to a Node.js HTTPS server running an unpatched version — the whole server goes down.

This is what security researchers call a one-shot denial of service. One request. One crash. And because Node.js doesn't restart automatically by default, the server stays down until someone manually intervenes.

This flaw existed because of an incomplete fix from an earlier patch. The previous fix addressed similar problems in two other callback functions — but missed SNICallback. The March 24 patch wraps SNICallback in a try/catch block, which means even if it throws an error, the server catches it gracefully instead of dying.

CVE-2026-21710 — One HTTP Header Crashes the Server

Every HTTP request — every time your browser asks a server for a webpage, an image, or an API response — includes a set of headers. Think of headers like the label on an envelope: they tell the server who sent the message, what format to expect, and other details about the request.

Header names can technically be almost anything. One valid header name that an attacker can send is __proto__ — two underscores, "proto", two underscores. This specific name is special in JavaScript, the language Node.js is built on. It points to the internal blueprint of every JavaScript object.

When Node.js received a request with a header named __proto__ and the application tried to access req.headersDistinct — a standard way developers read incoming headers — it triggered a TypeError internally. That error could not be caught by any standard error handler. The server process crashed immediately.

Again — no authentication. No special access. Any client anywhere on the internet could send this one header and bring down an unpatched Node.js server.

The Other Vulnerabilities — Still Worth Knowing

CVE-2026-21714 — Memory Leak via HTTP/2 (Medium)

HTTP/2 is the modern version of the web protocol that makes websites load faster. When a client using HTTP/2 sends a specific type of malformed message — called a WINDOW_UPDATE frame — Node.js handled it incorrectly and leaked a small amount of memory each time. One request leaks a tiny amount. Ten thousand requests leak enough to exhaust the server's memory and cause it to crash. This is called a slow bleed — not an instant crash, but a guaranteed one given enough traffic.

CVE-2026-21717 — HashDoS via JSON (Medium)

V8 is the JavaScript engine inside Node.js — the part that actually runs your code. V8 has an internal optimization where it stores certain types of values in a lookup table. If an attacker sends specially crafted JSON data — the standard data format used in almost every web API — they can force V8 to create thousands of collisions in that table. Like a filing cabinet where someone misfiled every document in the same drawer, the engine grinds to a halt trying to find anything. Performance collapses without an outright crash — but the effect on users is the same.

CVE-2026-21713 — Timing Attack on HMAC (Medium)

HMAC is a method for verifying that a message hasn't been tampered with — like a wax seal on a letter that proves it arrived unopened. Node.js was checking HMAC signatures using a comparison method that took slightly longer when more bytes matched. An attacker with very precise measurement tools could send thousands of slightly different signatures and measure the response times. Over enough attempts, the time differences reveal what the correct signature looks like. The fix replaces the comparison with a constant-time method that takes exactly the same amount of time regardless of how many bytes match.

MITRE ATT&CK Mapping

TacticTechnique IDTechnique NameHow It Applies
ImpactT1499.004Application or System ExploitationCVE-2026-21637 and CVE-2026-21710 — single unauthenticated request crashes Node.js process entirely
ImpactT1499.002Service Exhaustion FloodCVE-2026-21714 — repeated malformed HTTP/2 frames exhaust server memory over time
ImpactT1499.001OS Exhaustion FloodCVE-2026-21717 — crafted JSON input forces hash collisions causing CPU exhaustion
Credential AccessT1552Unsecured CredentialsCVE-2026-21713 — timing oracle leaks HMAC signature information through response time differences
Defense EvasionT1562Impair DefensesCVE-2026-21711/21715/21716 — permission model bypasses allow code to exceed its intended restrictions

Indicators of Compromise (IOCs)

# Node.js March 2026 Security Release — Detection and Remediation

# Check your current Node.js version
node --version
# If output is below these — update immediately:
# v20.20.2 (LTS Iron) / v22.22.2 / v24.14.1 / v25.8.2

# Update via Node Version Manager (nvm)
nvm install 20.20.2
nvm use 20.20.2

# Update via package manager (Ubuntu/Debian)
sudo apt update && sudo apt upgrade nodejs

# Update via package manager (macOS with Homebrew)
brew upgrade node

# Verify after update
node --version

# CVE-2026-21637 — Signs of exploitation
Alert: Repeated TLS handshake failures from external IPs
Alert: Node.js process crash logs showing uncaught exception
  during TLS handshake with unexpected servername values
Alert: Process restart loops on TLS servers

# CVE-2026-21710 — Signs of exploitation
Alert: Incoming HTTP requests with header name "__proto__"
Alert: Uncaught TypeError in Node.js logs
  referencing req.headersDistinct or headersDistinct property

# CVE-2026-21714 — Signs of exploitation
Alert: Steady memory growth in Node.js HTTP/2 servers
  with no corresponding load increase
Alert: Server memory exhaustion during sustained HTTP/2 traffic

# CVE-2026-21717 — Signs of exploitation
Alert: CPU spike on Node.js process following JSON.parse()
  on large or attacker-controlled input
Alert: Request processing time degradation not matching load

# General monitoring recommendation
Monitor: Node.js process restart count — any unexpected crash
  on a production server is now a security signal, not just an ops issue

SOC Alert Priorities

Priority 1 — Update every Node.js instance to a safe version today. CVE-2026-21637 and CVE-2026-21710 require zero authentication and cause immediate process crashes. Any internet-facing Node.js server running an unpatched version is one request away from going down. This is not a "patch in the next sprint" situation — update now.

Priority 2 — Check your Node.js process restart logs going back 48 hours. If you were running an unpatched version before today and your server restarted unexpectedly, that restart may have been exploitation of CVE-2026-21637 or CVE-2026-21710. Unexpected crashes on production Node.js servers in the last 48 hours should be treated as potential attack indicators, not routine events.

Priority 3 — Monitor for requests with __proto__ as a header name. This is the signature of CVE-2026-21710 exploitation. Add a WAF or API gateway rule to log or block HTTP requests containing __proto__ as a header name. Legitimate applications do not send this header.

Priority 4 — Watch for memory growth on HTTP/2 servers. CVE-2026-21714 is a slow bleed. If you run Node.js HTTP/2 servers, add memory monitoring with an alert threshold. Steady memory growth that doesn't correlate with normal traffic patterns is the early warning sign.

Priority 5 — Validate JSON input size and structure on all public APIs. CVE-2026-21717 is exploited through JSON.parse() on attacker-controlled input. Even after patching, add input validation to reject abnormally large or deeply nested JSON payloads before they reach your business logic. This is good practice regardless of Node.js version.

The ZyberWalls Perspective

Two of the nine vulnerabilities fixed on March 24 are incomplete fixes — meaning Node.js patched the same flaw, missed part of it, and is now patching the part they missed. CVE-2026-21637 is explicitly described as an incomplete fix of a prior CVE by the same identifier from January 2026. CVE-2026-21716 is an incomplete fix for a prior filesystem vulnerability.

This pattern of incomplete fixes is not unique to Node.js. It is one of the most consistent patterns in software security — a vulnerability is found, a fix is rushed out, and the fix addresses the obvious case but misses an edge case that attackers then exploit. The Oracle Identity Manager sibling vulnerability we covered earlier this month followed the same pattern. The Cisco FMC zero-day followed it too.

The lesson for your team is simple: when a patch is described as fixing a previously patched vulnerability, treat it as higher priority than a brand new flaw. The fact that attackers already know about the original vulnerability means they are actively looking for ways around the first fix.

Node.js powers too much of the internet to treat this as routine maintenance. Update today.

Microsoft Patch Tuesday March 2026: 79 Fixes and a Critical Database Risk

36 Days Inside Your Firewall: How Interlock Exploited Cisco Before Anyone Knew

Stay Alert. Stay Human. Stay Safe.
— ZyberWalls Research Team
No comments