Situation actuelle : PHP2Shell. Deux failles PHP critiques (CVSS 9.2) permettent d'exécuter du code malveillant sans authentification. Correctifs disponibles depuis le 21 octobre 2026.Ce qu'il faut faire maintenant →

Le serveur envoie du spam : trouver les causes

Courriels non distribuables, listes de blocage, plaintes : quand votre propre serveur envoie du spam, un script ou une boîte aux lettres détournée en est le plus souvent la cause. Voici comment trouver la source.

État 7 min de lectureDétection et forensique

En bref : quand le serveur envoie du spam, il y a le plus souvent l'une de ces trois causes : un script PHP injecté ou détourné, une boîte aux lettres au mot de passe volé ou un serveur de messagerie mal configuré. Sauvegardez quelques-uns des courriels en attente, lisez leurs en-têtes et le journal de messagerie, et vous trouvez dans la plupart des cas la source. Ensuite, arrêtez l'envoi, fermez la cause et ne demandez qu'alors le retrait des listes de blocage.

Quand des clients trouvent vos factures dans le dossier de spam

Cela commence rarement par un avis de sécurité. Le plus souvent, ce sont des clients qui ne reçoivent plus vos offres, ou la boîte aux lettres se remplit de messages de retour pour des courriels que personne n'a jamais écrits. Parfois, l'hébergeur bloque l'envoi et invoque un trafic de messagerie anormal.

Pour l'entreprise, cela a vite des conséquences perceptibles. Si l'adresse du serveur figure sur une liste de blocage, d'autres serveurs de messagerie refusent aussi vos vrais courriels : factures, confirmations de commande, liens de mot de passe de la boutique. La réputation du domaine en souffre, et le dommage grandit à chaque heure où l'envoi se poursuit.

L'envoi de spam compte parmi les conséquences connues d'une compromission. Après PHP2Shell, les failles CVE-2026-109618 et CVE-2026-109619 avec exécution de code sans authentification, c'est une raison de plus de regarder de plus près. Le spam n'est toutefois pas un indice spécifique de PHP2Shell ; il n'existe pas d'indicateurs de compromission (Indicators of Compromise) confirmés. D'autres signes généraux sont décrits dans Suis-je déjà compromis ?.

Trois causes typiques quand le serveur envoie du spam

Cause Tableau typique Où regarder
Script PHP injecté courriels sans authentification, remis localement via sendmail en-têtes, journal de messagerie PHP, nouveaux fichiers PHP
Formulaire détourné courriels via un formulaire de contact ou de recommandation vers des destinataires étrangers journal d'accès du formulaire, en-têtes
Boîte aux lettres détournée envoi avec une authentification valide auprès du serveur de messagerie journal de messagerie avec nom de connexion, lieux de connexion
Serveur de messagerie ouvert des expéditeurs étrangers utilisent votre serveur comme relais configuration du serveur de messagerie, vérification externe

Les deux premières causes concernent le site web, la troisième les comptes de messagerie, la quatrième la configuration du serveur. La distinction est importante, car les contre-mesures sont totalement différentes.

Lire la file d'attente de courriels

Sur les serveurs avec Postfix, la file d'attente montre ce qui doit être envoyé en ce moment. Les commandes suivantes ne font que lire :

# Afficher le contenu de la file d'attente (équivaut à mailq)
postqueue -p | tail -30

# Afficher les en-têtes d'un courriel isolé (insérer l'ID de file tiré de la liste)
sudo postcat -q -h QUEUE-ID

# Connexions réussies au serveur de messagerie avec nom d'utilisateur
sudo grep 'sasl_username=' /var/log/mail.log | awk -F'sasl_username=' '{print $2}' | sort | uniq -c | sort -rn | head

Les en-têtes révèlent souvent déjà la source. Si le courriel provient d'une boîte aux lettres authentifiée, le nom de connexion apparaît dans le journal de messagerie. Si un compte isolé s'y accumule avec des connexions depuis des pays étrangers, le mot de passe de cette boîte est très probablement devenu connu. Si en revanche le courriel a été remis localement, il vient le plus souvent d'un script sur le serveur.

Si un autre serveur de messagerie tourne sur votre serveur, par exemple Exim, les commandes s'appellent autrement, le principe reste le même : examiner la file d'attente, lire les en-têtes, compter les connexions dans le journal. En hébergement mutualisé sans accès shell, demandez par écrit à l'hébergeur un extrait du journal de messagerie et quelques courriels d'exemple avec leurs en-têtes complets. De nombreux hébergeurs fournissent ces indications sur demande, parce qu'ils ont eux-mêmes intérêt à mettre fin à l'envoi.

Sauvegardez quelques courriels complets avant de suspendre ou de vider la file d'attente. Ils sont des preuves pour l'analyse ultérieure et pour les échanges avec l'hébergeur ou les exploitants de listes de blocage.

Trouver le script PHP responsable

