Premiers secours · 11 min · publié le 13 mars 2024

Plusieurs sites infectés sur le même compte d'hébergement

Un site abandonné du même compte sert souvent de rampe. Nettoyer uniquement le site visible garantit une réinfection. Inspectez tout le home — addon domains, vieux `old/`, sous-domaines de test — pas seulement le WordPress qui « fait de l’argent ».

Réponse directe

Un site abandonné du même compte sert souvent de rampe. Nettoyer uniquement le site visible garantit une réinfection. Inspectez tout le compte.

plusieurs sites piratés infection latérale hébergement voisin de serveur malware

Ce que « même compte » veut dire concrètement

Plusieurs sites infectés sur le même compte d’hébergement, ce n’est pas de la malchance statistique. C’est souvent le même utilisateur système, le même PHP qui peut `fopen` le dossier d’à côté, les mêmes mots de passe FTP, le même cron. « Mutualisé » chez l’hébergeur, « un login cPanel » chez vous : un home, plusieurs document roots.

Infection latérale : le site B (vieux Joomla, préprod oubliée) écrit dans `../siteA/wp-content/uploads`. Votre Wordfence sur A est vert après nettoyage. B n’a pas de plugin. H+6, A est sale. Vous accusez WordPress. C’était B.

Listez d’abord : domaines, sous-domaines, addon, alias, dossiers `public_html`, `www`, `old`, `backup`, `dev`. Le gestionnaire de fichiers, pas seulement « mes sites » dans la tête. On trouve toujours un dossier de plus.

  • Un user Unix / un cPanel = un périmètre.
  • Le site « important » n’est pas le seul à inspecter.
  • Les archives zip dans le home sont des sites potentiels (et des secrets).
Un voisin sur la même IP mais un autre compte est un autre sujet (réputation, parfois isolation faible). Ici : votre login, vos dossiers.

Comment l’infection circule d’un dossier à l’autre

PHP du site B avec les droits de l’utilisateur : lecture `wp-config` de A, écriture d’un mu-plugin chez A. Cron qui boucle sur tous les `*/public_html`. Mot de passe FTP unique pour tout le compte. Panel : un attaquant qui a le panel n’a pas besoin de « circuler », il est déjà partout.

Moins fréquent mais réel : inclusion via un mauvais `open_basedir`, un `symlink`, un plugin de backup qui zippe tout le home dans un dossier web de A (et le zip se télécharge). Le vecteur n’est pas magique. Il est local.

Les scanners « un site = une licence » ne marchent pas ce problème. Ils n’ont pas le droit, parfois, de sortir du document root. Croyez leur vert sur A, c’est leur scope, pas la vérité du compte.

Le site abandonné, cas le plus fréquent

Campagne 2018, préprod `dev.exemple.fr`, `exemple.fr/old`, un PrestaShop mort, un WordPress d’essai. Plus à jour depuis des années, parfois encore dans le DNS. C’est la rampe. On ne le « nettoie » pas : on l’éteint (vhost, DNS, dossier hors web), après copie s’il reste une pièce, ou on le traite comme un incident à part s’il doit vivre.

Tant qu’il répond 200 avec un CMS troué, il refera A. Les titulaire disent « on s’en sert plus donc ce n’est pas grave ». C’est l’inverse : plus personne ne le regarde, donc personne ne voit le shell.

Parked / addon oublié : même famille. Voir aussi sous-domaine oublié et parked domain.

Ce que le plugin du site A ne voit jamais

Le document root de B, les crons du compte, les mails, les autres bases SQL du même user, le `~/tmp` , le `~/.ssh`. Wordfence n’est pas l’antivirus du cPanel. Ne lui demandez pas ça. Plugin pendant l’attaque.

L’hébergeur, lui, scanne parfois tout le home. D’où un email « malware » sur un chemin que vous ne reconnaissez pas : ce n’est pas « une erreur ». C’est B. Demandez le chemin, ouvrez B.

