Tutoriel

Drupal Commerce CVE-2026-118539 : corriger et auditer

Sécurité & Monitoring10 min de lecture16 étapes

L'avis SA-CONTRIB-2026-254, publié le 28 octobre 2026, décrit un contournement d'accès dans Commerce Core, le module qui porte le tunnel de commande de nombreuses boutiques Drupal. Il ne demande aucune authentification, et drupal.org le déclare exploité dans la nature. Corriger la version ne suffit pas : une commande altérée avant le patch reste dans la base. Pour une agence qui héberge plusieurs boutiques, la question est double : lesquelles sont concernées, et laquelle a déjà été abusée. Voici la procédure, environnement par environnement, avec un audit des commandes à remettre au client.

Sommaire· La faille en un paragraphe, le reste est de la procédure1/14
  1. 01La faille en un paragraphe, le reste est de la procédure
  2. 02Tableau de référence : branche, version touchée, version corrigée
  3. 03Pourquoi corriger ne suffit pas
  4. 04Inventorier la version de Commerce sur chaque boutique
  5. 05Sauvegarder avant de toucher au code
  6. 06Mettre à jour une boutique
  7. 07Une procédure par environnement
  8. 08Développement, préproduction, production : le geste et la preuve
  9. 09Auditer les commandes sans présumer de la méthode de l'attaquant
  10. 10Ce que l'audit ne prouve pas
  11. 11Si une commande est incohérente
  12. 12Les autres avis Commerce du même jour
  13. 13Qui tient la relation client, et ce que vous remettez
  14. 14La documentation officielle

La faille en un paragraphe, le reste est de la procédure

L'avis SA-CONTRIB-2026-254 concerne le module Commerce Core (drupal/commerce). Drupal.org le classe « Highly critical », 21 sur 25, et décrit un contournement d'accès : le module ne protège pas suffisamment certaines routes et certains champs d'entité. L'avis range le niveau d'authentification requis sous « tous / anonymes » et précise que la faille peut avoir des conséquences financières pour le vendeur. Il affirme aussi qu'elle est exploitée dans la nature.

L'avis ne nomme ni les routes ni les champs concernés. Nous n'en déduisons donc rien : ni liste de chemins à bloquer, ni signature à chercher dans les journaux. L'identifiant CVE-2026-118539 est relevé sur la page de l'avis ; nous ne l'avons pas recoupé avec la base NVD, citez-le donc comme « identifiant publié par l'avis » tant que ce recoupement n'est pas fait.

Tableau de référence : branche, version touchée, version corrigée

Faites défiler le tableau

Votre situationStatut selon l'avisAction
Commerce 3.x, de 3.0.0 à avant 3.3.13VulnérablePasser en 3.3.13 ou plus récent
Commerce 2.x (8.x-2.x), avant 8.x-2.41VulnérablePasser en 8.x-2.41 ou plus récent
Commerce 3.3.13 ou 8.x-2.41 déjà installéCorrigéAuditer quand même les commandes passées avant la mise à jour
Drupal ^10.3 ou 11Branche 3.x annoncée compatibleMettre à jour dans la branche 3.x
Drupal ^9.3 ou ^10Branche 2.x annoncée compatibleMettre à jour dans la branche 2.x, sans changer de branche dans la foulée
Module absent de `composer.lock`Hors périmètre de cet avisConsigner l'absence dans l'inventaire
Boutique sans accès Composer ou code copié à la mainVersion inconnueRetrouver la version avant toute conclusion

Pourquoi corriger ne suffit pas

L'avis le dit en toutes lettres : les sites doivent auditer leurs commandes, parce que la faille est exploitée. Une boutique passée en 3.3.13 aujourd'hui a pu être visitée avant. La mise à jour ferme l'accès ; elle ne remet pas en ordre une commande dont le montant, le statut ou l'état de paiement a été modifié. L'avis ne dit pas depuis quand l'exploitation a lieu : choisissez une fenêtre d'audit large, notez-la dans le dossier, et ne la réduisez pas au jour de la mise à jour.

Il y a ensuite un obstacle banal : sans inventaire central, personne ne sait quelles boutiques embarquent Commerce, ni dans quelle branche. La méthode d'inventaire est celle d'une faille de plugin WordPress, décrite dans notre guide Bricksforge. L'ordre de travail est donc : inventaire, sauvegarde, mise à jour, audit, preuve datée. Les boutiques qui encaissent le plus passent en premier.

