Tutti gli articoli
Minaccia6 min di lettura

Finti crawler AI stanno dando la caccia ai tuoi file .env. Ecco come controllare i tuoi

Line of friendly-looking robots walking past server racks while one shines a light on a locked folder with a key

Se di recente hai guardato i tuoi access log e hai visto molto traffico da "ClaudeBot" o "ChatGPT", forse hai pensato che fossero le aziende AI a indicizzare il tuo sito. In parte probabilmente lo erano. Ma una quota crescente no: sono scanner di credenziali con il cartellino di un crawler AI, e cercano un file in particolare. Il tuo .env.

Questa settimana Cequence, fornitore di soluzioni di bot management, ha pubblicato una ricerca su un singolo attore che ha ruotato tra circa 32 identità di bot AI, tra cui nomi appartenenti a OpenAI, Anthropic, Meta e Perplexity. In un solo giorno di ottobre ha raggiunto il 48% delle organizzazioni protette da Cequence che avevano ricevuto traffico da bot AI. Non stava facendo crawling di contenuti. Richiedeva circa 90 percorsi di file dove di solito vivono i segreti: file .env, file di credenziali cloud, chiavi SSH private e dati d'ambiente del server.

Quasi tutte quelle richieste sono state bloccate o sono fallite, e non è stata segnalata alcuna violazione. Buone notizie per i clienti di Cequence. Per te la domanda è più semplice: se uno di questi bot colpisse la tua app oggi, riceverebbe un 404 o la tua chiave Stripe?

Cosa sta succedendo

Tre report distinti degli ultimi mesi puntano nella stessa direzione.

  • Cequence (pubblicato il 28 ottobre): un solo scanner, circa 32 false identità AI, attivo almeno da fine settembre a fine ottobre. Ogni indirizzo cloud sparava una raffica di 50-190 richieste in circa otto secondi e poi passava oltre. Ha usato più di 300 indirizzi in un solo giorno, e nessuno degli indirizzi di fine settembre è ricomparso un mese dopo. L'articolo di CSO Online osserva che questo tipo di rotazione rende le blocklist IP statiche molto meno utili.
  • GreyNoise (agosto): un altro cluster ha impersonato 13 crawler AI da 824 indirizzi, nessuno dei quali rientrava negli intervalli IP pubblicati dalle aziende. I percorsi più richiesti sembrano una checklist di ogni posto in cui un framework potrebbe lasciare segreti: /.env, /app/.env, /api/.env, /backend/.env, /.env.local, /.env.production, /.env.bak, /.aws/credentials. I falsi bot non hanno mai chiesto /robots.txt. Il vero crawler di Anthropic sì, e non ha mai richiesto un file di credenziali.
  • Symantec, tramite Help Net Security (23 ottobre): un honeypot che si fingeva un servizio AI non protetto ha colto all'opera l'agente autonomo di un attaccante. Il suo prompt di jailbreak diceva al modello che leggere file .env, API key e schemi di database era normale lavoro di sviluppo. La maggior parte delle oltre 127.000 richieste registrate dall'honeypot erano ricognizione, tentativi con chiavi rubate e sondaggi alla ricerca di file di configurazione esposti.

Lo schema è chiaro. Gli attaccanti sanno che i proprietari dei siti hanno iniziato a mettere in allowlist i crawler AI, quindi ne prendono in prestito i nomi. E sanno che le chiavi AI valgono soldi veri: una chiave OpenAI, Anthropic o Gemini trapelata può accumulare un conto salato prima che tu te ne accorga.

Perché dovrebbe importare a chi rilascia in fretta

La stringa user agent è solo un header che il visitatore scrive su se stesso. Non prova nulla. Se la tua configurazione di hosting, una regola della CDN o il WAF lasciano passare i "bot AI noti", potresti aver aperto la porta proprio a questo traffico.

Ancora più importante, ciò che viene cercato è un errore classico delle app rilasciate in fretta. Un file .env finisce nella web root perché la build ha copiato l'intera cartella del progetto. Un .env.production.bak resta lì dopo un fix notturno. Un'immagine Docker serve /app come file statici. Niente di tutto questo richiede un exploit sofisticato. È una richiesta GET, e al bot non importa se è la prima o la novantesima.

File .env esposti: perché questo file è così prezioso per gli attaccanti

Come controllare la tua app

Parti dai percorsi che gli scanner richiedono davvero. Esegui il ciclo qui sotto da un terminale, con il tuo dominio.

Quello che vuoi vedere è 404 o 403 su ogni riga. Un 200 è un problema, ma controlla il body prima di andare nel panico: molte single-page app restituiscono index.html con un 200 per qualsiasi percorso sconosciuto. Esegui curl -s https://yourapp.com/.env | head -5 e guarda cosa torna. Se vedi righe KEY=value, considera compromesso ogni segreto in quel file.