Un seul site « vert » dans un compte sale n’est pas un indicateur. C’est un angle mort.

Ordre de nettoyage : cartographier d’abord

Inventaire écrit : domaine → dossier → CMS → dernier admin humain → on garde / on éteint. Puis copie du home (ou de chaque vhost). Puis secrets panel (une fois, ça couvre tout). Puis traitement des rampes (éteindre B) avant le polish de A, ou en parallèle. Nettoyer A trois fois pendant que B tourne est du temps perdu.

Si le temps manque : éteindre B (403, retirer le vhost, dossier hors web) le jour J, nettoyer A le soir. Mieux qu’un A « nickel » et un B ouvert.

Bases : une base par site, parfois une base partagée. Une injection dans une table n’est pas « le problème de A seulement » si l’user SQL voit les deux.

Permissions, PHP, et cage qui n’en est pas une

Sur un bon mutualisé, `open_basedir` empêche A de lire B. Sur un mauvais, ou un VPS « tout en 755 », non. Après incident : demandez à l’hébergeur l’isolation, vérifiez qu’un PHP de B ne fait pas file_get_contents vers le wp-config de A. Si ça passe, changez d’offre ou d’hébergeur — après nettoyage, voir migrer propre.

Permissions : `wp-config` 600, pas 644 si l’user est partagé. Les backups du home ne doivent pas être dans un dossier web. Les zips `backup-tous-mes-sites.zip` à la racine de A sont une fuite + une rampe.

Un FTP par site, pas un FTP sur `public_html` entier. Plus pénible. Moins de latéral.

Un seul ticket abuse, plusieurs vhosts

L’hébergeur suspend le compte, pas « la boutique ». Votre constat doit lister tous les chemins, y compris B. « A est propre » alors que le scan voit B : refus. Répondre à l’abus : tableau domaine / trouvé / retiré.

Ne créez pas un ticket par site. Un fil, une référence, l’inventaire. Sinon quatre interlocuteurs et un unsuspend partiel.

Resource abuse (minage) : le process est souvent sur B. Tuez le cron du compte, pas seulement le plugin de A.

Pour que ça ne revienne pas par le voisin

Éteindre les morts, séparer les FTP, isolation, mots de passe distincts, ne plus empiler vingt sites « on ne sait jamais ». Un site = une raison d’être encore en 200. Surveillance des dates sur tout le home, pas un scan A le lundi.

Si vous ne pouvez pas gérer quinze CMS, vous n’avez pas quinze CMS. Vous avez une surface. Réduisez-la. C’est plus efficace qu’un WAF sur A seul.

Guide voisin de serveur pour l’IP partagée avec d’autres clients. Ici, le voisin, c’était vous.

Questions fréquentes

Les sites sont dans des cPanel différents, même offre. Ça circule ?

+
Moins, si l’isolation tient. Vérifiez quand même mots de passe réemployés et backups croisés. L’IP commune reste un sujet réputation, pas forcément d’écriture.

Je n’ai qu’un WordPress. Pourquoi parler de voisin ?

+
Parce qu’un sous-domaine, un `/old`, un zip, un addon « parking » comptent. Ouvrez le gestionnaire de fichiers une fois. La surprise est fréquente.

Puis-je tout mettre dans un seul WordPress multisite pour simplifier ?

+
Ça réduit les CMS, ça élargit le blast radius : un admin, tout tombe. Ce n’est pas une parade à l’incident en cours. Décision d’archi, après.

L’hébergeur peut-il isoler après coup ?

+
Parfois (Cloudlinux, cages). Demandez. Si non, migration propre vers une offre isolée. Pas un transfert du home sale.

Dois-je payer un nettoyage par site ?

+
Le périmètre est le compte. Un devis « un site » alors que B est ouvert est un devis incomplet. Voyez les tarifs.
À lire ensuite
Changer d’hébergeur encore infecté Sous-domaine oublié Réputation IP / voisin Email malware détecté Backdoor PHP Premiers gestes