
Proof-of-concept de exploit para CVE-2026-39987, um RCE de pré-autenticação no endpoint WebSocket /terminal/ws do Marimo que fornece um shell interativo sem credenciais.
CVSS 4.0: 9.3 (Crítico) · AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
Afeta: marimo <= 0.20.4 · Corrigido: 0.23.0 · CWE-306 (Autenticação Ausente)
Advisory: GHSA-2679-6mx9-h9xc · Correção: marimo-team/marimo@c24d480
O endpoint WebSocket /terminal/ws (marimo/_server/api/endpoints/terminal.py)
apenas verifica o modo da sessão (EDIT) e o suporte da plataforma antes de aceitar a
conexão e chamar pty.fork(). Ele não possui nem o decorador @requires(...)
nem uma chamada a validate_auth().
Comparação medida na 0.20.4:
@requires(...) em 18 endpoints./ws (notebook) -> 2 chamadas a .validate_auth()terminal.py -> 0 @requires, 0 validate_auth. <-- a falha.O middleware AuthBackend protege o HTTP e o websocket /ws, mas
/terminal/ws aceita a conexão sem cookie e sem token e cria um
shell PTY com os privilégios do processo marimo.
marimo edit ...), que é o modo padrão do editor.pty (Linux/macOS; Windows e Pyodide não são afetados).Um atacante que consiga alcançar um servidor marimo edit pela rede (comum em
implantações remotas / em contêineres, frequentemente executadas como root) obtém um
shell interativo sem se autenticar: roubo de credenciais (cat .env), movimento lateral,
implantação de malware. Explorado em ambiente real < 10 h após a divulgação; adicionado ao
catálogo KEV da CISA em 2026-04-23.
pip install "marimo==0.20.4" websockets
marimo edit demo.py --headless --port 2718 --token --token-password SECRET
python exploit.py ws://127.0.0.1:2718 "id; cat /etc/passwd"
exploit.py não envia token, cookie nem cabeçalho Authorization. Ele envia o
comando como texto bruto + "\r" (Enter), exatamente como um usuário o digitaria no terminal.
/ws -> 403 (a autenticação FUNCIONA)./terminal/ws SEM token -> ACEITO. Executado no servidor:
uid=1000() gid=1000() ...
Linux ...
e escreveu /tmp/cve_2026_39987_proof.txt -> RCE confirmado.Atualize para marimo >= 0.23.0. Mitigação temporária: não exponha marimo edit
a redes não confiáveis; coloque o editor atrás de um proxy autenticado; execute-o
sem privilégios / em um contêiner sem segredos.
Apenas para testes de segurança autorizados e uso educacional. Execute-o somente contra sistemas que você possui ou tem permissão explícita para testar.