
Da MCPJam Inspector RCE a root — CVE-2026-23744, divulgazione del token JupyterLab, esecuzione del kernel ed escalation dei privilegi OPSMCP
Questo repository è destinato esclusivamente a ricerca sulla sicurezza autorizzata, test di penetrazione e scopi didattici. Non utilizzare le tecniche qui descritte contro sistemi senza autorizzazione esplicita.
Dalla RCE di MCPJam Inspector a root — CVE-2026-23744, divulgazione del token di JupyterLab, esecuzione del kernel ed escalation dei privilegi di OPSMCP.
Questo repository documenta una catena di attacco Linux completa, da un'istanza esposta di MCPJam Inspector fino all'accesso di livello root.
La catena combina vulnerabilità presenti negli strumenti di sviluppo, nei servizi locali, nella gestione delle credenziali e nell'autorizzazione delle applicazioni:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] Questo repository è destinato esclusivamente a ricerca sulla sicurezza autorizzata, test di penetrazione e scopi didattici. Gli indirizzi target, le credenziali, i token e gli altri valori specifici dell'ambiente presenti in questo documento sono oscurati o sostituiti con segnaposto di laboratorio.
| Passo | Fase |
|---|---|
| 1 | MCPJam Inspector esposto sulla rete |
| 2 | CVE-2026-23744 sfruttata |
| 3 | RCE iniziale ottenuta |
| 4 | Token di JupyterLab divulgato |
| 5 | Esecuzione del kernel di Jupyter |
| 6 | Shell a livello utente |
| 7 | Analisi del codice sorgente di OPSMCP |
| 8 | Credenziale API hardcoded scoperta |
| 9 | Funzionalità amministrativa nascosta abusata |
| 10 | Credenziale di root divulgata |
| 11 | root |
La ricognizione iniziale si concentra sull'identificazione dei servizi esposti esternamente.
nmap -sC -sV -oN nmap_initial.txt TARGET
È quindi possibile eseguire una scansione TCP completa:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
Servizi esterni rilevanti:
| Porta | Servizio | Ruolo |
|---|---|---|
| 22 | SSH | Amministrazione remota |
| 6274 | MCPJam Inspector | Superficie di attacco iniziale |
Servizi in ascolto solo su localhost:
| Porta | Servizio | Privilegio |
|---|---|---|
| 8888 | JupyterLab | Utente |
| 5000 | OPSMCP | root |
L'istanza di MCPJam Inspector accessibile esternamente sulla porta 6274 diventa il punto di ingresso iniziale.
L'istanza esposta di MCPJam Inspector è affetta da CVE-2026-23744.
MCPJam Inspector è progettato principalmente come interfaccia di sviluppo e test per i server MCP. La vulnerabilità diventa particolarmente pericolosa quando questa interfaccia è esposta a una rete non fidata: un flusso di configurazione vulnerabile consente a dati controllati dall'attaccante di raggiungere un percorso di esecuzione dei comandi.
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
La vulnerabilità interessa le versioni di MCPJam Inspector fino alla 1.4.2 inclusa. Per test autorizzati, è possibile utilizzare un proof of concept pubblico per validare la vulnerabilità nell'ambiente target.
Dopo lo sfruttamento riuscito, conferma il contesto di esecuzione:
id
whoami
hostname
Una volta ottenuto il primo accesso, i servizi locali diventano visibili.
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
La differenza di privilegi tra le due applicazioni interne è particolarmente interessante.
Il processo JupyterLab è stato avviato con il token di autenticazione direttamente nella riga di comando:
--ServerApp.token=<JUPYTER_TOKEN>
La riga di comando può essere ispezionata tramite:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
Questo dimostra un problema comune di gestione dei segreti:
Secret → Command-line argument → Process metadata → Local credential disclosure
Il token recuperato fornisce accesso all'API Jupyter locale.
Jupyter espone un'API REST per la gestione dei kernel. Dopo l'autenticazione con il token recuperato, è possibile creare un kernel tramite:
POST /api/kernels
La risposta contiene un UUID del kernel. I kernel di Jupyter comunicano tramite WebSocket:
/api/kernels/<KERNEL_ID>/channels
Il protocollo di messaggistica di Jupyter utilizza un messaggio execute_request per eseguire codice Python:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
Questo consente l'esecuzione di Python sotto l'identità del servizio Jupyter — in questo ambiente, il kernel viene eseguito come User.
MCPJam RCE → JupyterLab → User
Con una shell utente disponibile, il passo successivo consiste nell'esaminare le applicazioni installate localmente. L'applicazione OPSMCP si trova in:
/opt/opsmcp/
L'esame del codice sorgente rivela una credenziale API incorporata:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
L'applicazione mantiene inoltre due raccolte di strumenti:
Strumenti visibili
ops.system_statusops.list_servicesops.check_diskops.view_logsStrumenti nascosti
ops._admin_dumpops._debug_modeLe funzioni amministrative sono particolarmente interessanti perché non vengono restituite tramite la normale enumerazione degli strumenti.
Non documentato non significa non accessibile.
Il backend registra comunque gli strumenti nascosti e accetta i loro nomi tramite il meccanismo generico di esecuzione degli strumenti.