
Da RCE do Inspector MCPJam à root — CVE-2026-23744, divulgação de token do JupyterLab, execução de kernel e escalonamento de privilégios do OPSMCP
Este repositório destina-se exclusivamente à pesquisa de segurança autorizada, testes de penetração e fins educacionais. Não use as técnicas aqui descritas contra sistemas sem autorização explícita.
Do RCE no MCPJam Inspector ao root — CVE-2026-23744, divulgação do token do JupyterLab, execução de kernel e escalada de privilégios do OPSMCP.
Este repositório documenta uma cadeia de ataque Linux completa, de uma instância exposta do MCPJam Inspector ao acesso em nível de root.
A cadeia encadeia fragilidades em ferramentas de desenvolvimento, serviços locais, tratamento de credenciais e autorização de aplicações:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] Este repositório destina-se exclusivamente à pesquisa de segurança autorizada, testes de penetração e fins educacionais. Endereços-alvo, credenciais, tokens e outros valores específicos do ambiente ao longo deste documento foram ocultados ou substituídos por placeholders de laboratório.
| Etapa | Estágio |
|---|---|
| 1 | MCPJam Inspector exposto na rede |
| 2 | CVE-2026-23744 explorada |
| 3 | RCE inicial obtido |
| 4 | Token do JupyterLab divulgado |
| 5 | Execução do kernel Jupyter |
| 6 | Shell em nível de usuário |
| 7 | Revisão do código-fonte do OPSMCP |
| 8 | Credencial de API hardcoded descoberta |
| 9 | Funcionalidade administrativa oculta abusada |
| 10 | Credencial de root divulgada |
| 11 | root |
O reconhecimento inicial concentra-se em identificar serviços expostos externamente.
nmap -sC -sV -oN nmap_initial.txt TARGET
Em seguida, pode ser realizada uma varredura TCP completa:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
Serviços externos relevantes:
| Porta | Serviço | Função |
|---|---|---|
| 22 | SSH | Administração remota |
| 6274 | MCPJam Inspector | Superfície de ataque inicial |
Serviços vinculados apenas ao localhost:
| Porta | Serviço | Privilégio |
|---|---|---|
| 8888 | JupyterLab | Usuário |
| 5000 | OPSMCP | root |
O MCPJam Inspector acessível externamente na porta 6274 torna-se o ponto de entrada inicial.
A instância exposta do MCPJam Inspector é afetada pela CVE-2026-23744.
O MCPJam Inspector é destinado principalmente a servir como interface de desenvolvimento e teste para servidores MCP. A vulnerabilidade torna-se particularmente perigosa quando essa interface é exposta a uma rede não confiável — um fluxo de configuração vulnerável permite que dados controlados pelo atacante alcancem um caminho de execução de comandos.
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
A vulnerabilidade afeta as versões do MCPJam Inspector até a 1.4.2, inclusive. Para testes autorizados, uma prova de conceito pública pode ser usada para validar a vulnerabilidade contra o ambiente-alvo.
Após a exploração bem-sucedida, confirme o contexto de execução:
id
whoami
hostname
Uma vez obtido o acesso inicial, os serviços locais tornam-se visíveis.
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
A diferença de privilégio entre as duas aplicações internas é particularmente interessante.
O processo do JupyterLab foi iniciado com seu token de autenticação diretamente na linha de comando:
--ServerApp.token=<JUPYTER_TOKEN>
A linha de comando pode ser inspecionada por meio de:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
Isso demonstra um problema comum de gerenciamento de segredos:
Secret → Command-line argument → Process metadata → Local credential disclosure
O token recuperado fornece acesso à API Jupyter local.
O Jupyter expõe uma API REST para gerenciar kernels. Após autenticar com o token recuperado, um kernel pode ser criado por meio de:
POST /api/kernels
A resposta contém um UUID do kernel. Os kernels do Jupyter se comunicam por meio de WebSockets:
/api/kernels/<KERNEL_ID>/channels
O protocolo de mensagens do Jupyter usa uma mensagem execute_request para executar código Python:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
Isso estabelece a execução de Python sob a identidade do serviço Jupyter — neste ambiente, o kernel executa como Usuário.
MCPJam RCE → JupyterLab → User
Com um shell de usuário disponível, o próximo passo é examinar as aplicações instaladas localmente. A aplicação OPSMCP está localizada em:
/opt/opsmcp/
A revisão do código-fonte revela uma credencial de API embutida:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
A aplicação também mantém duas coleções de ferramentas:
Ferramentas visíveis
ops.system_statusops.list_servicesops.check_diskops.view_logsFerramentas ocultas
ops._admin_dumpops._debug_modeAs funções administrativas são particularmente interessantes porque não são retornadas pela enumeração normal de ferramentas.
Não documentado não significa inacessível.
O backend ainda registra as ferramentas ocultas e aceita seus nomes por meio do mecanismo genérico de execução de ferramentas.
A aplicação autentica as solicitações usando uma chave de API:
X-API-Key: <OPSMCP_API_KEY>