
Laboratório Docker para comparar builds vulneráveis e corrigidas do MCPJam Inspector para a CVE-2026-23744, demonstrando diferenças de vinculação de rede e exposição de API para pesquisa educacional em segurança.
Este repositório é um pequeno laboratório Docker para comparar uma build vulnerável vs corrigida do MCPJam Inspector para a CVE-2026-23744.
Ele foi feito para aprendizado e para construir um portfólio público de segurança: configuração rápida, evidências claras e capturas de tela.
⚠️ Ética / escopo: Teste apenas em sistemas que você possui ou para os quais tenha permissão explícita. Este repositório é para reprodução local e documentação.
/api/mcp/connect) existe e responde sem desafio de autenticação na configuração vulnerável.Isso corresponde ao aviso do fornecedor / relatórios públicos:
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
└── docs/
└── (capturas de tela vão aqui)
Construa e execute ambos os contêineres:
docker compose up -d --build
Verifique se eles estão ativos:
docker compose ps
Esperado:
inspector_vuln_142 publicado em 127.0.0.1:6274inspector_patched_143 publicado em 127.0.0.1:6275 (mas não deve ser acessível a partir do host)
O endpoint está presente e responde com um erro de validação quando os campos obrigatórios estão ausentes:
curl -i -X POST http://127.0.0.1:6274/api/mcp/connect \
-H 'Content-Type: application/json' \
-d '{}'
Espere HTTP/1.1 400 e algo como:
{"success":false,"error":"Failed to parse request body","details":"Unexpected end of JSON input"}
Dentro dos contêineres, verifique qual endereço está escutando na porta 6274:
# vulnerável
docker exec -it inspector_vuln_142 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
# corrigido
docker exec -it inspector_patched_143 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
Resultado esperado:
0.0.0.0:6274127.0.0.1:6274
Mesmo mapeando 127.0.0.1:6275 -> container:6274, o contêiner corrigido escuta apenas na sua própria interface de loopback. Portanto, a partir do host, você deve ver um fechamento de conexão / resposta vazia.
curl -v http://127.0.0.1:6275/
Esperado: não acessível (esta é a mitigação funcionando).
Para provar que a UI corrigida ainda funciona, use curl de dentro do contêiner:
docker exec -it inspector_patched_143 sh -lc "apk add --no-cache curl >/dev/null 2>&1; curl -i http://127.0.0.1:6274/"
Esperado: HTTP/1.1 200.


Durante testes locais no contêiner vulnerável, anexei o strace ao processo do servidor Inspector e observei ele gerando um processo filho e chamando execve().
Intencionalmente não estou incluindo um payload de exploit pronto para execução aqui.
O que capturar:
execve("/bin/sh", ["sh","-c", "..."], ...) = 0
execve("/usr/bin/...", [...], ...) = 0
o processo filho saindo normalmente (status 0)

Este repositório é para pesquisa defensiva, educação e verificação reproduzível em um ambiente controlado. Não o use contra sistemas que você não possui ou para os quais não tem permissão de teste.