
# Laboratorio Docker per confrontare build vulnerabili e corrette di MCPJam Inspector per CVE-2026-23744, dimostrando le differenze di binding di rete e l'esposizione API per ricerca sulla sicurezza a scopo educativo.
Questo repository è un piccolo laboratorio Docker per confrontare una build vulnerabile rispetto a una corretta (patched) di MCPJam Inspector per la CVE-2026-23744.
È pensato per l'apprendimento e per costruire un portfolio di sicurezza pubblico: configurazione rapida, prove chiare e screenshot.
⚠️ Etica / ambito: Testa solo su sistemi di tua proprietà o per cui hai esplicita autorizzazione. Questo repository è per riproduzione locale e documentazione.
/api/mcp/connect) esiste e risponde senza una sfida di autenticazione nella configurazione vulnerabile.Questo corrisponde all'advisory del vendor / ai report pubblici:
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
└── docs/
└── (gli screenshot vanno qui)
Build ed esecuzione di entrambi i container:
docker compose up -d --build
Verifica che siano attivi:
docker compose ps
Risultato atteso:
inspector_vuln_142 pubblicato su 127.0.0.1:6274inspector_patched_143 pubblicato su 127.0.0.1:6275 (ma non dovrebbe essere raggiungibile dall'host)
L'endpoint è presente e risponde con un errore di validazione quando mancano i campi obbligatori:
curl -i -X POST http://127.0.0.1:6274/api/mcp/connect \
-H 'Content-Type: application/json' \
-d '{}'
Atteso HTTP/1.1 400 e qualcosa come:
{"success":false,"error":"Failed to parse request body","details":"Unexpected end of JSON input"}
All'interno dei container, verifica quale indirizzo è in ascolto sulla porta 6274:
# vulnerabile
docker exec -it inspector_vuln_142 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
# corretto
docker exec -it inspector_patched_143 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
Risultato atteso:
0.0.0.0:6274127.0.0.1:6274
Anche se mappiamo 127.0.0.1:6275 -> container:6274, il container corretto ascolta solo sulla propria interfaccia loopback. Quindi dall'host dovresti vedere una chiusura della connessione / risposta vuota.
curl -v http://127.0.0.1:6275/
Atteso: non raggiungibile (questa è la mitigazione che funziona).
Per dimostrare che la UI corretta funziona ancora, esegui curl dall'interno del container:
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/"
Atteso: HTTP/1.1 200.


Durante i test locali sul container vulnerabile, ho collegato strace al processo server di Inspector e ho osservato la generazione di un processo figlio e la chiamata a execve().
Intenzionalmente non includo qui un payload exploit pronto all'uso.
Cosa catturare:
execve("/bin/sh", ["sh","-c", "..."], ...) = 0
execve("/usr/bin/...", [...], ...) = 0
l'uscita normale del processo figlio (status 0)

Questo repository è per ricerca difensiva, istruzione e verifica riproducibile in un ambiente controllato. Non usarlo contro sistemi che non possiedi o per cui non hai il permesso di testare.