
Host-agnostico hook di sicurezza pre-scrittura per agenti di codifica: rileva pattern di input utente tramite Semgrep ed emette una guida di sicurezza deterministica, senza LLM.
Un checkpoint di sicurezza per gli strumenti di AI per programmare. Esamina ogni file che un assistente AI scrive e ferma quelli pericolosi prima che arrivino sul disco.
Gli assistenti AI per programmare (Claude Code, Codex, …) scrivono codice velocemente — incluso codice che gestisce cose come password, email, chiavi API o input utente grezzo. Per un assistente è facile cablare quei dati direttamente in una query di database, un comando shell o una risposta HTTP senza pensare alla sicurezza.
VibeGate si frappone tra l'assistente e il tuo filesystem. Ogni volta che l'assistente prova a scrivere o modificare un file, VibeGate analizza prima il nuovo codice:
Nessun LLM è coinvolto nell'analisi stessa — è un'analisi statica veloce e deterministica, quindi non inventa mai nulla e non costa token.
Ecco tutto ciò che VibeGate attualmente controlla:
| Controllo | Cosa rileva | Risultato |
|---|---|---|
| Iniezione di comandi | Input non sanitizzato raggiunge un comando shell | Blocca |
| SQL injection | Input non sanitizzato raggiunge una query al database | Blocca |
| NoSQL injection | Il corpo della richiesta viene usato direttamente come filtro del database | Blocca |
| Template injection (SSTI) | La sorgente del template stessa, non solo i suoi dati, proviene dall'input utente | Blocca |
| Deserializzazione non sicura | Dati non fidati raggiungono un deserializzatore non sicuro (pickle, YAML non sicuro, ...) | Blocca |
| Path traversal | Input non sanitizzato raggiunge una lettura, scrittura o cancellazione di file | Blocca |
| XXE | XML non fidato viene analizzato con entità esterne abilitate | Blocca |
| XSS | Input non sanitizzato viene renderizzato come HTML grezzo | Blocca |
| Caricamento file senza restrizioni | Il nome del file caricato viene usato per costruire il percorso di salvataggio | Blocca |
| SSRF | Il server recupera un URL che non è hardcodato | Avvisa |
| Reindirizzamento aperto | Una destinazione di reindirizzamento che non è hardcodata | Avvisa |
| Mass assignment | L'intero corpo della richiesta viene passato a un costruttore o aggiornamento di modello | Avvisa |
| Dati sensibili nel corpo di una richiesta | Email, password, token, ecc. letti dal corpo della richiesta | Avvisa |
| Dati sensibili in un URL/query | Email, password, token, ecc. letti dalla stringa di query | Avvisa |
| Dati sensibili nelle intestazioni | Email, password, token, ecc. letti dalle intestazioni della richiesta | Avvisa |
| Percorso file da input utente | Una variabile, non una stringa hardcodata, viene usata come percorso di file | Avvisa |
| Argomenti CLI | I dati provengono da argomenti della riga di comando | Avvisa |
| Input standard | I dati provengono da stdin | Avvisa |
| Variabili d'ambiente | I dati provengono da una variabile d'ambiente | Avvisa |
| GitHub Action senza pin | Un workflow usa un tag mutabile (@v4) invece di un commit SHA | Avvisa |
pull_request_target non sicuro | Un workflow usa il trigger pull_request_target | Avvisa |
| Credenziali nei log | Una password, chiave API o token viene passata a print/console.log/un logger | Avvisa |
| Segreto hardcodato | Una variabile chiamata come un segreto viene assegnata a un valore letterale che sembra reale | Avvisa |
L'elenco completo e aggiornato si trova in guidance.TECHNICAL_RISKS e formatter.BLOCKING_CATEGORIES, nel caso questa tabella dovesse diventare obsoleta.
┌───────────────────────────────────┐
│ Chiedi a Claude Code di │
│ scrivere o modificare un file │
└───────────────┬───────────────────┘
│
▼
┌───────────────────────────────────┐
│ Claude Code prova a salvare │
│ il file (strumento Write/Edit) │
└───────────────┬───────────────────┘
│
▼
┌───────────────────────────────────┐
│ Hook di VibeGate │
│ (viene eseguito automaticamente, │
│ prima che il file venga salvato)│
└───────────────┬───────────────────┘
│
analizza il nuovo codice con Semgrep
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────────┐
│ Nessun input │ │ Input rischioso, │ │ Input rischioso │
│ rischioso trovato │ │ ma rischio basso │ │ raggiunge un sink │
│ │ │ (es. mostrato in │ │ critico │
│ │ │ una risposta HTTP) │ │ (SQL/comando/RCE, │
│ │ │ │ │ template injection) │
└──────────┬───────────┘ └──────────┬──────────┘ └─────────────┬────────────┘
│ │ │
▼ ▼ ▼
File salvato, File salvato, File NON salvato.
nulla mostrato. più un avviso nel Claude Code vede
terminale con il il motivo del blocco
rischio e come e sa cosa deve
risolverlo. correggere.
In breve: il codice sicuro passa inalterato, il codice rischioso ma sopportabile viene salvato con un avviso, e il codice che è a un passo da cose come SQL injection, command injection o esecuzione di codice remoto viene fermato prima di arrivare sul disco.
Se VibeGate stesso incontra un errore imprevisto, lascia sempre passare la scrittura — un bug nell'hook non dovrebbe mai essere il motivo per cui il tuo lavoro viene bloccato.
Ogni avviso e blocco include anche un’istruzione esplicita che dice a Claude Code di menzionare il risultato nella sua risposta, non di correggerlo in silenzio. Questo rende visibile l'attività di VibeGate nella conversazione, non solo in un log del terminale che dovresti cercare.