Remettre en état un site piraté, et qu'il le reste

J'ai remis en état plusieurs sites entièrement compromis, pour des clients différents. L'intervention ne s'arrête pas à faire réafficher le site : il faut retrouver le mécanisme qui réinstalle le code, vérifier la base de données autant que les fichiers, et vous remettre un rapport écrit de ce qui a été trouvé et de ce qui a été fait.

Redirections, pages de spam indexées, avertissement de Google, hébergeur qui coupe l'accès. Ou aucun signe du tout. Les sites que j'ai repris sont repartis en production, assainis, et ils sont restés en ligne depuis.

Les premières heures comptent moins que les premiers réflexes

Il n'y a pas d'urgence à remettre le site en ligne. Il y a une urgence à ne pas détruire ce qui permettra de comprendre ce qui s'est passé.

Gardez par écrit ce que dit votre hébergeur : ce qu'il a détecté, quand, et sur quelle adresse. C'est le point de départ du dossier qui lui sera renvoyé, et ça évite d'avoir à reconstruire l'historique plus tard.

Et si le site traite des données personnelles, la question de la notification se pose, avec un délai. Ce n'est pas à moi de vous conseiller là-dessus, mais c'est à regarder tout de suite plutôt que dans trois semaines.

Les réflexes qui aggravent la situation

  • supprimer les fichiers suspects : vous perdez l'inventaire, et le mécanisme qui les réinstalle reste en place
  • restaurer une sauvegarde à l'aveugle : sur le cas le plus lourd, la plus ancienne dont disposait le client datait de trois semaines après l'intrusion, et était déjà infectée
  • changer le mot de passe administrateur et s'arrêter là : ce n'est presque jamais par là qu'ils sont entrés, ni par là qu'ils restent
  • remettre le site en ligne parce qu'il réaffiche : c'est souvent le moment où la compromission revient

Le problème n'est pas de trouver les fichiers

Quand un site est compromis, la difficulté n'est presque jamais de repérer du code infecté. C'est de savoir ce qu'on peut garder, et de trouver ce qui le réinstalle.

Sur le cas le plus lourd que j'ai traité, la compromission a duré sept semaines avant que l'hébergeur ne la détecte. Ni défacement, ni redirection, rien d'anormal à l'écran : l'attaquant se servait du site comme d'un serveur, et le client n'avait aucune raison de se douter de quoi que ce soit.

Un site qui réaffiche normalement n'est donc pas un site assaini, et c'est une confusion qui coûte cher : on croit l'incident terminé, puis la compromission revient. Pour situer ce type d'intervention dans un cadre plus large, voyez les cas d'intervention et la reprise d'existant.

Ce qu'on découvre presque toujours

  • aucune sauvegarde propre à restaurer, donc pas de retour en arrière possible
  • un socle en retard, avec des extensions laissées sans mise à jour pendant des années
  • un hébergeur qui a suspendu l'accès et ne le rétablira que sur dossier
  • un site déjà « nettoyé » une fois, et recompromis dans les jours qui ont suivi
  • des redirections, des pages de spam indexées, parfois un avertissement de Google

Ne pas retirer ce qu'on reconnaît, mais garder ce qu'on a vérifié

Le socle est reconstruit à partir des sources officielles, et on ne reporte que le contenu vérifié. C'est l'inverse du nettoyage, qui consiste à retirer d'un ensemble douteux ce qu'on arrive à identifier comme mauvais, et à espérer qu'il ne restait rien d'autre.

Concrètement, sur ce même cas : 269 fichiers de thème repris d'une sauvegarde antérieure à l'intrusion, plus cinq repris du site vivant parce qu'ils avaient changé depuis, chacun vérifié individuellement. Base de données exportée puis assainie à la main, et chaque média validé par sa signature binaire.

Chercher des signatures connues ne trouve que ce qui est déjà répertorié. Tout le reste passe. Et trouver les fichiers ne suffit pas : tant que le mécanisme qui les réinstalle reste en place, le site se recompromet.

Ce qui est vérifié, point par point

  • chaque fichier du cœur et des extensions, comparé à la version officielle exacte
  • la base de données, où du code encodé peut dormir dans les options
  • les dossiers de médias et de cache, où personne ne cherche du code
  • les tâches planifiées, les comptes administrateurs et les clés d'accès
  • les mécanismes de réinstallation, tant qu'il en reste un seul

Quatre endroits, et rarement un seul à la fois

