Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/rootdirective-sec/cve-2026-39987-lab
Sicurezza dei ContenitoriAnalisi delle VulnerabilitàExploitSicurezza WebApprendimento e FormazioneLab e Pratica
GitHubrootdirective-sec/cve-2026-39987-lab

CVE-2026-39987-Lab

# Laboratorio Docker locale che riproduce CVE-2026-39987, una RCE pre-autenticazione nel WebSocket del terminale di marimo. Confronta le versioni vulnerabile e corretta con script PoC a minimo impatto per ricerca sulla sicurezza a scopo didattico.

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Vedi Repository
13 mesi faNon ancora revisionato

CVE-2026-39987 — Laboratorio RCE WebSocket del Terminale Pre-Auth in marimo

Laboratorio Docker solo-locale per riprodurre e comprendere CVE-2026-39987 in marimo. Questo progetto confronta un servizio marimo vulnerabile con un servizio marimo patchato affiancati, quindi dimostra la differenza utilizzando uno script di prova a danno minimo.


Sintesi Esecutiva

CVE-2026-39987 è una vulnerabilità critica di esecuzione remota di codice pre-autenticazione in marimo, un framework Python reattivo per notebook.

Il comportamento vulnerabile risiede nell'endpoint WebSocket del terminale:

root@kitploit:~
/terminal/ws

Nelle versioni interessate, questo endpoint può essere raggiunto senza autenticazione valida e può creare una sessione di terminale interattiva. Un attaccante non autenticato che riesce a raggiungere un server di modifica marimo vulnerabile può eseguire comandi con i privilegi del processo marimo.

Questo laboratorio riproduce la vulnerabilità in un ambiente Docker locale controllato:

ServizioVersioneURLComportamento atteso
vulnmarimo 0.20.4http://127.0.0.1:8081/terminal/ws accetta connessioni WebSocket non autenticate
patchedmarimo 0.23.0http://127.0.0.1:8082/terminal/ws rifiuta connessioni WebSocket non autenticate con 403 Forbidden

L'obiettivo non è fornire un exploit weaponizzato. L'obiettivo è mostrare la differenza di sicurezza osservabile tra versioni vulnerabili e patchate utilizzando prove riproducibili e solo locali.


Panoramica della Vulnerabilità

Componente interessato

Il componente interessato è l'endpoint WebSocket del terminale di marimo:

root@kitploit:~
/terminal/ws

Questo endpoint viene utilizzato dall'ambiente di modifica di marimo per fornire funzionalità di terminale tramite una sessione WebSocket collegata al browser.

Causa principale

L'endpoint vulnerabile accettava connessioni WebSocket senza applicare gli stessi controlli di autenticazione previsti per le funzionalità di modifica protette di marimo.

La differenza importante è:

root@kitploit:~
comportamento vulnerabile:
  un client non autenticato può connettersi a /terminal/ws
  viene creata una sessione di terminale
  i comandi possono essere inviati tramite il WebSocket

comportamento patchato:
  un client non autenticato viene rifiutato
  l'handshake WebSocket fallisce con 403 Forbidden
  la sessione di terminale non viene creata

La patch aggiunge la validazione dell'autenticazione al flusso WebSocket del terminale prima di consentire l'instaurazione di una sessione di terminale.

Impatto

Se un server di modifica marimo vulnerabile è esposto a una rete raggiungibile, un attaccante non autenticato può eseguire comandi come l'utente che esegue il processo marimo.

In questo laboratorio, il processo marimo viene eseguito intenzionalmente come utente non-root a bassi privilegi:

root@kitploit:~
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)

Questo mantiene la dimostrazione più sicura pur dimostrando comunque la vulnerabilità.


Obiettivi del Laboratorio

Questo laboratorio è progettato per dimostrare tre cose:

  1. La versione vulnerabile accetta connessioni WebSocket non autenticate a /terminal/ws.
  2. Un comando benigno può essere eseguito tramite quel WebSocket del terminale non autenticato.
  3. La versione patchata rifiuta lo stesso tentativo WebSocket non autenticato con 403 Forbidden.

Il laboratorio evita intenzionalmente comandi distruttivi, persistenza, reverse shell, estrazione di credenziali o qualsiasi target esposto a internet.


Struttura del Repository

root@kitploit:~
.
├── docker-compose.yml
├── vuln/
│   ├── Dockerfile
│   └── notebook.py
├── patched/
│   ├── Dockerfile
│   └── notebook.py
├── poc/
│   ├── poc.py
│   ├── rce_poc.py
│   └── requirements.txt
├── SAFETY.md
├── README.md
└── .gitignore

File importanti


Architettura del Laboratorio

