Come funziona questo controllo
Scanaris richiede nove nomi di file che le persone usano in continuazione per conservare backup nella radice del sito: backup.zip, backup.tar.gz, website.zip, www.zip, public_html.zip, site.zip, database.sql, dump.sql e db.sql. Per ciascuno verifica che la risposta sia un file vero e non la pagina generica del tuo sito: guarda il tipo di contenuto e, per i dump SQL, che il testo somigli a SQL. Tutti i rilievi sono di gravità critica, perché un file del genere contiene o il codice completo del sito o l'intero database.
Perché è importante
Un backup.zip raggiungibile è il tuo progetto completo: codice, configurazione, le chiavi che giravano nei file e, spesso, una copia del database dentro. Un dump.sql è il database così com'è: utenti, e-mail, password hashate (attaccabili con calma), ordini, messaggi. Nessuna tecnica necessaria: è un download. E gli scanner automatici provano esattamente questi nomi contro tutti i domini che trovano, quindi «nessuno conosce l'URL» non è una protezione.
Perché succede
Per comodità nel momento sbagliato: prima di una migrazione o di un aggiornamento, si comprime la cartella del sito «per sicurezza» e la si lascia lì. Oppure un plugin di backup scrive in una cartella pubblica. Oppure un'esportazione del database viene salvata accanto al codice per passarla a qualcuno. Su un server che serve la radice del progetto, qualsiasi file che ci finisce è pubblico all'istante.
Come risolvere
- Elimina il file adesso e agisci come se fosse stato scaricato: ruota tutte le chiavi e le password che conteneva e, se c'erano dati personali, valuta l'obbligo di notifica.
- Sposta i backup fuori dalla directory pubblica. I backup vanno in uno storage a parte (un bucket privato, un altro server), mai in una cartella servita dal server web.
- Configura lo strumento di backup perché scriva fuori dalla radice web. I plugin WordPress di solito permettono di scegliere la cartella o di inviare a un servizio esterno.
- Blocca le estensioni lato server come seconda barriera. In nginx:
location ~* \.(zip|tar|gz|sql|bak)$ { deny all; }. In Apache, unFilesMatchequivalente conRequire all denied. Se offri legittimamente download compressi, limitali a una cartella specifica. - Controlla i log di accesso cercando richieste in 200 verso questi nomi: ti diranno se qualcuno è passato prima.
Verifica che sia risolto
for p in backup.zip backup.tar.gz website.zip www.zip public_html.zip site.zip database.sql dump.sql db.sql; do
printf "%-18s " "$p"; curl -s -o /dev/null -w "%{http_code} %{content_type}\n" "https://tuodominio.it/$p"
done
Atteso: 404 o 403. Un 200 in text/html su una single-page app è il suo HTML generico; un 200 in application/zip, application/octet-stream o text/plain è il file vero.
Domande frequenti
Il mio backup ha un nome che nessuno indovinerebbe.
Gli strumenti di attacco provano migliaia di nomi e combinazioni con il dominio, la data e parole come «old» o «bak». Un nome insolito riduce il rischio ma non lo elimina; la soluzione è che non stia in una cartella pubblica.
E se il file è protetto da password?
Uno ZIP con password si scarica lo stesso e si attacca senza limite di tentativi sul computer dell'attaccante. Resta un rilievo critico.
Il controllo guarda solo la radice. E le sottocartelle?
Esatto, questi nove nomi vengono testati nella radice. Gli elenchi di directory aperti, misurati da un altro controllo, sono il modo abituale per trovare backup nelle sottocartelle; chiuderli e bloccare le estensioni copre il resto.