CVE-2026-63641
MagicMirror Socket.IO module namespaces bypass configured IP whitelist and allow unauthenticated server-side actions
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, MagicMirror applies ipWhitelist only as Express middleware, while the Socket.IO server in js/server.js is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented non-loopback deployment that relies on ipWhitelist, an unauthenticated adjacent-network client can connect directly to module Socket.IO namespaces, and js/node_helper.js dispatches arbitrary events and payloads to socketNotificationReceived. The default newsfeed and calendar helpers can make server-side requests to attacker-selected URLs, while the default updatenotification helper can reach child_process.exec when a third-party module update is pending and the attacker supplies an update command through the socket CONFIG path. This can expose internal services, manipulate module-helper state, and conditionally execute commands. This issue is fixed in version 2.37.0.
Attack profile
How easy it is to exploit
- Attack vector
- Adjacent network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
2.3
MagicMirror Socket.IO module namespaces bypass configured IP whitelist and allow unauthenticated server-side actions
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, MagicMirror applies ipWhitelist only as Express middleware, while the Socket.IO server in js/server.js is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented non-loopback deployment that relies on ipWhitelist, an unauthenticated adjacent-network client can connect directly to module Socket.IO namespaces, and js/node_helper.js dispatches arbitrary events and payloads to socketNotificationReceived. The default newsfeed and calendar helpers can make server-side requests to attacker-selected URLs, while the default updatenotification helper can reach child_process.exec when a third-party module update is pending and the attacker supplies an update command through the socket CONFIG path. This can expose internal services, manipulate module-helper state, and conditionally execute commands. This issue is fixed in version 2.37.0.
- Record
CVE-2026-63641- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L - Weakness
- CWE-284
- Updated
- 2026-11-02
EUVDEUVD-2026-61070
2.3
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, MagicMirror applies ipWhitelist only as Express middleware, while the Socket.IO server in js/server.js is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented non-loopback deployment that relies on ipWhitelist, an unauthenticated adjacent-network client can connect directly to module Socket.IO namespaces, and js/node_helper.js dispatches arbitrary events and payloads to socketNotificationReceived. The default newsfeed and calendar helpers can make server-side requests to attacker-selected URLs, while the default updatenotification helper can reach child_process.exec when a third-party module update is pending and the attacker supplies an update command through the socket CONFIG path. This can expose internal services, manipulate module-helper state, and conditionally execute commands. This issue is fixed in version 2.37.0.
- Record
EUVD-2026-61070- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-w26r-fwg8-rcp3
2.3
MagicMirror Socket.IO module namespaces bypass configured IP whitelist and allow unauthenticated server-side actions
Summary
MagicMirror applies ipWhitelist only as Express middleware, but the Socket.IO server is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented common deployment where MagicMirror listens on a non-loopback interface but expects ipWhitelist to restrict access, an untrusted network client can connect directly to module Socket.IO namespaces and send arbitrary module-helper notifications. This allows unauthenticated server-side requests through default modules and can reach command execution in the default updatenotification helper when a third-party module update is pending and the attacker supplies the update command through the trusted socket configuration path.
Details
The affected product is the npm package/application magicmirror at version 2.36.0, tested at commit fb41d24ef522e91e802e2a623ff6afbddeb3c9d8 from https://github.com/MagicMirrorOrg/MagicMirror.git.
Default committed settings bind to loopback and allow loopback only (js/defaults.js:8-13), so the remote network impact requires a documented common configuration where the server is reachable beyond loopback. The shipped sample explicitly documents non-loopback binding and IP allowlist behavior: config/config.js.sample:11-20 says address may be another interface or 0.0.0.0/::, and ipWhitelist controls allowed clients.
The trust-boundary issue is that Socket.IO is configured before and outside the Express middleware chain:
js/server.js:42-50creates Socket.IO directly on the HTTP(S) server withcors.origin: /.*$/.js/server.js:89-90appliesipAccessControl(config.ipWhitelist)only withapp.use(...), which protects Express routes and static files but not Socket.IO handshakes or namespaces.- A search of runtime files found no
allowRequest,io.use(...), handshake IP check, or namespace authentication for Socket.IO; the only relevant matches werejs/server.js:44andjs/server.js:90. js/node_helper.js:88-103registers every module namespace and dispatches every socket event and payload directly tosocketNotificationReceived(...).
Once a client can reach the Socket.IO server, the following default-module server-side actions are reachable without an equivalent IP whitelist or module-authentication check:
defaultmodules/newsfeed/node_helper.js:12-17acceptsCHECK_ARTICLE_URLand callscheckArticleUrl(payload.url).defaultmodules/newsfeed/node_helper.js:25-38performsfetch(url, { method: "HEAD" })on the supplied URL and sends the result back.defaultmodules/calendar/node_helper.js:13-24acceptsADD_CALENDAR/FETCH_CALENDARsocket messages.defaultmodules/calendar/node_helper.js:40-58accepts an arbitrary syntactically valid calendar URL and creates a fetcher.defaultmodules/calendar/calendarfetcher.js:35-44passes the URL intoHTTPFetcher, whose fetch sink isjs/http_fetcher.js:286-294.defaultmodules/updatenotification/node_helper.js:46-68acceptsCONFIG,MODULES, andSCAN_UPDATESnotifications and trusts the socket-provided config/module list.defaultmodules/updatenotification/update_helper.js:43-47stores update commands from config.defaultmodules/updatenotification/update_helper.js:96-116executes the selected update command withchild_process.execin the module directory.defaultmodules/updatenotification/update_helper.js:221-227looks up the command fromconfig.updatesby module name.
False-positive screening performed:
- Express HTTP routes are protected by
ipAccessControl(config.ipWhitelist)atjs/server.js:89-90; this does not protect Socket.IO because Socket.IO is attached to the raw HTTP server and no Socket.IO middleware was found. - The explicit
/corsHTTP endpoint has separate SSRF mitigations (js/server_functions.js:47-117) and is disabled by default (js/defaults.js:14); the confirmed request primitive here uses module-helper socket paths,…
- Record
GHSA-w26r-fwg8-rcp3- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L - Weakness
- CWE-284
- Updated
- 2026-11-02
NVD
2.3
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, MagicMirror applies ipWhitelist only as Express middleware, while the Socket.IO server in js/server.js is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented non-loopback deployment that relies on ipWhitelist, an unauthenticated adjacent-network client can connect directly to module Socket.IO namespaces, and js/node_helper.js dispatches arbitrary events and payloads to socketNotificationReceived. The default newsfeed and calendar helpers can make server-side requests to attacker-selected URLs, while the default updatenotification helper can reach child_process.exec when a third-party module update is pending and the attacker supplies an update command through the socket CONFIG path. This can expose internal services, manipulate module-helper state, and conditionally execute commands. This issue is fixed in version 2.37.0.
- Record
CVE-2026-63641- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Weakness
- CWE-284
- Updated
- 2026-11-02
OSV
2.3
MagicMirror Socket.IO module namespaces bypass configured IP whitelist and allow unauthenticated server-side actions
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, MagicMirror applies ipWhitelist only as Express middleware, while the Socket.IO server in js/server.js is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented non-loopback deployment that relies on ipWhitelist, an unauthenticated adjacent-network client can connect directly to module Socket.IO namespaces, and js/node_helper.js dispatches arbitrary events and payloads to socketNotificationReceived. The default newsfeed and calendar helpers can make server-side requests to attacker-selected URLs, while the default updatenotification helper can reach child_process.exec when a third-party module update is pending and the attacker supplies an update command through the socket CONFIG path. This can expose internal services, manipulate module-helper state, and conditionally execute commands. This issue is fixed in version 2.37.0.
- Record
CVE-2026-63641- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L - Weakness
- CWE-284
- Updated
- 2026-11-02
OSVGHSA-w26r-fwg8-rcp3
2.3
MagicMirror Socket.IO module namespaces bypass configured IP whitelist and allow unauthenticated server-side actions
Summary
MagicMirror applies ipWhitelist only as Express middleware, but the Socket.IO server is attached directly to the HTTP server without equivalent IP allowlist, origin, or namespace authentication checks. In a documented common deployment where MagicMirror listens on a non-loopback interface but expects ipWhitelist to restrict access, an untrusted network client can connect directly to module Socket.IO namespaces and send arbitrary module-helper notifications. This allows unauthenticated server-side requests through default modules and can reach command execution in the default updatenotification helper when a third-party module update is pending and the attacker supplies the update command through the trusted socket configuration path.
Details
The affected product is the npm package/application magicmirror at version 2.36.0, tested at commit fb41d24ef522e91e802e2a623ff6afbddeb3c9d8 from https://github.com/MagicMirrorOrg/MagicMirror.git.
Default committed settings bind to loopback and allow loopback only (js/defaults.js:8-13), so the remote network impact requires a documented common configuration where the server is reachable beyond loopback. The shipped sample explicitly documents non-loopback binding and IP allowlist behavior: config/config.js.sample:11-20 says address may be another interface or 0.0.0.0/::, and ipWhitelist controls allowed clients.
The trust-boundary issue is that Socket.IO is configured before and outside the Express middleware chain:
js/server.js:42-50creates Socket.IO directly on the HTTP(S) server withcors.origin: /.*$/.js/server.js:89-90appliesipAccessControl(config.ipWhitelist)only withapp.use(...), which protects Express routes and static files but not Socket.IO handshakes or namespaces.- A search of runtime files found no
allowRequest,io.use(...), handshake IP check, or namespace authentication for Socket.IO; the only relevant matches werejs/server.js:44andjs/server.js:90. js/node_helper.js:88-103registers every module namespace and dispatches every socket event and payload directly tosocketNotificationReceived(...).
Once a client can reach the Socket.IO server, the following default-module server-side actions are reachable without an equivalent IP whitelist or module-authentication check:
defaultmodules/newsfeed/node_helper.js:12-17acceptsCHECK_ARTICLE_URLand callscheckArticleUrl(payload.url).defaultmodules/newsfeed/node_helper.js:25-38performsfetch(url, { method: "HEAD" })on the supplied URL and sends the result back.defaultmodules/calendar/node_helper.js:13-24acceptsADD_CALENDAR/FETCH_CALENDARsocket messages.defaultmodules/calendar/node_helper.js:40-58accepts an arbitrary syntactically valid calendar URL and creates a fetcher.defaultmodules/calendar/calendarfetcher.js:35-44passes the URL intoHTTPFetcher, whose fetch sink isjs/http_fetcher.js:286-294.defaultmodules/updatenotification/node_helper.js:46-68acceptsCONFIG,MODULES, andSCAN_UPDATESnotifications and trusts the socket-provided config/module list.defaultmodules/updatenotification/update_helper.js:43-47stores update commands from config.defaultmodules/updatenotification/update_helper.js:96-116executes the selected update command withchild_process.execin the module directory.defaultmodules/updatenotification/update_helper.js:221-227looks up the command fromconfig.updatesby module name.
False-positive screening performed:
- Express HTTP routes are protected by
ipAccessControl(config.ipWhitelist)atjs/server.js:89-90; this does not protect Socket.IO because Socket.IO is attached to the raw HTTP server and no Socket.IO middleware was found. - The explicit
/corsHTTP endpoint has separate SSRF mitigations (js/server_functions.js:47-117) and is disabled by default (js/defaults.js:14); the confirmed request primitive here uses module-helper socket paths,…
- Record
GHSA-w26r-fwg8-rcp3- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:L/SC:L/SI:L/SA:L - Weakness
- CWE-284
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
magicmirrornpm |
before 2.37.0 | 2.37.0 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-63641 is a low vulnerability (CVSS 2.3) in Magicmirrororg Magicmirror, published August 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.43%, the 37th percentile. Fixed in magicmirror 2.37.0.
References
github.com/MagicMirrorOrg/MagicMirror/security/advisories/GHSA-w26r-fwg8-rcp3
github.com/MagicMirrorOrg/MagicMirror/pull/4169
github.com/MagicMirrorOrg/MagicMirror/commit/58c2a5e675a7d367b64d72e1d35680d202ff5c9f
github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.37.0
github.com/advisories/GHSA-w26r-fwg8-rcp3
github.com/CVEProject/cvelistV5/tree/main/cves/2026/63xxx/CVE-2026-63641.json
nvd.nist.gov/vuln/detail/CVE-2026-63641
github.com/MagicMirrorOrg/MagicMirror
Left out here: the rest of 2 source descriptions. The JSON record has them.