for p in .env .env.local .env.production .env.bak .env.old \
         app/.env api/.env backend/.env .aws/credentials .git/config; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "https://yourapp.com/$p")
  echo "$code  /$p"
done

Già che ci sei, controlla le fughe correlate che rivelano gli stessi segreti per un'altra strada:

  • Una directory .git raggiungibile permette a chiunque di ricostruire il tuo codice sorgente, incluso qualsiasi .env mai committato.
  • Le chiavi nel tuo bundle JavaScript non richiedono nemmeno uno scanner. Apri i DevTools e cerca nel bundle sk-, AIza o key.
  • Le source map in produzione possono distribuire il tuo codice sorgente originale, commenti compresi.
Directory .git esposta: come gli attaccanti ricostruiscono il tuo codice

Poi controlla i log. Cerca le richieste a /.env o /.aws/credentials. Se una qualsiasi ha restituito un 200, quello è l'orario di inizio del tuo incidente.

Come risolvere

1. Togli i segreti dalla web root. La vera soluzione è che il file semplicemente non sia lì da servire. Le variabili d'ambiente vanno nelle impostazioni del tuo host (Vercel, Netlify, Railway, Fly e gli altri le hanno tutti), non in un file che viene distribuito insieme ai tuoi asset statici. Assicurati che .env* sia sia in .gitignore sia in .dockerignore.

2. Blocca i dotfile a livello di server come rete di sicurezza. Per nginx:

# Deny all hidden files except the ACME challenge path
location ~ /\.(?!well-known) {
    deny all;
    return 404;
}

Per Apache (.htaccess):

<FilesMatch "^\.">
    Require all denied
</FilesMatch>

Per un'app Express che serve file statici, express.static ignora i dotfile per impostazione predefinita. Non sovrascriverlo con dotfiles: 'allow'.

3. Ruota tutto ciò che è stato esposto. Cancellare il file non annulla la fuga delle chiavi. Ruota ogni segreto che sia mai stato raggiungibile, partendo dalle chiavi di pagamento, del database e dei provider AI. Il nostro articolo sulla violazione di Railway spiega come ruotare i segreti della tua app senza downtime.

4. Smetti di fidarti dello user agent. Se lasci passare i crawler AI attraverso un firewall o un rate limit, verificali rispetto agli intervalli IP pubblicati dalle aziende invece di basarti sul nome. GreyNoise elenca nel suo report i file JSON ufficiali di Anthropic, OpenAI, Google e Perplexity. Il consiglio di Cequence è lo stesso: verifica tramite richieste firmate, intervalli di indirizzi pubblicati o integrazioni dirette.

5. Aggiorna i tuoi strumenti di sviluppo se sono esposti. GreyNoise ha visto questi scanner tentare anche il bug di lettura file di Vite CVE-2025-30208. Se un dev server Vite è raggiungibile da internet, aggiorna a 6.2.3, 6.1.2, 6.0.12, 5.4.15 o 4.5.10 o successive, e in primo luogo non esporre mai pubblicamente i dev server.

6. Imposta limiti di spesa sulle chiavi AI. La maggior parte dei provider AI ti permette di limitare la spesa mensile o di vincolare le chiavi a progetti specifici. Non fermerà una fuga, ma trasforma una sorpresa a quattro cifre in una piccola.

Checklist rapida

Prima di chiudere il terminale, assicurati che:

  • Ogni percorso del ciclo curl qui sopra restituisca 404/403, non il tuo file.
  • .env* sia in .gitignore e .dockerignore.
  • Il tuo server o host neghi l'accesso ai dotfile.
  • Non ci siano chiavi segrete nel bundle JS o nelle source map.
  • Ogni chiave che sia mai stata raggiungibile sia stata ruotata.
  • Le allowlist per i crawler AI controllino gli intervalli IP, non solo lo user agent.
  • Siano impostati limiti di spesa sulle chiavi dei provider AI.

Controlla prima che lo facciano i bot

Questi scanner ruotano tra centinaia di indirizzi e spendono circa otto secondi per ogni raffica. Non vinci guardando i log. Vinci assicurandoti che non ci sia niente quando bussano.

AppSafe controlla proprio le fughe che questi bot vanno cercando, tra cui file .env raggiungibili, directory .git esposte, dump di database e API key nel bundle frontend, e ogni risultato include un prompt di correzione da copiare e incollare nel tuo strumento di coding AI. Se sei ancora in fase di pre-lancio, la nostra checklist per le app costruite con l'AI è un'ottima lettura complementare. Esegui una scansione gratuita della tua app e guarda cosa vedrebbe un bot.

Esegui questa checklist in automatico

Un'unica scansione gratuita controlla la tua app per tutti questi problemi e ti dà un prompt di correzione AI per ogni risultato.

Scansiona la mia app gratis