Depuis quelques mois, et en particulier depuis l'avènement du ransomware Locky et de ses dérivés, nous recevons de nombreux emails contenant un virus, généralement sous forme d'un fichier JS contenu dans une archive zip liée en pièce-jointe. Malheureusement, ces virus étant récents voire spécifiques à la France, ils ne sont pas détectés par ClamAV, l'antivirus le plus commun sur Linux, installé sur tous nos serveurs.

Les pistes testées

Avant de vous trouver la solution, nous avons exploré de nombreuses pistes, qui ont fonctionné un temps ou qui auraient pu fonctionner dans d'autres situations.

Créer nos propres signatures

C'est la solution que nous avions mise en place il y a environ un an pour lutter contre Drixed, un virus diffusé dans des documents Word. Déjà à l'époque, le mail faisait croire à une facture. Sur ce point, tout le crédit va à l'excellent article de Benjamin Sonntag.

Malheureusement, dans le cas présent, les fichiers JS sont obfusqués de manière aléatoire à chaque envoi. Après des heures à scruter leur contenu en texte et en hexadécimal, nous n'avons pas réussi à trouver le moindre pattern commun entre les fichiers. C'est pourtant faisable, comme on le verra plus loin. Mais je ne sais pas comment.

Bloquer en fonction du nom

L'idée suivante, ce fut de bloquer les mails en fonction du nom des pièces jointes. En effet, les noms de fichiers eux générés aléatoirement, mais on distingue un pattern commun sur les JS. Or Amavis ouvre les archives pour analyser leur contenu. On peut alors bloquer ces mail au niveau de Amavis par une regex :

$banned_filename_re = new_RE(
  # …
  qr'^(scanned_doc|scan|payment|confirmation|urgent|inv|details|e-bill|mail|billing)_.*\.js$',
  qr'^[A-Z]{3}[0-9]{10}\.js$',
);

Si cette technique réduit assez efficacement le nombre de virus qui traversent, de nouveaux noms apparaissent régulièrement. On se retrouve à devoir étudier les nouveaux virus et mettre à jour la regex toutes les semaines, avec ce sentiment d'avoir toujours une longueur de retard.

Bloquer toutes les pièces jointes en JS

Alors vient l'idée de bloquer carrément tous les mails ayant un js en pièce jointe (rappel : Amavis ouvre aussi les archives zip, rar, etc. pour contrôler leur contenu). Après tout, c'est bien ce que tous les serveurs font déjà avec les .exe.

Malheureusement :

  • Cette position s'est vite avérée intenable, parce que quelques utilisateurs ont besoin de recevoir des mails légitimes avec du JS en pièce jointe.
  • Ça ne bloque toujours pas tous les virus. Locky se présente aussi souvent sous forme de .doc et .docx, et on ne peut pas bloquer ces extensions.
  • Nous avons récemment remplacé Amavis et Spamassassin par Rmilter et Rspamd (j'en reparlerai ici), qui n'ouvrent pas les archives et ne permettent donc pas de bloquer les .js de cette manière.

La révélation

C'est après toutes ces tentatives que nous avons fini par trouver une solution… disons le clairement, magique.

Figurez-vous que, si ClamAV installe et met à jour sa base de signatures officielle dans /var/lib/clamav, il existe de nombreux autres fournisseurs de signatures. La plus connue est probablement « maldet », qui permet de scanner les CMS pour détecter des virus PHP, mais il y en aussi des dizaines spécialisées sur les emails.

Figurez-vous aussi qu'il existe un script, clamav-unofficial-sigs.sh, qui se charge justement de télécharger et de mettre à jour ces dizaines de bases de signatures non-officielles pour ClamAV.

Il est présent dans les dépôts Debian Stable, mais malheureusement il ne fonctionne pas car trop vieux. Il va donc falloir l'installer depuis Github :

# Téléchargement
cd /tmp
wget https://github.com/extremeshok/clamav-unofficial-sigs/archive/5.3.2.zip
unzip 5.3.2.zip
cd clamav-unofficial-sigs-5.3.2

# Installation
sudo cp clamav-unofficial-sigs.sh /usr/local/bin
sudo chmod +x /usr/local/bin/clamav-unofficial-sigs.sh
sudo mkdir /etc/clamav-unofficial-sigs
sudo cp -r config/* /etc/clamav-unofficial-sigs/
sudo mkdir /var/log/clamav-unofficial-sigs
sudo chown clamav:clamav /var/log/clamav-unofficial-sigs

# Configuration
cd /etc/clamav-unofficial-sigs/
sudo cp os.debian8.conf os.conf
sudo vim /etc/clamav-unofficial-sigs/user.conf # user_configuration_complete="yes"

# Fin de l'installation
sudo clamav-unofficial-sigs.sh --install-cron
sudo clamav-unofficial-sigs.sh --install-logrotate
sudo clamav-unofficial-sigs.sh --install-man
sudo chown clamav:clamav /var/lib/clamav-unofficial-sigs

# Et enfin, on l'exécute
sudo -u clamav /usr/local/bin/clamav-unofficial-sigs.sh

Si tout s'est bien passé, vous devriez avoir une dizaine de bases supplémentaires dans /var/lib/clamav. Eh bien croyez-le ou pas, c'est fini. La lutte contre les virus, c'est réglé.

Conclusion

Même si nous n'avons pas de chiffre exact, depuis que nous avons mis ce système en place nous pensons avoir réduit le nombre de virus d'au moins 90%.

En d'autres termes, là où personnellement je recevais une vingtaine de virus par jour, j'en reçois désormais rarement plus de un par jour.

À propos de l'auteur



Guillaume est l'un des deux fondateurs et cogérants de Sysnove. Développeur Python et administrateur système passionné de logiciel libre et des technologies liées à Internet, il participe à divers projets, notamment le fournisseur d'accès Internet Aquilenet ainsi que la Fédération FDN.

Chez Sysnove, son rôle consiste à mettre en place et administrer les infrastructures nécessaires à l'hébergement des services fournis aux clients. En tant que directeur général, il gère aussi les aspects administratifs de l'entreprise.