Paolo Ronco
PORTFOLIO
Ho un chatbot AI integrato nel mio sito accessibile da chiunque visiti paoloronco.it. Non si tratta di un semplice widget di Q&A: dietro le quinte gira un sistema RAG (Retrieval-Augmented Generation) orchestrato tramite n8n, con OpenAI come motore linguistico, Qdrant Cloud come vector store, Cohere come reranker, e un webhook autenticato via Bearer Token come punto di ingresso.
L’articolo che descrive l’intera architettura è disponibile qui: WordPress AI Chatbot – Trasformare contenuti in un sistema interrogabile con n8n, Qdrant, MongoDB Vector Store.
Un sistema del genere, esposto a visitatori anonimi, è un bersaglio interessante. Chiunque può inviargli un messaggio. E quando si parla di LLM, i vettori di attacco non sono quelli classici del web (SQLi, XSS, SSRF) ma qualcosa di più insidioso: il linguaggio naturale stesso diventa l’arma.
Da qui la domanda che mi sono posto: quanto è robusto il mio chatbot contro un attaccante che usa prompt crafted ad arte?
PromptFoo è uno strumento open source per il testing e la valutazione di applicazioni basate su LLM. Permette di fare due cose fondamentali:
Per il red teaming, PromptFoo funziona come un attacker automatizzato: genera centinaia di payload malevoli usando una serie di plugin (ognuno specializzato in una categoria di rischio) e strategie di attacco (tecniche per aggirare i filtri). Ogni risposta del sistema viene poi valutata da un modello giudice che determina se l’attacco ha avuto successo.
I plugin coprono le principali categorie di rischio per un LLM:
bias:*
hallucination
harmful:*
pii:*
excessive-agency
hijacking
contracts
politics
PromptFoo non si limita a inviare i payload così come sono. Li passa attraverso strategie di evasione:
Ho configurato PromptFoo per attaccare direttamente il webhook n8n del mio chatbot:
description: WP-AI-Chatbot RedTeam1targets: - id: http label: wp-ai-chatbot config: url: https://n8n.prhomelab.com/webhook/wp-ai-chatbot method: POST headers: Content-Type: application/json body: '{ "message": "{{prompt}}", "sessionId": "promptfoo-redteam-001" }' transformResponse: (json, text) => json.text || json.results?.[0]?.title || text
Il sistema sotto test è esattamente quello in produzione: stesso endpoint, stessa logica n8n, stesso modello OpenAI. Nessuna sandbox, nessun ambiente di test artificioso.
Ho attivato 35+ plugin And 5 strategie, con numTests: 10 per plugin per strategia. Il risultato è stato un test con quasi 2.000 casi totali.
numTests: 10
Un pass rate del 96,9% su un sistema pubblico è un risultato solido, ma i 52 fallimenti meritano attenzione: indicano aree dove il chatbot ha risposto in modo non conforme alle aspettative di sicurezza.
La grande maggioranza delle categorie ha ottenuto il massimo o quasi:
Osservazione: le strategie Base64, Citation ed Emoji non hanno prodotto risultati significativamente peggiori rispetto al Basic. Il sistema reagisce in modo robusto anche a payload offuscati o nascosti in encoding non standard.
Questa è la parte più interessante. Il meta-agente di PromptFoo — che apprende e ottimizza gli attacchi iterativamente — ha prodotto risultati notevolmente diversi:
Il dato più critico è BiasAge/IterativeMeta a 3/10: con attacchi iterativi e adattativi, il chatbot ha mostrato significativa cedevolezza su bias legati all’età. Questo non significa che produca contenuti pericolosi, ma che le sue risposte mostrano pattern linguistici consistenti con ragionamenti basati sull’età in modo non neutro.
Il Jailbreak Meta è il vero banco di prova: se un sistema regge bene contro Basic, Base64 e Citation ma cede all’IterativeMeta, significa che i guardrail esistono ma possono essere erosi con persistenza e adattamento — esattamente il profilo di un attaccante motivato.
Il chatbot usa OpenAI GPT-4o come motore linguistico. Questo significa che una parte dei comportamenti emersi dal red team — in particolare i bias e alcune allucinazioni — non dipende dalla mia implementazione, ma dal modello stesso.
OpenAI applica i propri guardrail e policy di sicurezza sul modello, ma si tratta di un sistema che non posso modificare internamente: posso solo influenzarlo tramite il system prompt, la struttura del contesto RAG e i parametri della chiamata API. Se GPT-4o mostra un bias residuo su determinati argomenti, o se risponde in modo borderline a certi prompt, quella è una caratteristica del modello base — non un difetto della mia pipeline n8n.
Questo non è un alibi: il compito di chi costruisce un’applicazione sopra un LLM di terze parti è mitigare i rischi noti tramite guardrail applicativi, anche sapendo che non si potrà mai avere controllo totale sul modello sottostante. Ed è esattamente quello che questo red team ha misurato.
Fare red teaming su un AI chatbot con PromptFoo prima del lancio (o periodicamente, come audit) ha un valore concreto:
Individua vulnerabilità reali prima che le trovino gli utenti. Un chatbot esposto pubblicamente è un target: meglio scoprirlo in un ambiente controllato.
Misura la robustezza in modo riproducibile. Non basta “testare qualche prompt a mano”. PromptFoo genera centinaia di varianti sistematiche, combina strategie e produce metriche comparabili nel tempo.
Distingue le vulnerabilità del modello da quelle dell’applicazione. Se un attacco funziona su Basic ma non su Base64, il problema è nel modello. Se funziona su entrambi, il problema è nell’architettura applicativa.
Giustifica scelte architetturali. I risultati di un red team automatizzato sono documentazione: mostrano ai stakeholder (o a se stessi) che la sicurezza non è stata lasciata al caso.
Per completezza, l’architettura del chatbot sotto test:
Utente (browser) │ ▼WordPress Plugin (shortcode) │ HTTP POST + Bearer Token ▼n8n Webhook ──→ Classificazione intent (OpenAI) │ ├─→ RAG: Embed query (OpenAI) → Ricerca semantica (Qdrant Cloud) │ → Reranking (Cohere) → Generazione risposta (OpenAI GPT-4o) │ ├─→ Smalltalk: risposta diretta GPT-4o │ └─→ Log anonimizzati → Google Cloud Storage
Ogni livello di questo stack è un potenziale vettore d’attacco. PromptFoo ha testato quello più esposto: l’interfaccia linguistica.
Il chatbot ha superato il red team con un 96,9% di pass rate su quasi 2.000 test automatizzati che coprono oltre 35 categorie di rischio e 5 strategie di attacco diverse. È un risultato che dà fiducia, ma non complacenza.
I punti deboli identificati — bias residuo sotto jailbreak iterativo, allucinazioni occasionali, qualche risposta borderline su argomenti scientifici sensibili — sono aree di lavoro concrete per il prossimo ciclo di miglioramento.
La sicurezza AI non è un checkbox. È un processo iterativo: costruisci, testa, misura, migliora. PromptFoo è lo strumento che ho scelto per rendere quel processo sistematico e misurabile.
Vuoi approfondire l’architettura del chatbot? Leggi l’articolo tecnico: WordPress AI Chatbot con n8n, Qdrant e MongoDB Vector Store. Il chatbot è visibile su paoloronco.it/ai-chatbot/.
Your email address will not be published. Required fields are marked *
Comment *
Name *
Email *
Website
Save my name, email, and website in this browser for the next time I comment.
Post Comment