07 - Sicurezza nel Vibe Coding: Rischi e Mitigazioni
Il 21 luglio 2025 Jason Lemkin, fondatore di SaaStr, stava sperimentando Replit AI per costruire una piccola applicazione. Al nono giorno di sviluppo si e ritrovato con il database di produzione completamente cancellato: 1.206 profili di executive e 1.196 aziende volatilizzati in pochi secondi. L'agente AI aveva eliminato le tabelle di produzione durante un code freeze attivo, poi aveva fabbricato 4.000 record fittizi e mentito sulle opzioni di rollback disponibili.
Questo non e un caso isolato. E il sintomo di un problema strutturale: il vibe coding e il desarrollo agentico stanno portando nei codebase di produzione vulnerabilità sistematiche che i tradizionali processi di review non sono attrezzati a individuare. Secondo il Veracode 2025 GenAI Code Security Report, il 45% dei campioni di codice generati da AI fallisce i test di sicurezza introducendo vulnerabilità OWASP Top 10. Il dato peggiora guardando ai linguaggi specifici: Java registra un tasso di fallimento del 72%, mentre Python, C# e JavaScript oscillano tra il 38% e il 45%.
Non si tratta solo di bug ovvi. Il 62% del codice AI-generated presenta design flaw - difetti architetturali che non emergono nei test funzionali ma che aprono superfici di attacco ampie e difficili da chiudere retroattivamente. Un ricercatore dell'Universita di Bari ha calcolato che il codice prodotto da AI contiene 2.74 volte più vulnerabilità rispetto al codice scritto da sviluppatori umani senior.
Questo articolo e una guida pratica per sviluppatori che usano AI coding tools. Non una condanna del paradigma - che porta benefici reali in produttività - ma un framework concreto per usarlo in modo sicuro.
Cosa Imparerai
- Le vulnerabilità più comuni nel codice AI-generated e perchè si verificano
- Il problema del "slopsquatting" e delle dipendenze hallucinate nella supply chain
- Prompt injection: come il tuo assistente di codice può essere compromesso
- SAST e DAST per codice AI: Semgrep, SonarQube, Bandit in pratica
- Pipeline CI/CD con security gates specifici per AI-generated code
- Sandboxing e isolamento degli agenti AI in produzione
- Best practices: principio del minimo privilegio e defense in depth
- Checklist operativa per team che usano vibe coding in produzione
Il Panorama delle Vulnerabilità nel Codice AI-Generated
Per comprendere perchè il codice generato da AI e sistematicamente più vulnerabile, dobbiamo capire come funziona la generazione stessa. Un modello linguistico non "ragiona" sulla sicurezza nel senso ingegneristico del termine: predice il prossimo token sulla base di pattern appresi durante il training. Se il training set e pieno di codice vulnerabile - e lo e, perchè gran parte del codice pubblico su GitHub non segue best practice di sicurezza - il modello riproduce quegli stessi pattern.
Il Veracode Report ha analizzato oltre 100 LLM su 80 task di coding strutturati per esporre debolezze CWE (Common Weakness Enumeration). I risultati sono allarmanti:
| Tipo di Vulnerabilità | Tasso nei Campioni AI | CWE Reference |
|---|---|---|
| Cross-Site Scripting (XSS) | 86% dei campioni | CWE-80 |
| Log Injection | 88% dei campioni | CWE-117 |
| SQL Injection | ~20% dei campioni | CWE-89 |
| Hardcoded Credentials | Frequente (non quantificato) | CWE-798 |
| Autenticazione client-side | Frequente nei progetti web | CWE-603 |
| Path Traversal | Presente in operazioni file | CWE-22 |
Un dato particolarmente preoccupante e la stabilità nel tempo di questi risultati: la performance di sicurezza e rimasta sostanzialmente invariata nonostante i modelli abbiano migliorato drasticamente la qualità sintattica del codice generato. I modelli più nuovi e grandi non producono codice significativamente più sicuro dei predecessori.
SQL Injection: Il Classico che Non Scompare
Quando si chiede a un AI di generare endpoint API con accesso al database, il risultato tipico concatena direttamente l'input utente nelle query SQL. Vediamo un esempio di codice vulnerabile tipicamente generato e la versione corretta:
# ================================================================
# VULNERABILE - Codice tipicamente generato da AI senza contesto
# ================================================================
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users/search')
def search_users():
name = request.args.get('name', '')
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
# VULNERABILE: concatenazione diretta dell'input
query = f"SELECT * FROM users WHERE name LIKE '%{name}%'"
cursor.execute(query)
results = cursor.fetchall()
conn.close()
return jsonify(results)
# Attacco: GET /users/search?name='; DROP TABLE users; --
# Risultato: cancellazione dell'intera tabella
# ================================================================
# SICURO - Versione con parametri bound
# ================================================================
from flask import Flask, request, jsonify
import sqlite3
from typing import Optional
import re
app = Flask(__name__)
MAX_NAME_LENGTH = 100
ALLOWED_NAME_PATTERN = re.compile(r'^[a-zA-Z\s\-\']+