Ce sont les quatre endroits où j'ai réellement trouvé du code sur les sites que j'ai repris. Un nettoyage qui n'en couvre qu'une partie laisse le site repartir avec sa compromission.

Les fichiers du cœur et des extensions

Du code ajouté dans des fichiers par ailleurs légitimes. Sur le cas le plus lourd que j'ai traité, 38 fichiers malveillants et cinq malwares qui tournaient en parallèle. C'est la comparaison à la version officielle exacte qui les fait apparaître.

La base de données

Une charge encodée dormait dans les options du site, et réécrivait les fichiers supprimés à chaque chargement de page. Le site se réinfectait tout seul, et aucun nettoyage de fichiers n'y aurait changé quoi que ce soit.

Les dossiers de médias et de cache

Onze web shells déposés dans les médias, là où il ne devrait y avoir que des images. Et des charges dans le répertoire temporaire du système, hors de portée de toute sauvegarde.

Les accès laissés derrière eux

Trois comptes administrateurs pirates, et des portes dérobées de natures différentes, précisément pour que la fermeture de l'une ne suffise pas à reprendre la main.

Vous repartez avec un document, pas seulement avec un site qui remarche

Le rapport est remis avec l'intervention, et c'est souvent lui qui débloque la situation, bien au-delà de la partie technique.

Il recense ce qui a été trouvé et à quel endroit, ce qui a été corrigé, et ce qui reste à décider. Le format est le même quelle que soit l'ampleur du cas, et il se transpose à un ensemble de sites lorsque plusieurs sont touchés en même temps.

À quoi il sert

  • rouvrir le dialogue avec l'hébergeur, qui ne rétablit généralement l'accès que sur dossier documenté
  • vous laisser une trace de ce qui a été trouvé et de ce qui a été fait
  • poser noir sur blanc les décisions qui restent à prendre, sur le thème, les extensions et l'hébergement

Le site ne revient pas à l'identique, il revient en meilleur état

Remettre un site en ligne exactement tel qu'il était, c'est le préparer à se faire attaquer de la même façon. Et comme le socle est de toute façon reconstruit à partir de sources officielles, une partie du travail d'optimisation est déjà faite au moment où on remonte le contenu.

S'il y a une bonne nouvelle dans une compromission, c'est celle-là : elle oblige à ouvrir le capot. Beaucoup de choses qu'on repousse depuis des années deviennent peu coûteuses à traiter, puisqu'on est déjà dedans.

Ce qui est repris au passage

  • le cœur et les extensions, remis à jour, puisque le socle est reconstruit
  • les extensions abandonnées ou redondantes, retirées plutôt que réinstallées
  • ce qui pèse inutilement sur les performances et qu'on voit en remontant le contenu
  • les comptes administrateurs, les accès et les clés, remis à plat
  • des recommandations écrites sur le thème, les extensions et l'hébergement

La récupération du contenu dépend de l'état de départ, pas de la méthode

Trois éléments déterminent si le contenu est récupérable : depuis combien de temps la compromission dure, si la base de données a été altérée en plus des fichiers, et s'il existe quelque part une référence saine à laquelle se comparer.

Sur le cas le plus lourd que j'ai traité, les trois conditions étaient réunies et le contenu a été intégralement conservé. Ce n'est pas systématique, et je préfère le dire avant plutôt que de le découvrir ensemble.

Je ne promets pas davantage de toujours établir par où c'est entré. Sur ce même cas, les journaux les plus anciens encore disponibles chez l'hébergeur dataient de cinq semaines après l'intrusion. Deux hypothèses restaient plausibles, une bibliothèque abandonnée depuis 2014 avec une faille d'exécution de code, et des identifiants FTP stockés en clair. Je n'ai pas pu trancher, je l'ai écrit dans le rapport, et les deux ont été traitées.

Je ne nomme pas non plus les clients concernés et je ne montre pas leur environnement : la méthode se raconte, les accès ne se montrent pas.

Après la remise en ligne

  • la remise en service n'intervient qu'une fois l'inventaire terminé
  • un contrôle quelques jours après, parce que c'est là qu'on voit si quelque chose a été manqué
  • clés de sécurité régénérées, édition de fichiers désactivée depuis l'administration
  • exécution de PHP bloquée dans les médias, déploiement en SFTP uniquement
  • mises à jour automatiques du cœur activées, pour ne pas reprendre cinq ans de retard

Les questions qu'on me pose quand un site vient d'être compromis