
DonkAI è un laboratorio pratico per l'OWASP Top 10 per le applicazioni LLM (2025) - nessun LLM reale richiesto.
Laboratorio pratico per la OWASP Top 10 per le Applicazioni LLM (2025) - nessun LLM reale richiesto.
DonkAI è una web app deliberatamente vulnerabile che puoi avviare con un solo comando e usare per imparare come i sistemi che integrano LLM vengono compromessi, rompendoli davvero. Ogni categoria della OWASP LLM Top 10 è rappresentata da almeno una sfida giocabile, con una descrizione scritta, un editor di payload, una difesa attiva da aggirare, suggerimenti progressivi e una cronologia per utente di ogni tentativo. Più che un insieme fisso di esercizi, è un laboratorio didattico estensibile: l'architettura modulare (un file per categoria, backend e frontend) rende semplice aggiungere nuove vulnerabilità, rafforzare le difese esistenti o creare percorsi completamente nuovi per workshop, corsi e CTF.
Avvertenza questa applicazione espone intenzionalmente superfici d'attacco reali (prompt injection, IDOR, SQL injection, credenziali hard-coded e altro). Deve essere eseguita solo in un ambiente di laboratorio isolato, preferibilmente all'interno di una macchina virtuale dedicata, e non deve mai essere distribuita su Internet pubblico.
La OWASP Top 10 per le Applicazioni LLM mappa i rischi e fornisce il vocabolario per parlarne; una lettura essenziale per chiunque lavori sulla sicurezza degli LLM. DonkAI è progettato come un'estensione pratica di quel lavoro: un piccolo parco giochi deterministico in cui provi tu stesso gli attacchi, vedi come riescono contro un chatbot finto ma realistico, e leggi un debrief che spiega cosa ha funzionato e come un sistema reale si difenderebbe. Dietro le quinte non c'è un vero LLM: l'intero stack è basato su regole, quindi il laboratorio è economico, funziona offline ed è riproducibile.
Clona, compila e avvia l'intero stack con due comandi:
git clone https://github.com/OWASP/DonkAI.git && cd DonkAI
docker compose up --build
Poi apri http://localhost:3000, accedi con alice / password123 e scegli la tua prima sfida dal pannello OWASP sulla sinistra.
| Servizio | URL / Indirizzo |
|---|---|
| Interfaccia web | http://localhost:3000 |
| Backend (API + documentazione) | http://localhost:8000/docs |
| PostgreSQL | localhost:5432 — db donk_ai_lab |
| Nome utente | Password | Ruolo |
|---|---|---|
alice | password123 | utente |
bob | password123 | utente |
admin | admin123 | admin |
Suggerimento — per cancellare tutto lo stato (utenti, sessioni, cronologia dei tentativi) e ripartire da zero:
docker compose down -v
Ogni categoria della OWASP LLM Top 10 è rappresentata da almeno una sfida giocabile.
| # | Category | Challenges | Backend file |
|---|---|---|---|
| LLM01 | Prompt Injection | 2 | llm01_prompt_injection.py |
| LLM02 | Sensitive Info Disclosure | 2 | llm02_sensitive_info.py |
| LLM03 | Supply Chain | 1 | llm03_supply_chain.py |
| LLM04 | Data & Model Poisoning | 1 | llm04_data_poisoning.py |
| LLM05 | Improper Output Handling | 2 | llm05_improper_output.py |
| LLM06 | Excessive Agency | 2 | llm06_excessive_agency.py |
| LLM07 | System Prompt Leakage | 2 | llm07_system_prompt_leak.py |
| LLM08 | Vector & Embedding Weaknesses | 1 | llm08_vector_weaknesses.py |
| LLM09 | Misinformation | 1 | llm09_misinformation.py |
| LLM10 | Unbounded Consumption | 1 | llm10_unbounded_consumption.py |
Per aggiungere o modificare categorie e sfide, consulta Estensione delle sfide.
┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐
│ React SPA │ ───► │ FastAPI │ ───► │ PostgreSQL │
│ :3000 │ │ :8000 │ │ :5432 │
│ webapp/ │ │ ml-service/ │ │ database/ │
└──────────────────┘ └──────────────────┘ └────────────────┘
| Livello | Stack | Ruolo |
|---|---|---|
| Frontend | React | Renderizza l'interfaccia delle sfide, l'editor di payload e il pannello della cronologia dei tentativi. |
| Backend | FastAPI | Un motore di sfide basato su regole per categoria OWASP - completamente deterministico, nessuna chiamata a LLM. |
| Database | PostgreSQL | Salva users, chat_sessions, chat_messages, exploit_attempts |
Questa applicazione è intenzionalmente vulnerabile. Le impostazioni predefinite (password, credenziali del database, segreti hard-coded nei prompt di sistema) fanno parte del contenuto didattico e non sono sviste di sicurezza. Esegui localmente o in un laboratorio isolato, mai su un host condiviso o su Internet pubblico, e mai contro dati di produzione reali.
Applica le tecniche che impari qui solo a sistemi che possiedi o per i quali hai esplicita autorizzazione scritta a testare.