Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain LAN or port-forwarded access to MagicMirror Socket.IO
-
DeliveryConnect to weather module namespace
-
ExploitEmit INIT_WEATHER with SECRET_* placeholder as instanceId
-
ExecutionServer expands placeholder to live credential
-
ImpactWEATHER_ERROR echoes expanded secret back to attacker
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires: (1) hideConfigSecrets must be set to true in the MagicMirror configuration - this is the feature that establishes the SECRET_* variable naming convention the attacker exploits; (2) the attacker must have Socket.IO connectivity to the MagicMirror server, which by default listens on the local network (AV:A); (3) at least one module namespace must be loaded that echoes attacker-controlled payload fields - the default weather module provides a confirmed echo path via INIT_WEATHER/WEATHER_ERROR, but other custom modules may also qualify. No authentication is required (PR:N per CVSS). Exploitation is limited by the adjacent-network constraint - the attacker must reach the Socket.IO port, typically TCP 8080, from the same subnet or via a forwarded port. The cors: allowAll configuration paradoxically blocks exploitation in the unpatched code because that branch skips secret expansion, but it introduces separate security concerns. |
| Impact | The CVSS 3.1 vector (AV:A/AC:L/PR:N/UI:N/S:U/C:L) scores 4.3, reflecting adjacent-network access without authentication - consistent with MagicMirror's typical LAN/home-network deployment model. While the CVSS score is moderate, the actual data sensitivity is higher than the C:L metric implies: SECRET_* variables are explicitly API tokens and service credentials, not generic low-value data. EPSS and KEV data are not provided in the intelligence feed; no confirmed active exploitation is noted. POC availability is not confirmed, though the GHSA advisory provides sufficient technical detail for a skilled attacker to construct a working exploit. The adjacent-network (AV:A) constraint meaningfully reduces internet-scale risk - exploitation requires a client already connected to the same local network or WebSocket endpoint. However, MagicMirror instances occasionally expose their Socket.IO interface beyond the local subnet when misconfigured or port-forwarded, which elevates practical risk in those deployments. The fix in 2.37.0 introduces a principled allow-list approach - per-module secret permissions derived from the redacted config - rather than blocking expansion wholesale, which is the correct architectural fix. Overall this is a genuine credential-disclosure risk worth patching promptly, but not an emergency requiring immediate compensating controls for air-gapped home deployments. |
| Exploit ScenarioDerived | An attacker on the same LAN as a MagicMirror instance connects to the Socket.IO weather module namespace and emits an INIT_WEATHER event with a payload where instanceId is set to SECRET_OPENWEATHERMAP_API_KEY (or any known SECRET_* variable name). The server-side dispatcher expands the placeholder before passing the payload to the weather helper, which copies the expanded instanceId and returns it in a WEATHER_ERROR notification - delivering the live API key directly to the attacker's socket listener. No authentication is required for this interaction. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 18, 2026
Secret environment variable disclosure in MagicMirror² before 2.37.0 allows adjacent network attackers to recover live SECRET_* credential values by exploiting a logic inversion in the socket dispatcher. The hideConfigSecrets feature is intended to redact environment secrets from browser-facing config responses, but the node_helper socket catch-all unconditionally expands SECRET_NAME placeholders in every inbound payload before routing to module helpers. Any unauthenticated client connected to a module namespace (such as the default weather helper) can submit a crafted INIT_WEATHER payload embedding a secret placeholder and receive the expanded real secret value echoed back in the WEATHER_ERROR response. No public exploit has been identified at time of analysis, and a vendor-released patch is available as of version 2.37.0.
RemediationAI
Upgrade MagicMirror² to version 2.37.0 or later, which is the vendor-released patch available at https://github.com/MagicMirrorOrg/MagicMirror/releases/tag/v2.37.0. The fix restricts secret expansion in the socket dispatcher to only the specific SECRET_* names that appear in a given module's own redacted config, eliminating the arbitrary expansion oracle. The patched replaceSecretPlaceholder() function accepts an allowedSecrets Set and leaves any non-permitted placeholder untouched. If immediate upgrade is not possible, a meaningful compensating control is to restrict Socket.IO access to localhost only (bind the server to 127.0.0.1 and avoid exposing port 8080 externally), which removes the adjacent-network attack surface; however, this may break legitimate remote dashboard use cases. Setting cors to allowAll is explicitly contraindicated - the original code skipped secret expansion under that setting, but it removes other protections. The patch commit is at https://github.com/MagicMirrorOrg/MagicMirror/commit/ca7b752025962441196e148f8c1bc04b90117979.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
MagicMirror² (npm package: magicmirror, CPE cpe:2.3:a:magicmirrororg:magicmirror:*:*:*:*:*:*:*:*) is a Node.js smart-mirror platform using Socket.IO namespaces for browser-to-server module communication. The root cause is CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) arising from a trust-boundary inversion. The server-side replaceSecretPlaceholder() function in js/server_functions.js was designed for outbound config redaction but was mistakenly applied to inbound socket payloads in js/node_helper.js (lines 91-99), effectively creating a bidirectional oracle. The SECRET_NAME syntax used by the redaction system also functions as an expansion trigger, meaning any payload containing that pattern is treated as a legitimate request for secret substitution. The default weather module's node_helper amplifies this by accepting attacker-controlled instanceId values via INIT_WEATHER and reflecting them back in WEATHER_ERROR, providing a reliable echo channel.
Know when Magicmirror gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Adjacent network access without authentication suffices; only confidentiality is impacted as secrets are read but no writes or availability effects occur.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
MagicMirror² is an open source modular smart mirror platform. Prior to 2.37.0, when hideConfigSecrets is enabled, the catch-all socket dispatcher in js/node_helper.js passes every inbound object payload through replaceSecretPlaceholder in js/server_functions.js before invoking socketNotificationReceived. A client connected to a loaded module namespace can submit a SECRET_API_KEY placeholder, causing the server to replace it with the corresponding process environment value. The default weather helper accepts INIT_WEATHER, copies the attacker-controlled instanceId, and returns it in WEATHER_ERROR, providing an echo path for the expanded secret. This reverses the intended one-way redaction boundary and can disclose API tokens, credentials, or service keys stored in SECRET_ variables. This issue is fixed in version 2.37.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in Magicmirror
View allServer-side request forgery in MagicMirror² versions prior to 2.37.0 allows unauthenticated remote attackers to make the
Unauthenticated Server-Side Request Forgery in MagicMirror² versions prior to 2.37.0 allows any network-reachable attack
Socket.IO namespace access control bypass in MagicMirror² prior to v2.37.0 allows unauthenticated adjacent-network clien
EUVD-2026-61079
GHSA-q4gh-4ffp-5cg8
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB