« Sous Linux, un antivirus ne sert à rien » est une opinion répandue, et sous sa forme initiale elle est juste : les virus qui infectent les fichiers système de Linux n’existent pratiquement pas. Sur un serveur, ClamAV a une autre tâche, et elle s’énonce ainsi : trouver ce qui a été téléversé à travers votre site. Les web shells en premier lieu.

Ce que l’on cherche exactement

Un web shell est un petit fichier PHP qui permet d’exécuter des commandes depuis un navigateur. Il arrive sur le serveur par un formulaire de téléversement, une extension vulnérable ou un mot de passe d’administrateur deviné, se pose parmi les images du répertoire des téléversements et y vit des mois. Ni le pare-feu ni Fail2ban ne le verront : les requêtes vers lui ressemblent à des requêtes ordinaires vers le site.

Au-delà de cela, ClamAV trouve :

  • des fichiers malveillants téléversés par des utilisateurs et redistribués depuis votre serveur — c’est généralement l’objet de la lettre de l’hébergeur ;
  • des pièces jointes de courrier, si le serveur traite du courrier ;
  • des logiciels malveillants Windows dans des espaces de stockage — le serveur ne les intéresse pas, l’employé qui télécharge le fichier, si.

Sur les limites, tout de suite : ClamAV n’empêche pas une intrusion et ne la détecte pas de lui-même. Il détecte des traces. Une porte dérobée discrète ajoutée à un fichier de thème existant échappera à un analyseur par signatures — c’est le rôle du contrôle d’intégrité.

Installation et le réglage qui compte

sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam

La seconde commande importe plus que la première. freshclam est le service de mise à jour des signatures, et s’il ne tourne pas, ClamAV devient inutile tout en continuant d’annoncer des analyses réussies. L’âge des bases se vérifie ainsi :

sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam

Des bases de plus d’une semaine signifient un mécanisme cassé. Les causes fréquentes sont des connexions sortantes bloquées, ou un freshclam lancé à la main en root, après quoi le service ne peut plus écrire dans son propre fichier à cause des droits.

Mémoire : démon ou exécution ponctuelle

Il y a deux modes d’utilisation, et le choix doit être conscient.

clamd est un démon permanent qui garde les bases en mémoire. Il répond vite mais occupe environ un gigaoctet de mémoire vive. Sur un VPS d’un ou deux gigaoctets, c’est inacceptable : le démon évincera la base de données et PHP-FPM, et le serveur deviendra poussif sans raison apparente. Cela se diagnostique avec free -m et à l’usage du swap.

L’alternative est clamscan selon un calendrier. Il est plus lent (il charge les bases à chaque exécution, environ une minute) mais ne travaille que pendant l’analyse :

sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www

L’option -i n’affiche que les trouvailles ; sinon la sortie fait des centaines de milliers de lignes.

Analyser des répertoires, pas le disque

Une analyse complète du disque sur un serveur modeste dure des heures et crée de la charge, ce pourquoi on la programme la nuit puis on la désactive tout à fait. Il est plus pratique d’analyser ce qui change réellement depuis l’extérieur :

0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads

Trois choses comptent dans cette ligne. ionice et nice suppriment l’effet sur le site. --move plutôt que --remove — le fichier part en quarantaine au lieu d’être supprimé : les faux positifs existent, et un fichier de client effacé par erreur ne se récupère nulle part. Et le répertoire analysé est celui où l’on téléverse, pas la racine.

Des signatures pour les web shells

Les bases ClamAV livrées sont faibles sur les portes dérobées PHP — elles visent surtout le trafic de courrier. Linux Malware Detect (maldet) fait nettement mieux ici : il possède son propre jeu de signatures bâti précisément autour des web shells, et il analyse avec le moteur ClamAV si celui-ci est installé. La combinaison habituelle est ClamAV comme moteur et base actualisable, maldet comme source de signatures spécialisées.

Que faire d’une trouvaille

Un web shell trouvé n’est pas la fin de l’enquête mais son début. Un fichier dans le répertoire des téléversements signifie que quelqu’un a pu y écrire, et supprimer le fichier ne supprime pas cette possibilité.

  1. Ne supprimez pas tout de suite — gardez une copie et notez l’heure de modification du fichier.
  2. À partir de cette heure, retrouvez dans les journaux du serveur web la requête qui l’a déposé. C’est la vulnérabilité.
  3. Cherchez les voisins : une porte dérobée n’est presque jamais laissée en un seul exemplaire.
  4. Vérifiez ce qui a changé d’autre sur le disque à la même période, et si de nouvelles tâches cron et clés SSH sont apparues.

Un mot à part sur les faux positifs. Les bibliothèques de gabarits et le JavaScript minifié tombent parfois sous une signature. D’où la quarantaine plutôt que la suppression, et d’où le conseil de ne pas brancher sans discernement tous les jeux de signatures tiers que l’on trouve : la confiance envers un rapport dont la moitié des lignes est du bruit se perd en une semaine, et on cesse de le lire.

La valeur pratique d’un analyseur tient à ce que ses résultats sautent aux yeux : quand la dernière analyse a eu lieu, quel âge ont les bases, ce qui a été trouvé. C’est une seule ligne, mais son absence transforme un antivirus installé en case cochée. À quoi ressemble cette ligne, la page de démonstration ci-dessous le montre.