Si l'envoi passe par PHP, la configuration de messagerie de PHP aide. Selon le manuel PHP, mail.log journalise chaque appel de la fonction mail() avec le chemin complet du script, le numéro de ligne, le destinataire et les en-têtes. mail.add_x_header écrit en plus dans chaque courriel un en-tête X-PHP-Originating-Script avec l'identifiant de l'utilisateur et le nom du fichier.

; Dans php.ini ou dans le pool FPM, puis redémarrer tous les workers
mail.add_x_header = On
mail.log = /var/log/php/mail.log

Le fichier journal doit être accessible en écriture pour le processus PHP. L'en-tête révèle un nom de fichier aux destinataires ; désactivez-le après l'analyse si vous ne le voulez pas durablement.

Si l'expéditeur est un fichier inconnu, par exemple dans le dossier de téléversement ou de cache, c'est un indice de webshell. La façon de situer de tels fichiers est décrite dans Reconnaître et supprimer un webshell. S'il s'agit en revanche d'un formulaire de contact connu, il a probablement été détourné, par exemple parce que le destinataire ou les en-têtes sont repris de saisies du formulaire. C'est une erreur dans le code, non une intrusion, mais elle doit être corrigée tout aussi vite.

Tout spam n'utilise pas la fonction mail(). Du code malveillant peut aussi établir directement une connexion vers des serveurs de messagerie étrangers. L'envoi n'apparaît alors ni dans la file d'attente ni dans le journal de messagerie PHP, mais bien comme connexions sortantes sur le port 25. La façon de les vérifier figure sous Vérifier les connexions sortantes d'un serveur.

Arrêter l'envoi et redémarrer proprement

Une fois la source trouvée, le nettoyage suit dans cet ordre :

  1. Suspendre l'envoi : bloquer la voie concernée, donc désactiver le script, bloquer la boîte aux lettres ou suspendre la file d'attente. Sauvegarder les courriels en attente comme preuve.
  2. Fermer la cause : pour un webshell, amener PHP à un état corrigé (8.5.12, 8.4.27, 8.3.36, 8.2.35 ou rétroportage confirmé), redémarrer tous les workers et nettoyer le site. Pour un formulaire, corriger le code. Pour une boîte aux lettres, changer le mot de passe et vérifier l'appareil de l'utilisateur.
  3. Chercher d'autres traces : qui envoie du spam via un webshell a souvent créé d'autres portes dérobées.
  4. Limiter la sortie : n'autoriser les connexions sortantes sur le port 25 que pour le serveur de messagerie, pas pour l'utilisateur du serveur web.
  5. Nettoyer les listes de blocage : ce n'est que maintenant qu'il faut demander le retrait aux exploitants des listes de blocage et décrire brièvement ce qui a été corrigé.
Astuce

Profitez-en pour vérifier SPF, DKIM et DMARC de votre domaine. Ces entrées DNS définissent quels serveurs peuvent envoyer au nom de votre domaine, et compliquent l'usage abusif de votre adresse d'expéditeur par des tiers.

Comment PHP SOS aide-t-il concrètement ?

  • Nous exploitons la file d'attente, les en-têtes et les journaux de messagerie et établissons si la cause est un script, un formulaire, une boîte aux lettres ou la configuration.
  • Nous arrêtons l'envoi de façon contrôlée et sauvegardons des preuves pour l'hébergeur et les listes de blocage.
  • Nous nettoyons le site dans le cadre de la suppression de logiciels malveillants et fermons la porte d'entrée.
  • Nous limitons le trafic de messagerie sortant au niveau du serveur et accompagnons le retrait des listes de blocage.

Questions fréquentes

Comment remarquer que mon serveur envoie du spam ?

Sont typiques des messages de retour pour des courriels que personne n'a écrits, des avis de l'hébergeur, une file d'attente de courriels pleine et des clients qui trouvent soudain vos courriels dans le dossier de spam. L'inscription de l'adresse de votre serveur sur des listes de blocage publiques est aussi un signe net.

Comment trouver le script PHP qui envoie du spam ?

PHP peut journaliser chaque appel de la fonction mail() avec le chemin du script si mail.log est défini. Avec mail.add_x_header, PHP écrit en plus le nom du script dans l'en-tête de chaque courriel. Dans les courriels déjà envoyés ou en attente, un coup d'œil aux en-têtes aide.

Dois-je vider immédiatement la file d'attente de courriels ?

Pas avant d'avoir sauvegardé quelques courriels comme preuve. Les en-têtes montrent souvent quel script ou quelle boîte aux lettres a déclenché l'envoi. Suspendre vaut le plus souvent mieux que supprimer, tant que la source est inconnue.

Comment sortir des listes de blocage ?

D'abord supprimer la cause, puis demander le retrait auprès des exploitants des listes de blocage concernées. La plupart exigent une explication de ce qui a été corrigé. Qui demande trop tôt et continue d'envoyer du spam est de nouveau listé.

Sources

Contact immédiat

Chaque heure compte. Écrivez-nous maintenant.

Décrivez brièvement votre système, votre version de PHP et ce que vous avez observé. Nous vous répondons, faisons le point et travaillons à distance jusqu'à la clôture et la documentation de l'incident.

Aide immédiate