root@kitploit:~
Macchina host

127.0.0.1:8081  ─────►  contenitore vuln
                         marimo 0.20.4
                         /terminal/ws accetta WebSocket non autenticato

127.0.0.1:8082  ─────►  contenitore patched
                         marimo 0.23.0
                         /terminal/ws rifiuta WebSocket non autenticato

Entrambi i servizi espongono la porta interna 2718 di marimo, ma le porte host sono diverse:

root@kitploit:~
vuln    -> 127.0.0.1:8081
patched -> 127.0.0.1:8082

I servizi sono vincolati solo a 127.0.0.1. Non sono destinati a essere esposti a una LAN o a internet.


Note sull'Indurimento Docker

I contenitori sono configurati con diverse protezioni dove possibile:

root@kitploit:~
- vincolare le porte solo a 127.0.0.1
- eseguire come utente non-root
- rimuovere le capability Linux
- abilitare no-new-privileges
- utilizzare un filesystem root di sola lettura
- fornire solo posizioni di scrittura tmpfs limitate
- isolare i servizi all'interno di una rete bridge Docker dedicata

Questi controlli non rimuovono la vulnerabilità dal servizio vulnerabile. Riducono il raggio d'esplosione della dimostrazione locale.


Prerequisiti

Assunzioni testate:

root@kitploit:~
- Linux x86_64 o macOS con Docker Desktop
- Docker Compose v2
- Python 3.9+
- Test solo su localhost

Strumenti richiesti:

root@kitploit:~
docker --version
docker compose version
python3 --version

Configurazione

Entrare nella directory del progetto:

root@kitploit:~
cd cve-2026-39987

Compilare e avviare entrambi i servizi:

root@kitploit:~
docker compose up -d --build

Verificare che entrambi i contenitori siano in esecuzione:

root@kitploit:~
docker compose ps

Servizi attesi:

root@kitploit:~
cve-2026-39987-vuln
cve-2026-39987-patched

Verifica delle Versioni

Controllare la versione del servizio vulnerabile:

root@kitploit:~
docker compose exec vuln marimo --version

Atteso:

root@kitploit:~
0.20.4

Controllare la versione del servizio patchato:

root@kitploit:~
docker compose exec patched marimo --version

Atteso:

root@kitploit:~
0.23.0

Installazione delle Dipendenze PoC

Creare un ambiente virtuale Python:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate

Installare le dipendenze:

root@kitploit:~
python -m pip install -r poc/requirements.txt

PoC a Danno Minimo

Lo script di prova principale è:

root@kitploit:~
poc/poc.py

Tenta di connettersi a:

root@kitploit:~
/terminal/ws

Quindi invia solo comandi di prova benigni:

root@kitploit:~
id
whoami
hostname

Non viene utilizzata alcuna reverse shell, scrittura di file, persistenza, accesso alle credenziali o comando distruttivo.

Test del servizio vulnerabile

Eseguire:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8081

Risultato atteso:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8081/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[+] websocket connected without credentials
[result] VULNERABLE: unauthenticated command execution observed
[proof]
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>

Se lo script stampa l'output del terminale grezzo ma include questo blocco, la vulnerabilità è comunque confermata:

root@kitploit:~
CVE39987_PROOF_START
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>
CVE39987_PROOF_END

Ciò significa che la connessione WebSocket è riuscita e l'output del comando è tornato dalla sessione del terminale.

Test del servizio patchato

Eseguire:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8082

Risultato atteso:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8082/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[-] websocket connection rejected/failed: Handshake status 403 Forbidden
[result] not exploitable by this unauthenticated check

Questo mostra che il servizio patchato rifiuta l'accesso non autenticato prima di creare una sessione di terminale.


Client di Apprendimento in Tempo Reale

Il file seguente è destinato solo all'apprendimento locale:

root@kitploit:~
poc/rce_poc.py

Dimostra lo stesso problema in modo più in tempo reale connettendosi al WebSocket del terminale vulnerabile e consentendo l'interazione con il terminale.

Utilizzarlo solo contro il laboratorio Docker locale.

Esecuzione contro il servizio vulnerabile

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8081

Comportamento atteso:

root@kitploit:~
[+] Connected successfully (Pre-Auth RCE)
✓ Interactive shell is ready to use!

Comandi sicuri da provare:

root@kitploit:~
id
whoami
hostname
pwd
python -c 'import marimo; print(marimo.__version__)'
exit

Esecuzione contro il servizio patchato

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8082

Comportamento atteso:

root@kitploit:~
[-] Connection Failed: 403 Forbidden
[!] This is likely the PATCHED version.
    The WebSocket endpoint is now protected.

Nota di sicurezza per la modalità in tempo reale

Il client in tempo reale esiste per aiutare a comprendere come si comporta il WebSocket vulnerabile. Non dovrebbe essere utilizzato contro alcun sistema al di fuori di questo laboratorio locale.

Per la pubblicazione in portfolio, la prova primaria consigliata rimane poc/poc.py, perché è limitata, ripetibile e a danno minimo.


Differenza di Sicurezza Attesa

Il risultato principale del laboratorio dovrebbe essere riassunto come:

root@kitploit:~
vuln / marimo 0.20.4:
  l'handshake WebSocket non autenticato a /terminal/ws riesce
  l'output del comando benigno è osservabile

patched / marimo 0.23.0:
  l'handshake WebSocket non autenticato a /terminal/ws fallisce
  il server restituisce 403 Forbidden
  nessuna sessione di terminale viene creata

Questa è la prova principale per la riproduzione della CVE.


Verifica WebSocket Manuale

Se si desidera ispezionare manualmente il comportamento, utilizzare un client compatibile con WebSocket e connettersi a:

root@kitploit:~
ws://127.0.0.1:8081/terminal/ws
ws://127.0.0.1:8082/terminal/ws

Atteso:

root@kitploit:~
8081 -> connessione accettata
8082 -> 403 Forbidden

Gli script PoC sono preferiti perché producono prove più chiare.


Idee per Rilevamento e Monitoraggio

In un ambiente reale, gli indicatori utili includono:

root@kitploit:~
- richieste WebSocket a /terminal/ws
- tentativi di accesso non autenticato ai server di modifica marimo
- sessioni di terminale inattese generate da marimo
- comandi avviati dal processo marimo
- accesso a .env, chiavi SSH, credenziali cloud o segreti del notebook
- traffico di rete in uscita subito dopo le connessioni a /terminal/ws

Esempi di artefatti locali da ispezionare:

root@kitploit:~
docker compose logs vuln
docker compose logs patched
docker compose ps
docker compose exec vuln ps aux

Pulizia

Arrestare e rimuovere i contenitori:

root@kitploit:~
docker compose down

Rimuovere anche i volumi:

root@kitploit:~
docker compose down -v

Rimuovere l'ambiente virtuale Python locale se desiderato:

root@kitploit:~
rm -rf .venv

Regole di Sicurezza

Questo repository è destinato esclusivamente alla ricerca di sicurezza locale e alla dimostrazione per portfolio.

Consentito:

root@kitploit:~
- test su localhost
- riproduzione solo Docker
- comandi di prova benigni come id, whoami, hostname
- confronto tra comportamento vulnerabile e patchato
- documentazione della causa principale e delle idee di rilevamento

Non consentito:

root@kitploit:~
- test contro server marimo pubblici
- test di sistemi che non si possiedono o non si amministrano
- reverse shell
- persistenza
- furto di credenziali
- comandi distruttivi
- movimento laterale
- comportamento botnet o malware

Disclaimer

Questo progetto è destinato esclusivamente a test locali autorizzati e all'educazione sulla sicurezza difensiva. Non utilizzare questi script contro sistemi che non si possiedono o per i quali non si ha esplicita autorizzazione al test.


Riferimenti

  • GitHub Security Advisory — GHSA-2679-6mx9-h9xc:
    https://github.com/advisories/GHSA-2679-6mx9-h9xc

  • NVD — CVE-2026-39987:
    https://nvd.nist.gov/vuln/detail/CVE-2026-39987

  • Repository upstream di marimo:
    https://github.com/marimo-team/marimo

  • Commit della patch — aggiunta della validazione dell'autenticazione al WebSocket del terminale:
    https://github.com/marimo-team/marimo/commit/c24d4806398f30be6b12acd6c60d1d7c68cfd12a

  • PR della patch — marimo PR #9098:
    https://github.com/marimo-team/marimo/pull/9098

Scarica lo strumento
FileScopo
docker-compose.ymlDefinisce i servizi marimo vulnerabile e patchato
vuln/DockerfileCompila il servizio marimo vulnerabile
patched/DockerfileCompila il servizio marimo patchato
vuln/notebook.pyFile notebook marimo minimale utilizzato dal servizio vulnerabile
patched/notebook.pyFile notebook marimo minimale utilizzato dal servizio patchato
poc/poc.pyScript di prova a danno minimo che esegue solo comandi benigni
poc/rce_poc.pyClient di apprendimento in tempo reale per osservare il comportamento del terminale nel laboratorio locale
poc/requirements.txtDipendenze Python per gli script PoC
SAFETY.mdRegole di sicurezza e limiti di ambito