Inventorier la version de Commerce sur chaque boutique

  1. Lire la version avec Composer

    cd /var/www/boutique-client
    composer show drupal/commerce
    La commande affiche la version installée. Pour la branche 2.x, drupal.org parle de 8.x-2.41 ; Composer présente le numéro sans le préfixe 8.x. Comparez le numéro, pas la chaîne. Le chemin est un exemple : adaptez-le à votre hébergement.

  2. Recouper avec Drush

    drush pm:list --type=module --status=enabled --filter=commerce
    La liste indique si Commerce est activé et dans quelle version. Un site peut porter le code sans que le module soit activé : notez-le, la situation change si quelqu'un l'active plus tard.

  3. Lire le verrou plutôt que le dossier

    grep -A1 '"name": "drupal/commerce"' composer.lock
    Le fichier composer.lock dit ce qui est réellement installé, sans démarrer Drupal. C'est la lecture la plus sûre sur une boutique que vous ne voulez pas solliciter pendant l'audit.

  4. Boucler sur toutes les boutiques d'un serveur

    find /home -name composer.lock -not -path '*/vendor/*' -exec grep -H -A1 '"name": "drupal/commerce"' {} +
    Chaque fichier cité contient Commerce, et la ligne version suit le nom. Relisez la liste : un dossier de test oublié ou une copie de sauvegarde compte aussi.

  5. Consigner le résultat dans un tableau

    Une ligne par boutique : client, hébergeur, chemin, branche, version relevée, version de Drupal, date et heure du relevé. Ajoutez deux colonnes à remplir plus tard, « mise à jour faite » et « audit des commandes fait ». Ce tableau devient la pièce centrale du dossier remis aux clients.

Sauvegarder avant de toucher au code

Une mise à jour de module se défait mal sans point de retour. Avant chaque boutique : une sauvegarde de la base et du code, sur un support que la mise à jour ne touche pas, avec sa date relevée dans le tableau. Sur une boutique active, la base change à chaque commande : la sauvegarde fixe l'état à partir duquel vous pourrez comparer les commandes après coup. Ne l'écrasez pas par la suivante tant que l'audit n'est pas clos. Elle sert deux fois : revenir en arrière, et prouver ce que contenait la boutique avant la correction.

Mettre à jour une boutique

  1. Figer l'état

    drush sql:dump --gzip --result-file=/chemin/sauvegarde/boutique-avant.sql
    Copiez aussi le dossier du projet : code, composer.json, composer.lock et fichiers. Notez l'emplacement de la copie dans le tableau.

  2. Vérifier ce que la contrainte Composer autorise

    composer why-not drupal/commerce 3.3.13
    Si composer.json fige une version, cette commande nomme ce qui bloque. Une boutique en 2.x reste en 2.x et vise 8.x-2.41 : un changement de branche est un chantier distinct, à planifier à part.

  3. Mettre à jour le module et ses dépendances

    composer update drupal/commerce --with-dependencies
    Relisez la liste des paquets modifiés avant de valider : un autre module Commerce peut bouger avec lui.

  4. Appliquer les mises à jour de base

    drush updatedb -y
    drush cache:rebuild
    La première commande exécute les mises à jour de schéma éventuelles, la seconde vide les caches.

  5. Contrôler la version installée

    Relancez composer show drupal/commerce. La version doit atteindre 3.3.13 sur la branche 3.x, ou le numéro 2.41 sur la branche 2.x. Reportez-la dans le tableau, avec la date et l'heure.

  6. Passer une commande de test

    Sur la préproduction, ou en mode test de la passerelle de paiement, ajoutez un produit au panier, passez la commande et vérifiez le montant, le statut et le paiement. Une mise à jour qui casse le tunnel d'achat doit se voir avant le client.

Une procédure par environnement

Le même correctif ne se joue pas de la même façon partout. Le tableau suivant fixe, pour chaque environnement, le geste attendu et la preuve à conserver. Une préproduction publique compte comme une boutique.

Les mises à jour automatiques du système, décrites dans notre guide sur Debian et Ubuntu, ne touchent pas à un module Drupal : ce geste reste celui de l'agence.

Développement, préproduction, production : le geste et la preuve

Faites défiler le tableau

EnvironnementGestePreuve à garder
ProductionSauvegarde, mise à jour, `drush updatedb`, commande de test, puis auditSauvegarde datée, version relevée, résultat de l'audit
Préproduction accessible depuis InternetMettre à jour en premier si le code est identique, ou la protéger par mot de passe en attendantVersion relevée, protection retenue
Préproduction fermée ou localeMettre à jour et rejouer la commande de test avant la productionCapture de la commande de test, date
DéveloppementAligner `composer.lock` sur la production pour ne pas réintroduire l'ancienne version au prochain déploiementCommit du verrou, version relevée
Copie ou sauvegarde restauréeNe jamais la remettre en ligne sans la mise à jourMention dans le dossier client

