Technique et prévention · 10 min · publié le 30 décembre 2025

Drupal piraté : modules contrib et fichiers hors profil

Une mise à jour tardive de Drupal ne retire pas ce qui a été déposé pendant la fenêtre ouverte. Inspectez settings, modules custom, `/sites/default/files`. Puis seulement rattrapez le cœur. Drupalgeddon est un souvenir ; les modules contrib oubliés, eux, sont d'actualité.

Réponse directe

Une mise à jour tardive ne retire pas ce qui a été déposé. Inspectez settings, modules custom, /sites/default/files. Puis seulement rattrapez le cœur.

drupal piraté drupalgeddon encore drupal files php

Mettre à jour ne lave pas un dépôt déjà là

Drupal a connu des failles massivement exploitées. Les équipes s'en souviennent sous des noms d'époque. Ce qui compte aujourd'hui : si le site a vécu une période non patchée, partez du principe qu'un accès a pu poser un module, un fichier dans `files`, une ligne dans `settings.php`. La maj d'aujourd'hui ferme la fenêtre ; elle n'aspire pas le contenu déposé.

Le guide Drupal piraté le dit en une page. Ici l'ordre opérationnel : copie hors serveur, inventaire, comparaison, puis cœur. Inverser, c'est une 500 sur le back-office et une backdoor intacte.

Un ticket d'abus qui cite un chemin sous `files` est un point de départ, pas le périmètre. Compte suspendu.

Cœur, historique des failles, branche réelle

Identifiez la branche (7, 9, 10, 11). Drupal 7 en production en 2026 est un CMS oublié qui tourne encore : le coût est la reconstruction du métier, pas seulement un patch. TYPO3, SPIP, CMS oublié — Drupal 7 y entre de plain-pied.

Comparez le cœur au paquet officiel ou au dépôt de la version déployée. Un fork « pour nos besoins » non documenté se cartographie comme un site PHP sur mesure : pas de zip magique.

Ne lancez pas une maj majeure (9 → 10) le soir de l'incident. C'est un projet. Nettoyez sur la branche actuelle, puis planifiez. Maj sans casser.

Modules contrib et custom : deux traitements

Contrib : même critère que WordPress — plus de deux ans sans release, mainteneur introuvable, incompatible avec le cœur. `composer show` et la page Drupal.org. Désinstaller en UI ne retire pas toujours le code du disque. Extensions abandonnées.

Custom : pas de zip officiel. Dates de modification, fichiers PHP isolés, fonctions qui n'ont rien à voir avec le métier. On ne « réinstalle » pas un module métier. On le lit, on compare à Git s'il existe. Pas de Git ? La copie d'avant incident est votre seul référentiel — d'où l'importance de copier avant d'effacer.

Un module « security » ou « fixer » installé pendant l'attaque : on le retire après analyse, on ne s'y fie pas comme nettoyage.

  • Contrib : comparer à la version officielle, retirer les morts.
  • Custom : cartographier, ne pas supprimer au jugé.
  • Uninstall + absence réelle du dossier.

Fichiers hors profil : /sites/default/files

C'est le `/images` de Joomla : dépôt fréquent de PHP, parfois sous des sous-dossiers au nom de cache. Interdire l'exécution PHP dans `files` après nettoyage est le minimum. Les médias légitimes n'ont pas besoin de PHP.

`.htaccess` dans `files` : parfois réécrit. Un `.private` mal exposé, un dump SQL oublié. Notez, copiez hors web, retirez. Fichiers .zip publics — le principe est le même.

Multi-site Drupal : chaque `sites/domaine/files`. Nettoyez tous les sites du compte, pas le seul vhost du mail d'abus. Isolation.

settings.php, services, clés

`settings.php` et `settings.local.php` : credentials, parfois `$settings` ajoutés, reverse proxy, config de mail. Une ligne inconnue n'est pas « Drupal moderne » par défaut. Comparez à un settings issu d'une install propre de la même branche, puis réinjectez vos secrets neufs.

Clés, consumers, users avec `administer modules` : revue après copie. Moindre privilège. Un user uid=1 dont le mail a changé est un signal, pas une anecdote.

Si `.env` ou un hors-Drupal existe (stack mixte), traitez-le. `.env` exposé.

Régénérez le hash salt après incident si vous avez une raison de croire que settings a été lu. Changez surtout les mots de passe de base et du panel.

Composer, vendor, et ce que « drush up » ne voit pas

Beaucoup de Drupal modernes vivent par Composer. Un paquet compromis dans `vendor` n'apparaît pas comme un module contrib dans l'UI. Relisez `composer.lock`, comparez aux hashes connus, ne réinstallez pas depuis un cache local douteux. Dépendances Composer ou npm.

`drush up` ou une maj UI ne réécrit pas un one-liner dans un thème custom ni un PHP dans `files`. Ce n'est pas un audit.

Node / front (thèmes compilés) : un script tiers compromis est un autre sujet. CDN JavaScript.

Remettre un Drupal propre sans tout jeter

Contenus, config (CML), médias : on préserve. On retire les ajouts. Une réinstall « pour être sûr » coûte les contenus récents et les vues. Restaurer un dump d'il y a trois semaines sans le lire peut ramener l'injection et perdre les nœuds du mois.

Cron Drupal et cron système : un import qui réécrit un fichier. Lisez-les avant de republier.

Tests : mobile, privé, clic Google, `site:`, inspection Search Console. Drupal n'y échappe pas. Tests avant victoire.

Après l'incident : files sans PHP, moins d'admins

Exécution PHP interdite dans `files`, modules morts retirés du disque, cœur rattrapé, secrets tournés, isolation du compte. WAF ensuite. WAF.

Fenêtre de trente jours : nouvelles URI, users, dates dans `files`. Garantie 30 jours.

Si le métier n'est pas documenté et que le seul développeur est parti, copiez avant toute bravoure. Créer un espace.

Questions fréquentes

Drupalgeddon peut-il encore être « la » cause ?

+
Sur un site jamais patché à l'époque, une backdoor d'alors peut encore être là. Sur un site tenu, l'entrée actuelle est plutôt un module contrib, un compte, un upload dans files. On inspecte l'état présent, on ne se contente pas du nom d'une faille ancienne.

Puis-je lancer composer update pour « tout nettoyer » ?

+
Non. Ça met à jour des paquets, ça ne retire pas un PHP dans files ni un user fantôme. Un cache Composer douteux peut même ramener un paquet malveillant. Voir l'article dépendances.

Drush est-il sûr pendant l'incident ?

+
Drush est un outil d'admin. S'il est exposé ou si l'attaquant a déjà un user, ce n'est pas votre balai. Copiez, changez le panel, puis utilisez Drush sur un site déjà isolé si vous savez ce que vous faites.

Faut-il désactiver tous les modules contrib le temps du nettoyage ?

+
Ça peut aider à isoler, ça peut aussi casser le site. Préférez l'inventaire et la comparaison. Tout couper « pour voir » sur une prod métier crée un second incident.

L'hébergeur a suspendu pour un fichier dans files. Je le retire et c'est fini ?

+
Vous le retirez après copie, vous interdisez PHP dans files, vous cherchez l'entrée. Le constat pour rouvrir décrit les trois, pas seulement le fichier. Guide suspension.
À lire ensuite
Guide Drupal piraté Site PHP sur mesure Joomla piraté Dépendances Composer / npm Compte suspendu Déclarer mon site