«Su Linux l’antivirus non serve» è un’opinione diffusa, e nella sua forma originale è corretta: virus che infettano i file di sistema di Linux praticamente non esistono. Su un server ClamAV ha un altro compito, e si formula così: trovare ciò che è stato caricato attraverso il suo sito. Le web shell in primo luogo.
Che cosa si cerca esattamente
Una web shell è un piccolo file PHP che consente di eseguire comandi dal browser. Arriva sul server tramite un modulo di caricamento, un’estensione vulnerabile o una password di amministratore indovinata, si sistema fra le immagini nella cartella dei caricamenti e vi resta per mesi. Né il firewall né Fail2ban la vedranno: le richieste verso di essa sembrano normali richieste al sito.
Oltre a questo, ClamAV trova:
- file dannosi caricati dagli utenti e ridistribuiti dal suo server: di solito è di questo che parla la lettera del provider;
- allegati di posta, se il server gestisce la posta;
- malware per Windows negli archivi di file: al server non interessa, ma il dipendente che scarica il file ne farà le spese.
Sui limiti, subito: ClamAV non impedisce un’intrusione e non la rileva da sé. Rileva le tracce. Una porta di servizio discreta aggiunta a un file di tema esistente sfuggirà a un analizzatore basato su firme: per quello serve il controllo di integrità.
Installazione e l’impostazione che conta
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
Il secondo comando conta più del primo. freshclam è il servizio di aggiornamento delle firme, e se non gira, ClamAV diventa inutile continuando però a segnalare scansioni riuscite. L’età delle basi si verifica così:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Basi più vecchie di una settimana significano meccanismo rotto. Le cause frequenti sono connessioni in uscita bloccate, oppure un freshclam avviato a mano come root, dopo il quale il servizio non riesce più a scrivere nel proprio file per via dei permessi.
Memoria: demone o esecuzione una tantum
Ci sono due modi d’uso, e la scelta dev’essere consapevole.
clamd è un demone permanente che tiene le basi in memoria. Risponde in fretta ma occupa circa un gigabyte di RAM. Su un VPS da uno o due gigabyte è inaccettabile: il demone scaccerà il database e PHP-FPM, e il server diventerà pesante senza motivo apparente. Si diagnostica con free -m e dall’uso dello swap.
L’alternativa è clamscan a orario. È più lento (carica le basi a ogni esecuzione, circa un minuto) ma lavora solo durante la scansione:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
L’opzione -i stampa solo i ritrovamenti; altrimenti l’output è di centinaia di migliaia di righe.
Analizzare cartelle, non il disco
Una scansione completa del disco su un server modesto dura ore e genera carico, per cui la si programma di notte e poi la si disattiva del tutto. È più pratico analizzare ciò che cambia davvero dall’esterno:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Tre cose contano in quella riga. ionice e nice eliminano l’effetto sul sito. --move invece di --remove: il file va in quarantena invece di essere cancellato, perché i falsi positivi esistono e un file di un cliente cancellato per errore non si recupera da nessuna parte. E la cartella analizzata è quella in cui si carica, non la radice.
Firme per le web shell
Le basi fornite con ClamAV sono deboli sulle porte di servizio in PHP: puntano soprattutto al traffico di posta. Linux Malware Detect (maldet) fa nettamente meglio: ha un proprio insieme di firme costruito proprio attorno alle web shell, e analizza con il motore di ClamAV se questo è installato. La combinazione abituale è ClamAV come motore e base aggiornabile, maldet come fonte di firme specializzate.
Che fare con un ritrovamento
Una web shell trovata non è la fine dell’indagine ma il suo inizio. Un file nella cartella dei caricamenti significa che qualcuno è riuscito a scrivervi, e cancellare il file non elimina quella possibilità.
- Non lo cancelli subito: conservi una copia e annoti l’ora di modifica del file.
- Con quell’ora, trovi nei registri del server web la richiesta che ce l’ha messo. Quella è la vulnerabilità.
- Cerchi i vicini: una porta di servizio non viene quasi mai lasciata in un solo esemplare.
- Verifichi che cos’altro è cambiato sul disco nello stesso periodo e se sono comparsi nuovi lavori di cron e chiavi SSH.
Due parole a parte sui falsi positivi. Le librerie di template e il JavaScript minificato a volte finiscono sotto una firma. Da qui la quarantena invece della cancellazione, e da qui anche il consiglio di non collegare senza criterio tutti gli insiemi di firme di terzi che si trovano: la fiducia in un rapporto in cui metà delle righe è rumore si perde in una settimana, e poi non lo si legge più.
Il valore pratico di un analizzatore sta nel fatto che i suoi risultati saltino agli occhi: quando è stata l’ultima scansione, quanto sono vecchie le basi, che cosa è stato trovato. È una sola riga, ma la sua assenza trasforma un antivirus installato in una casella spuntata. Come appare quella riga lo mostra la pagina dimostrativa qui sotto.