Auditer les commandes sans présumer de la méthode de l'attaquant

  1. Fixer la fenêtre

    Choisissez une date de début large et notez-la. L'avis ne donne pas de date de début d'exploitation : prenez au minimum la période couverte par vos sauvegardes et vos journaux, et écrivez pourquoi.

  2. Lister les commandes de la fenêtre

    Exportez les commandes avec leur numéro, leur date de création et de passage, leur statut, leur total et leur devise. L'interface d'administration suffit. En base, commencez par lire les noms de colonnes :
    drush sql:query "DESCRIBE commerce_order"
    Les noms exacts dépendent de votre version : ne les supposez pas.

  3. Chercher les écarts internes

    Pour chaque commande, comparez le total au calcul des lignes et des ajustements. Un total qui ne correspond pas à ses lignes, une remise que personne n'a configurée, ou un prix de ligne différent du catalogue : chaque écart est à instruire.

  4. Croiser avec la passerelle de paiement

    Une commande terminée sans paiement correspondant chez le prestataire, ou un paiement d'un montant différent du total, mérite un examen. Le relevé du prestataire fait foi pour l'argent encaissé : faites le croisement sur les exports, pas sur ce que la boutique affiche.

  5. Regarder les passages d'état

    Repérez les commandes dont le statut a changé sans action humaine ni paiement cohérent : validées sans passage par le paiement, ou arrivées à un statut final en quelques secondes. Les journaux d'accès aident à dater ce qui s'est passé. L'avis ne détaille aucune route : une recherche par chemin est un indice, jamais une preuve d'absence.

Ce que l'audit ne prouve pas

Un audit propre dit qu'aucune incohérence n'est visible dans les commandes. Il ne dit pas qu'aucune requête n'a abusé de la faille : l'avis parle de routes et de champs d'entité sans les nommer. Écrivez dans le rapport ce que vous avez regardé, et ce que vous n'avez pas regardé.

Si une commande est incohérente

  • Ne rien supprimer — conservez la commande, ses paiements et la sauvegarde datée : ce sont les pièces du dossier.
  • Suspendre la livraison — bloquez l'expédition ou l'accès au produit numérique tant que le paiement n'est pas confirmé chez le prestataire.
  • Prévenir le client de l'agence — votre rapport indique la commande, l'écart constaté, la date et le montant concerné.
  • Interroger le prestataire de paiement — il tient le relevé des encaissements ; demandez le détail de la transaction.
  • Conserver les journaux — copiez les journaux d'accès et de l'application de la période avant leur rotation.
  • Contrôler les comptes — si vous trouvez un compte ou un rôle que personne n'a créé, changez les mots de passe d'administration et les clés de la passerelle.
  • Mesurer avant de restaurer — revenir à une sauvegarde d'avant l'incident efface aussi les commandes légitimes passées depuis.

Les autres avis Commerce du même jour

Le 28 octobre 2026, drupal.org a publié d'autres avis qui touchent l'écosystème Commerce, du numéro 255 au numéro 265 : Commerce Core, Commerce Shipping, Commerce License et Commerce Stripe. Ils sont classés moins graves que le 254, et seul le 254 déclare une exploitation dans la nature. L'un d'eux, sur Commerce Stripe, atteint pourtant « Critical » (15 sur 25).

Ne mettez donc pas à jour que Commerce Core. Listez les paquets Commerce de chaque boutique avec composer outdated 'drupal/commerce*' et lisez chaque avis sur drupal.org/security avant de décider.

Qui tient la relation client, et ce que vous remettez

Quand une commande frauduleuse est trouvée, c'est l'agence que le client appelle. Gardez ce rôle : l'agence tient la relation, le rapport d'audit et la décision de remboursement ou de restauration. La plateforme tient l'infrastructure : un compte isolé par client, des sauvegardes à restaurer, un accès SSH ou WHM pour mettre à jour sans attendre un ticket. Nous ne modifions pas le code applicatif d'une boutique à votre place ; la mise à jour de Commerce reste un geste de l'agence.

Remettez au client une page datée : version avant, version après, date et heure de la mise à jour, référence de la sauvegarde, fenêtre d'audit, nombre de commandes examinées, écarts trouvés ou absence d'écart, et ce qui n'a pas été regardé. Gardez le modèle : le prochain avis sur un module Drupal suivra la même séquence, avec une autre ligne dans l'inventaire. Le rythme mensuel de contrôle est décrit dans la checklist d'audit d'un VPS client.

La documentation officielle

Avis SA-CONTRIB-2026-254
Liste des avis de sécurité
Page du projet Commerce
Documentation de la ligne de commande Composer
Documentation de Drush

Gardez la main sur les boutiques de vos clients

Comptes isolés par client, sauvegardes avant mise à jour, accès WHM et SSH pour appliquer un correctif sans attendre, expirations et parc visibles au même endroit : la relation client reste à vous.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet