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 — Kit di rilevamento e sfruttamento per CVE-2026-39987, una RCE pre-autenticazione nei notebook Marimo. Include uno scanner Python e uno script Nmap NSE per identificare istanze vulnerabili tramite controlli sugli endpoint WebSocket. | Kitploit
Strumenti/GitHubGitHub/keraattin/cve-2026-39987
Scanner di VulnerabilitàAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniSicurezza WebSicurezza di RetePenetration Testing
GitHubkeraattin/cve-2026-39987

CVE-2026-39987

Kit di rilevamento e sfruttamento per CVE-2026-39987, una RCE pre-autenticazione nei notebook Marimo. Include uno scanner Python e uno script Nmap NSE per identificare istanze vulnerabili tramite controlli sugli endpoint WebSocket.

14 mesi faNon ancora revisionato
Vedi Repository

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 — Esecuzione Remota di Codice Pre-Autenticata nel Notebook Python Marimo

CVE-2026-39987 CVSS 9.3 CWE-306 Marimo Pre-Auth RCE

TL;DR

Una vulnerabilità di esecuzione remota di codice pre-autenticata in Marimo, un notebook Python open-source per la scienza dei dati e AI/ML. L'endpoint WebSocket del terminale (/terminal/ws) salta completamente la validazione dell'autenticazione, mentre l'endpoint notebook adiacente (/ws) la applica correttamente. Un attaccante non autenticato può connettersi a /terminal/ws e ottenere una sul sistema host senza alcuna credenziale.

shell PTY interattiva completa

Sfruttata in natura entro 10 ore dalla divulgazione. Gli attaccanti hanno rubato le credenziali AWS in meno di 3 minuti.

Colpisce Marimo <= 0.20.4. Corretto in Marimo 0.23.0.


Indice dei Contenuti

  • Fatti Rapidi
  • Cos'è Marimo?
  • Analisi Approfondita della Vulnerabilità
    • I Due Endpoint WebSocket
    • Il Controllo di Autenticazione Mancante
    • L'Attacco: Dall'Advisory alle Chiavi AWS in 3 Minuti
  • Analisi dell'Impatto
  • Versioni Interessate
  • Il Quadro Più Ampio: La Toolchain AI/ML Sotto Attacco
  • Rilevamento
    • Scanner Python
    • Script Nmap NSE
    • Verifica Manuale
  • Indicatori di Compromissione
  • Rimedio
  • Riferimenti
  • Autore

Fatti Rapidi

CampoDettaglio
ID CVECVE-2026-39987
VendorMarimo Project
ProdottoMarimo (Notebook Python)
Versioni Interessate<= 0.20.4
CVSS v3.19.3 (Critico)
CWECWE-306 — Autenticazione Mancante per Funzione Critica
Vettore di AttaccoRete
AutenticazioneNessuna richiesta
Interazione UtenteNessuna
Maturità dell'ExploitAttivamente sfruttato in natura
Tempo per lo Sfruttamento~10 ore dopo la divulgazione
Corretto InMarimo 0.23.0

Cos'è Marimo?

Marimo è un notebook Python reattivo open-source progettato come alternativa moderna a Jupyter. È costruito per la scienza dei dati, la sperimentazione AI/ML e l'analisi interattiva dei dati. Le sue caratteristiche principali includono il tracciamento automatico delle dipendenze, l'esecuzione riproducibile e un'esperienza di sviluppo più pulita rispetto ai notebook tradizionali.

Marimo sta guadagnando rapidamente popolarità nella community Python e AI/ML, soprattutto tra i professionisti che desiderano flussi di lavoro notebook più strutturati rispetto a quelli offerti da Jupyter.

Come tutti gli ambienti notebook, le istanze Marimo hanno tipicamente accesso a risorse sensibili: credenziali cloud (AWS, GCP, Azure), stringhe di connessione a database, chiavi API per servizi AI (OpenAI, Anthropic, ecc.) e accesso alla rete interna. A differenza delle applicazioni web tradizionali, i notebook sono progettati per eseguire codice arbitrario. Questo è il loro scopo principale.

Questa combinazione rende qualsiasi bypass dell'autenticazione in un ambiente notebook particolarmente devastante.``` Typical Marimo Deployment:

┌──────────────┐ ┌────────────────────────────────┐ │ │ HTTP │ Marimo Server │ │ Browser │────────>│ │ │ (User) │ │ ┌──────────────────────────┐ │ │ │<────────│ │ /ws (Notebook) │ │ └──────────────┘ WS │ │ ✅ validate_auth() │ │ │ └──────────────────────────┘ │ │ │ │ ┌──────────────────────────┐ │ │ │ /terminal/ws │ │ │ │ ❌ NO AUTH CHECK │ │ │ └──────────────────────────┘ │ │ │ │ ┌──────────────────────────┐ │ │ │ Python Environment │ │ │ │ .env files │ │ │ │ AWS credentials │ │ │ │ API keys │ │ │ └──────────────────────────┘ │ └────────────────────────────────┘

root@kitploit:~
---

## Analisi Approfondita della Vulnerabilità

### I Due Endpoint WebSocket

Il server di Marimo implementa più endpoint WebSocket per diverse funzionalità. La differenza critica tra i due endpoint principali è la presenza (o l'assenza) di un controllo di autenticazione:```
  Authentication Flow Comparison:

  /ws (Notebook WebSocket):
  ┌─────────┐    ┌───────────────┐    ┌──────────┐    ┌───────────┐
  │ Connect │───>│ validate_auth │───>│  Accept  │───>│ Notebook  │
  └─────────┘    └───────┬───────┘    └──────────┘    └───────────┘
                         │
                    ❌ Reject if
                    not authenticated

  /terminal/ws (Terminal WebSocket):
  ┌─────────┐    ┌───────────────┐    ┌──────────┐    ┌───────────┐
  │ Connect │───>│ Check mode &  │───>│  Accept  │───>│ PTY Shell │
  └─────────┘    │ platform only │    └──────────┘    └───────────┘
                 └───────────────┘
                 ⚠️ No auth check!
                 Anyone gets a shell!

Il Controllo di Autenticazione Mancante

L'endpoint del notebook (/ws) chiama correttamente validate_auth() per verificare l'identità dell'utente prima di accettare connessioni WebSocket. Questo è il comportamento di sicurezza previsto.

L'endpoint del terminale (/terminal/ws) controlla solo se il server è in modalità di esecuzione e se la piattaforma supporta la funzionalità del terminale. Non chiama mai validate_auth(). Dopo aver superato questi controlli di base, accetta la connessione e crea una sessione PTY (pseudo-terminale) completa.```python

/ws (Notebook) — CORRECT implementation

async def websocket_connect(self, message): await self.validate_auth() # ✅ Checks authentication await self.accept() # ... notebook communication

/terminal/ws (Terminal) — VULNERABLE implementation

async def websocket_connect(self, message): if not self.is_running_mode(): # Only checks mode await self.close() return if not self.is_platform_supported(): # Only checks platform await self.close() return await self.accept() # ❌ No auth! Anyone gets a shell # ... PTY shell creation

root@kitploit:~
Questo è **CWE-306: Autenticazione Mancante per Funzioni Critiche**. L'endpoint più pericoloso sul server (quello che fornisce una shell interattiva) non ha alcuna autenticazione.

### L'Attacco: Dalle Advisory alle Chiavi AWS in 3 Minuti

La timeline dello sfruttamento mostra quanto velocemente operano gli attori delle minacce moderni:```
  ┌──────────────────────────────────────────────────────────────┐
  │                   CVE-2026-39987 Timeline                    │
  ├──────────────────────────────────────────────────────────────┤
  │                                                              │
  │  T+0h        Advisory published                              │
  │  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                       │
  │  T+9h        First exploit built from advisory               │
  │  T+10h       Exploitation in the wild confirmed              │
  │  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─                       │
  │  T+10h 0m    Attacker connects to /terminal/ws               │
  │  T+10h 1m    Full PTY shell obtained                         │
  │  T+10h 2m    .env file located and read                      │
  │  T+10h 3m    AWS keys exfiltrated                            │
  │              Total attack time: ~3 minutes                   │
  └──────────────────────────────────────────────────────────────┘

L'attacco in sé è banalmente semplice:``` Step 1: Attacker opens WebSocket connection to /terminal/ws (No authentication needed, no special tools required)

Step 2: Server creates a PTY (pseudo-terminal) session Attacker now has an interactive shell

Step 3: Attacker runs commands: $ cat .env AWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=... DATABASE_URL=postgres://... OPENAI_API_KEY=sk-...

Step 4: Credentials exfiltrated Attacker now has cloud access, database access, and API keys for AI services

Total time: under 3 minutes Authentication required: none Tools required: any WebSocket client

root@kitploit:~
Nessuno sviluppo di exploit necessario. Nessuno shellcode. Nessuna corruzione di memoria. Solo un client WebSocket e un controllo di autenticazione mancante.

---

## Analisi dell'Impatto

**Impatto immediato sull'host Marimo:**
- Shell interattiva completa con i privilegi del processo Marimo
- Accesso a tutti i file leggibili dal processo (codice sorgente, dati, credenziali)
- Accesso alle variabili d'ambiente contenenti chiavi API e segreti
- Capacità di eseguire comandi arbitrari sul sistema host

**Esposizione delle credenziali (l'obiettivo primario dell'attacco):**
- Chiavi di accesso AWS e chiavi segrete da file `.env` o variabili d'ambiente
- Credenziali degli account di servizio GCP/Azure
- Stringhe di connessione al database con password
- Chiavi API di OpenAI, Anthropic e altri servizi AI
- Chiavi SSH e altro materiale di autenticazione

**Impatto a valle (tramite credenziali rubate):**
- Accesso non autorizzato all'infrastruttura cloud (EC2, S3, Lambda, ecc.)
- Esfiltrazione di dati da storage cloud e database
- Abuso di risorse (cryptomining, furto di crediti API AI)
- Movimento laterale in reti cloud e on-premise

**Fattori di amplificazione del rischio:**
- Gli ambienti notebook sono progettati per eseguire codice arbitrario (è il loro scopo)
- Gli ambienti di data science hanno tipicamente un ampio accesso cloud per i job di training
- Molte istanze Marimo sono esposte a internet per collaborazione e lavoro remoto
- L'hardening della sicurezza è spesso un ripensamento negli ambienti di ricerca/sperimentazione

---

## Versioni Interessate

| Versione | Stato |
|---------|--------|
| Marimo 0.23.0+ | **Corretta** |
| Marimo 0.20.5 a 0.22.x | **Probabilmente vulnerabile** (tra l'intervallo dell'advisory e la correzione) |
| Marimo <= 0.20.4 | **Vulnerabile** (intervallo confermato) |

---

## Il Quadro Più Ampio: La Toolchain AI/ML Sotto Attacco

CVE-2026-39987 non è un incidente isolato. Fa parte di un chiaro schema emerso nell'aprile 2026:

| CVE | Prodotto | Tipo | Stato |
|:---|:---|:---|:---|
| **CVE-2026-39987** | Marimo | RCE Pre-Auth (WebSocket) | Sfruttato in 10 ore |
| **CVE-2026-33017** | Langflow | RCE | CISA KEV (26 marzo) |
| **CVE-2026-5059** | aws-mcp-server | Command Injection RCE | Advisory pubblico |
| **TorchGeo** | TorchGeo | eval() RCE | Advisory pubblico |

Quattro strumenti di sviluppo AI/ML colpiti da vulnerabilità RCE critiche in un solo mese. La pipeline di sviluppo AI/ML sta diventando il nuovo shadow IT: strumenti distribuiti con ampio accesso, supervisione di sicurezza minima e ricchi depositi di credenziali.```
  ┌─────────────────────────────────────────────────┐
  │        Why AI/ML Tools Are Prime Targets        │
  ├─────────────────────────────────────────────────┤
  │                                                 │
  │  1. DESIGNED to execute arbitrary code          │
  │     (that's literally what notebooks do)        │
  │                                                 │
  │  2. Run with elevated privileges                │
  │     (GPU access, cloud SDKs, network access)    │
  │                                                 │
  │  3. Contain high-value credentials              │
  │     (AWS keys, API tokens, DB connections)      │
  │                                                 │
  │  4. Often exposed to the network                │
  │     (for collaboration and remote access)       │
  │                                                 │
  │  5. Security hardening is an afterthought       │
  │     (focus on features and UX, not security)    │
  │                                                 │
  │  6. Users are researchers, not security experts │
  │     (default configs, weak passwords, no VPN)   │
  └─────────────────────────────────────────────────┘

Rilevamento

Scanner Python

Lo script Python rileva istanze Marimo vulnerabili attraverso un'analisi multi-step.

Come funziona:

  1. Identificazione Marimo — Interroga /api/status, /api/health e / per indicatori Marimo nel contenuto delle risposte e negli header
  2. Estrazione versione — Analizza le informazioni sulla versione dalle risposte API, dagli header del server e dal contenuto HTML
  3. Test handshake WebSocket — Invia una richiesta HTTP Upgrade sicura a /terminal/ws (nessun dato trasmesso attraverso la connessione)
  4. Controllo autenticazione differenziale — Confronta il comportamento di /terminal/ws (dovrebbe richiedere autenticazione) vs /ws (noto per richiedere autenticazione) per confermare l'incoerenza
  5. Controllo vulnerabilità versione — Confronta la versione rilevata con l'intervallo vulnerabile (<= 0.20.4) e la versione corretta (>= 0.23.0)

Nessun comando viene eseguito sui sistemi target. L'handshake WebSocket viene testato ma nessun dato viene inviato attraverso la connessione. Il controllo è completamente passivo e sicuro per la produzione.

Utilizzo:```bash

Install dependencies

pip install -r requirements.txt

Single target (Marimo default port: 2718)

python CVE-2026-39987_Marimo_RCE_detector.py -t http://marimo-host:2718

HTTPS target

python CVE-2026-39987_Marimo_RCE_detector.py -t https://marimo-host:443

Bulk scan from file with verbose output

python CVE-2026-39987_Marimo_RCE_detector.py -f targets.txt -o results.json -v

Increased timeout for slow networks

python CVE-2026-39987_Marimo_RCE_detector.py -t http://10.0.0.5:2718 --timeout 15

root@kitploit:~
**Opzioni:**

| Flag | Descrizione | Predefinito |
|------|-------------|---------|
| `-t`, `--target` | URL di destinazione singola (es. `http://host:2718`) | — |
| `-f`, `--file` | File con URL di destinazione, uno per riga (commenti `#` supportati) | — |
| `-o`, `--output` | Salva i risultati in un file JSON | — |
| `--timeout` | Timeout di connessione in secondi | `10` |
| `--verify-ssl` | Abilita la verifica del certificato SSL | Disabilitato |
| `-v`, `--verbose` | Output dettagliato con informazioni complete | Off |

**Esempio di output:**```
[*] CVE-2026-39987 Marimo Pre-Auth RCE Scanner
[*] Scanning 1 target(s)...
[*] NOTE: This scanner only checks for endpoint exposure.
[*]       No commands are executed on target systems.

======================================================================
Target: http://10.0.0.5:2718
Scan Time: 2026-04-14T16:00:00Z
Risk Level: CRITICAL
======================================================================
  Is Marimo:             YES
  Marimo Version:        0.19.2
  /terminal/ws Open:     YES — UNAUTHENTICATED
  Vulnerable:            YES

  *** CRITICAL: Pre-authenticated RCE is possible! ***
  *** An attacker can get a full PTY shell without any auth ***

  Details:
    - Marimo instance detected via /api/status
    - Marimo version: 0.19.2
    - WebSocket upgrade accepted — /terminal/ws accessible WITHOUT auth
    - CONFIRMED: /terminal/ws accepts unauthenticated connections while
      /ws requires auth — classic CVE-2026-39987 signature
    - Version 0.19.2 <= 0.20.4 — VULNERABLE to pre-auth RCE

======================================================================
[*] Scan Complete: 1 targets scanned
[*] Marimo Instances: 1 | Vulnerable: 1 | Critical: 1
======================================================================

Script NSE di Nmap```bash

Install the NSE script

sudo cp CVE-2026-39987_Marimo_RCE.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb

Basic scan (Marimo default port: 2718)

nmap -p 2718 --script CVE-2026-39987_Marimo_RCE

Scan common ports where Marimo might run

nmap -p 2718,8080,8443,443 --script CVE-2026-39987_Marimo_RCE

Subnet scan

nmap -p 2718 --script CVE-2026-39987_Marimo_RCE 10.0.0.0/24

Scan targets from a file

nmap -p 2718 --script CVE-2026-39987_Marimo_RCE -iL targets.txt

With service version detection

nmap -sV -p 2718 --script CVE-2026-39987_Marimo_RCE

root@kitploit:~
**Output di esempio di Nmap:**```
PORT     STATE SERVICE
2718/tcp open  http
| CVE-2026-39987_Marimo_RCE:
|   VULNERABLE:
|   Marimo Pre-Auth RCE (CVE-2026-39987)
|     State: VULNERABLE
|     Risk level: CRITICAL
|     Marimo Version: 0.19.2
|     /terminal/ws: accessible without authentication
|     Description:
|       The Marimo /terminal/ws WebSocket endpoint accepts connections
|       without authentication, enabling pre-authenticated RCE.
|       An attacker can obtain a full PTY shell without any credentials.
|     References:
|_      https://nvd.nist.gov/vuln/detail/CVE-2026-39987

Verifica Manuale

Se hai accesso all'istanza Marimo:```bash

Check Marimo version via API

curl -s http://:2718/api/status | python3 -m json.tool

Test WebSocket upgrade on /terminal/ws (should NOT succeed without auth)

curl -s -o /dev/null -w "%{http_code}"
-H "Upgrade: websocket"
-H "Connection: Upgrade"
-H "Sec-WebSocket-Key: dGVzdC1rZXktMTIzNDU2Nzg="
-H "Sec-WebSocket-Version: 13"
http://:2718/terminal/ws

If it returns 101 (Switching Protocols), the endpoint is open without auth

If it returns 401/403, authentication is enforced (patched or hardened)

For comparison, test /ws (should always require auth)

curl -s -o /dev/null -w "%{http_code}"
-H "Upgrade: websocket"
-H "Connection: Upgrade"
-H "Sec-WebSocket-Key: dGVzdC1rZXktMTIzNDU2Nzg="
-H "Sec-WebSocket-Version: 13"
http://:2718/ws

root@kitploit:~
Se `/terminal/ws` restituisce 101 mentre `/ws` restituisce 401/403, questa è la classica firma di CVE-2026-39987.

---

## Indicatori di Compromissione

Cerca questi segnali nel tuo ambiente:

| Indicatore | Dove Controllare | Cosa Cercare |
|:---|:---|:---|
| Connessioni WebSocket non autorizzate | Log del server/proxy | Connessioni a `/terminal/ws` da IP inattesi |
| Creazione di sessioni PTY | Monitoraggio dei processi | Processi shell inattesi generati dal server Marimo |
| Accesso ai file | Log di audit dei file | Letture di `.env`, file di credenziali o chiavi SSH |
| Utilizzo delle credenziali | Log di audit del provider cloud | Chiamate API che utilizzano chiavi memorizzate nell'ambiente Marimo |
| Trasferimento dati in uscita | Monitoraggio della rete | Traffico egress insolito dall'host Marimo |

**Comandi di indagine:**```bash
# Check for active WebSocket connections
ss -tnp | grep <MARIMO_PORT>

# Review process tree for unexpected shells
ps aux --forest | grep -A5 marimo

# Check if .env or credential files were recently accessed
stat .env
stat ~/.aws/credentials

# Review cloud provider activity logs for unauthorized access
aws cloudtrail lookup-events --lookup-attributes AttributeKey=AccessKeyId,AttributeValue=<KEY_ID>

# Check for unauthorized outbound connections
netstat -tnp | grep ESTABLISHED | grep -v 127.0.0.1

Rimedio

Azioni immediate (esegui subito):

  1. Aggiorna a Marimo 0.23.0 o versioni successive (pip install --upgrade marimo)
  2. Limita l'accesso di rete alle istanze Marimo tramite regole firewall (bind a localhost o solo a IP fidati)
  3. Controlla le connessioni non autorizzate nei log del tuo server

A breve termine (questa settimana):

  1. Ruota TUTTE le credenziali accessibili dagli ambienti Marimo (chiavi AWS, token API, password di database, account di servizi cloud)
  2. Controlla i log di attività del provider cloud per chiamate API non autorizzate che utilizzano credenziali potenzialmente compromesse
  3. Rivedi i file .env e le variabili d'ambiente per eventuali dati sensibili che potrebbero essere stati esposti
  4. Verifica la presenza di meccanismi di persistenza (chiavi SSH non autorizzate, cron job, script di avvio modificati)

A lungo termine:

  1. Non esporre mai gli ambienti notebook direttamente a internet (usa VPN o tunnel SSH)
  2. Tratta gli ambienti di sviluppo AI/ML come asset ad alta sicurezza (contengono credenziali cloud e hanno capacità di esecuzione di codice)
  3. Includi i server notebook nel tuo programma regolare di scansione delle vulnerabilità
  4. Implementa il monitoraggio di rete per le istanze dei server notebook con avvisi su connessioni inattese

Riferimenti

  • The Hacker News — Marimo RCE Flaw CVE-2026-39987 Exploited Within 10 Hours
  • SecurityWeek — Critical Marimo Flaw Exploited Hours After Public Disclosure
  • BleepingComputer — Critical Marimo Pre-Auth RCE Flaw Now Under Active Exploitation
  • Security Affairs — CVE-2026-39987: Marimo RCE Exploited in Hours After Disclosure
  • CSA Labs — Marimo Pre-Auth RCE: AI Development Toolchain Under Attack
  • GBHackers — Marimo RCE Vulnerability Exploited Within 10 Hours
  • InfoWorld — Critical Flaw in Marimo Python Notebook Exploited Within 10 Hours

Autore

Kerem Oruç — Ingegnere della Cybersecurity

  • GitHub: @keraattin
  • Twitter: @keraattin
Scarica lo strumento