
🌐 Aussi en: English · Deutsch · Español
Un dossieruploads de WordPress est censé contenir vos photos de
vacances et un PDF de temps en temps. Il n’est surtout pas censé
héberger un web shell PHP – mais ce « censé » porte beaucoup sur ses
épaules. Le répertoire d’uploads est de loin l’endroit le plus courant où un
WordPress compromis finit par exécuter du code d’attaquant, parce qu’il est
accessible en écriture, joignable depuis le web, et que tout le monde l’oublie.
Alors j’ai donné un nez au mien : un antivirus qui renifle le dossier
d’uploads chaque nuit et m’envoie un e-mail dès qu’il sent quelque chose de
louche. 👃 Et comme un détecteur de fumée jamais testé n’est qu’un bijou de plafond, je l’ai
aussi déclenché exprès. J’y reviens à la fin.🎯 La conception (volontairement ennuyeuse)
- 🌙 À la demande, chaque nuit. Pas de démon de scan à l’accès en temps réel – c’est trop lourd pour un VPS modeste, et je suis pratiquement le seul à téléverser quoi que ce soit. Un passage par nuit est le bon compromis : au pire, un malware reste quelques heures avant l’e-mail du matin, pas des semaines.
- 🔇 Silencieux tant qu’il ne trouve rien. Même philosophie que pour tout le reste sur cette machine (rkhunter, Monit) : un scan propre n’envoie rien. Un e-mail du scanner signifie donc toujours « regardez ça tout de suite », jamais « tout va bien, comme d’habitude ».
- 🔎 Détection uniquement. Il signale, il ne supprime rien et ne met rien en quarantaine. Sur un blog personnel, je préfère examiner une alerte moi-même plutôt que de laisser un concierge automatique avaler en douce un faux positif.
- 🧩 Géré par Ansible (rôle
blog_clamav), donc reproductible et versionné – pas un script « flocon de neige » dont j’aurai oublié comment je l’ai construit.
📦 Installation & configuration
Sur AlmaLinux 9, le tout se résume à ClamAV et son outil de mise à jour des signatures :dnf install clamav clamav-updateLe freshclam.conf fourni contient une ligne d’exemple qui
l’empêche de jamais s’exécuter – le piège classique de la première fois.
Supprimez-la, téléchargez une première fois la base de signatures et activez les
mises à jour automatiques :# kill the "Example" line or freshclam refuses to start
sed -i '/^Example/d' /etc/freshclam.conf
freshclam # first full signature download
systemctl enable --now clamav-freshclam # keep signatures fresh automaticallyLe scan proprement dit est un petit script dans /usr/local/sbin/wordpress-clamav-scan.sh. Il ne scanne que le
répertoire d’uploads, ménage le reste de la machine, ignore les fichiers
absurdement gros (un malware ne se cache pas dans une vidéo de 300 Mo) et –
c’est l’essentiel – n’envoie un e-mail qu’en cas de détection :#!/bin/bash
SCAN_LOG="/var/log/clamav/wordpress-scan.log"
UPLOADS_DIR="/srv/wordpress-www/wp-content/uploads"
nice -n 19 ionice -c3 clamscan --recursive --infected --no-summary
\
--max-filesize=200M --max-scansize=200M
\
"$UPLOADS_DIR" > "$SCAN_LOG" 2>&1
RC=$?
# clamscan exit code 1 = something was found -> mail it, otherwise stay silent
if [ "$RC" -eq 1 ]; then
mail -s "[$(hostname -f)] ClamAV: infected file(s) found in WordPress uploads"
\
me@example.com < "$SCAN_LOG"
fi
exit 0Une entrée cron le lance chaque nuit à 02:45. L’e-mail part par le même relais msmtp que mes autres alertes (rkhunter, Monit) : un seul
chemin d’envoi à maintenir, pas trois.45 2 * * * /usr/local/sbin/wordpress-clamav-scan.sh🧪 Le faire aboyer : le test EICAR
Voici la partie amusante. Pour tester un antivirus, on ne télécharge pas un vrai malware – on utilise EICAR, une chaîne de test standard de 68 octets que tous les scanners de la planète sont tenus de signaler, et qui est totalement inoffensive (ce n’est pas un malware exécutable, juste une chaîne ASCII imprimable conçue uniquement pour déclencher la détection). On la dépose dans le chemin scanné, on lance le vrai script, on regarde toute la chaîne se déclencher, puis on la supprime :# drop the harmless EICAR test file into uploads
printf 'X5O!P%%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*\n'
\
> /srv/wordpress-www/wp-content/uploads/eicar-test.txt
# run the actual nightly script by hand
/usr/local/sbin/wordpress-clamav-scan.sh
# clean up immediately
rm -f /srv/wordpress-www/wp-content/uploads/eicar-test.txtClamAV l’a repérée instantanément – Eicar-Signature FOUND –,
le script s’est terminé avec le code de sortie 1, a envoyé l’e-mail, et quelques instants
plus tard ceci atterrissait dans ma boîte de réception :From: homelab@apt-upgrade.me
Subject: [www.apt-upgrade.me] ClamAV: infected file(s) found in WordPress uploads
/srv/wordpress-www/wp-content/uploads/eicar-test.txt: Eicar-Signature FOUNDEt pour être rigoureux, j’ai aussi vérifié le journal du relais de messagerie, qui
a confirmé la remise au lieu de simplement la supposer :host=smtp.strato.de tls=on auth=on ... recipients=you@example.com
smtpstatus=250 ... 'OK queued' exitcode=EX_OKDétection ✔️, chemin d’envoi du vrai script ✔️, livraison dans ma vraie boîte de
réception ✔️. C’est toute la différence entre « j’ai configuré un
scanner » et « j’ai un scanner qui fonctionne » – le second, vous
l’avez vu attraper quelque chose. 🎯 (Fichier de test supprimé juste après,
uploads de nouveau propres. C’était un exercice, pas une intrusion.)⚠️ Limites, en toute honnêteté
- C’est un scan nocturne, pas en temps réel. Un upload malveillant est détecté au prochain passage de 02:45, pas à l’instant où il arrive.
- Il scanne les uploads, le dossier le plus à risque – pas tout le disque. Pour la couche système, c’est un autre outil (ici, c’est le travail de rkhunter).
- Détection, pas suppression. L’e-mail est tout le produit ; le nettoyage reste une décision humaine.




