
A proof-of-concept for CVE-2026-39987
Aviso Legal Este script é APENAS para fins educacionais e de testes autorizados. O uso não autorizado desta ferramenta contra sistemas sem permissão explícita é ILEGAL. O autor não é responsável por qualquer uso indevido destas informações.
Versões do Marimo anteriores a 0.23.0 possuem uma vulnerabilidade crítica de execução remota de comandos (RCE) sem autenticação prévia. O endpoint /terminal/wsdoes não implementa controles de acesso adequados, permitindo que um atacante não autenticado obtenha acesso interativo completo ao shell do sistema.
| Detalhes | Informações |
|---|---|
| CVE | CVE-2026-39987 |
| Severidade | CRITICAL |
| Pontuação CVSS | 9.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| Tipo | Execução Remota de Código (RCE) sem autenticação prévia |
| Vetor | WebSocket (/terminal/ws) |
| Produto Afetado | Marimo < 0.23.0 |
| Correção | Marimo ≥ 0.23.0 |
http.favicon.hash:-1864630356
services.http.response.favicons.hashes: -1864630356
-1864630356/api/versionRequer Python 3.10+. As dependências são gerenciadas com uv, da Astral.
# install uv (skip if already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
uv pip install -r requirements.txt
uv run poc.py -t <target_url>
-t, --target_url (obrigatório): URI WebSocket do endpoint /terminal/ws do alvo.uv run poc.py -t wss://<target-host>/terminal/ws
Uma vez conectado, você obtém uma sessão pty interativa. Comandos extras disponíveis localmente (nunca enviados ao shell remoto como digitados):
Pressione Ctrl+C para interromper/sair.
>= 0.23.0, que corrige a ausência de controle de acesso em /terminal/ws.localhost ou a uma interface interna e coloque-o atrás de uma VPN/bastion para acesso remoto./terminal/ws e outras rotas de API./terminal/ws e atividades de shell não autenticadas nos logs do servidor; os dorks do Shodan/Censys acima também podem ser usados de forma defensiva para encontrar suas próprias instâncias expostas e sem correção.| Comando | Descrição |
|---|
.upload | Abre um prompt local para informar um caminho de arquivo local e o destino remoto e, em seguida, envia o arquivo. |
!upload <local_path> <remote_path> | O mesmo que acima, em uma única linha. |
!download <remote_path> <local_path> | Baixa um arquivo do alvo para sua máquina local. |
/exit, /bye | Encerra a sessão localmente. |