SSRF

SSRF in Node.js (Express): remediation guide [CVE-2026-41423]

[Updated May 2026] Updated CVE-2026-41423

Overview

Real-world impact: CVE-2026-41423 describes an SSRF vulnerability in Angular's platform-server during server-side rendering. When an app uses SSR and passes a user-supplied URL into the SSR rendering paths, the URL parser normalizes backslashes to slashes for HTTP/HTTPS, which can cause the internal origin to appear to be the attacker’s domain. In such a state, relative HttpClient requests or PlatformLocation.hostname lookups can be redirected to the attacker-controlled server, potentially exposing internal APIs or metadata services. This class of vulnerability is CWE-918 and can be triggered through a crafted URL such as GET /evil.com/ HTTP/1.1. Although the CVE is scoped to Angular, the behavior is a general SSRF risk that also concerns Node.js apps using Express as the server in front of Angular SSR or similar SSR services. Exploitation: An attacker can submit a request that injects the URL into the SSR pipeline; since the server-side rendering path uses the URL as if it originated from the server, the origin can be misrepresented to the attacker’s domain. In Node.js/Express apps that proxy or invoke SSR engines, this can cause subsequent resource fetches to be directed at attacker-controlled hosts, potentially leaking internal endpoints or metadata. Remediation in Node.js/Express: 1) Upgrade Angular platform-server to patched versions (19.2.21, 20.3.19, 21.2.9, 22.0.0-next.8) per CVE-2026-41423. 2) In your Express app, avoid passing untrusted URLs to SSR components. 3) Implement strict URL validation: require absolute URLs with allowed protocols, parse with new URL(), and enforce an allowlist of trusted hosts. 4) Sanitize and canonicalize input; reject URLs that deviate from allowlist or are internal (localhost, 127.0.0.1). 5) If SSR cannot be decoupled from untrusted input, disable SSR for those requests or route through a trusted internal SSR service with strict egress filtering. 6) Add testing for SSRF vectors and monitor for anomalous SSR traffic. Note: This guide describes the patterns and fixes for SSRF in Node.js/Express apps interacting with SSR engines; adapt to your stack and ensure to apply the specific Angular CVE patch versions where relevant.

Affected Versions

Angular platform-server: prior to 19.2.21, 20.3.19, 21.2.9, and 22.0.0-next.8 (CVE-2026-41423)

Code Fix Example

Node.js (Express) API Security Remediation
/* Vulnerable pattern */
const express = require('express');
const app = express();

function renderWithSSR(target) {
  // In a real app this would invoke Angular's SSR engine
  return `<div>Rendered for ${target}</div>`;
}

app.get('/render', (req, res) => {
  const url = req.query.url; // untrusted input from client
  // Vulnerable: passes unvalidated URL straight to SSR engine
  const content = renderWithSSR(url);
  res.send(content);
});

/* Fixed: implement allowlist validation and URL normalization */
const allowedHosts = new Set(['trusted.example.com', 'myapp.local']);

app.get('/render-secure', (req, res) => {
  const input = req.query.url;
  try {
    const url = new URL(input);
    if (!['http:', 'https:'].includes(url.protocol)) {
      return res.status(400).send('Unsupported URL protocol');
    }
    if (!allowedHosts.has(url.host)) {
      return res.status(400).send('URL host not allowed');
    }
    const content = renderWithSSR(url.toString());
    res.send(content);
  } catch (e) {
    res.status(400).send('Invalid URL');
  }
});

CVE References

Choose which optional cookies to allow. You can change this any time.