Tutoriel

PolyShell CVE-2026-48356 : vérifier et corriger Magento

Sécurité & Monitoring12 min de lecture17 étapes

CVE-2026-48356, surnommée PolyShell, est entrée au catalogue KEV de la CISA le 27 octobre 2026 : l'exploitation des boutiques Adobe Commerce et Magento Open Source est constatée. Pour une agence, la question n'est pas seulement « faut-il mettre à jour », mais « quelles boutiques n'ont pas le correctif APSB26-73, et lesquelles portent déjà un webshell ». Un correctif supprime la faille ; il ne retire ni les fichiers déposés ni le JavaScript injecté. Voici l'inventaire, la mise à jour, quatre contrôles de compromission et la rotation des accès, avec un état daté à remettre au client.

Sommaire· PolyShell : ce qui est établi, ce qui diverge1/14
  1. 01PolyShell : ce qui est établi, ce qui diverge
  2. 02Ce que disent les sources, et ce que vous en retenez
  3. 03Pourquoi le correctif ne clôt pas le dossier
  4. 04Ce que cette procédure vous laisse en main
  5. 05Versions affectées et versions corrigées selon APSB26-73
  6. 06Inventorier la version de chaque boutique
  7. 07Figer l'état avant de toucher : c'est aussi une preuve
  8. 08Appliquer le correctif sans coupure longue
  9. 09Chercher les traces de compromission
  10. 10Durcissement : PHP n'a rien à faire sous pub/media
  11. 11Dépannage : les blocages fréquents pendant la procédure
  12. 12Après le nettoyage : ce qui doit tourner
  13. 13L'état daté à remettre à chaque client
  14. 14Ce que vous gardez, et les sources à citer

PolyShell : ce qui est établi, ce qui diverge

CVE-2026-48356, surnommée PolyShell, touche Adobe Commerce et Magento Open Source. La fiche NVD, publiée le 14 juillet 2026 à partir de la déclaration d'Adobe, la classe en CWE-434 (téléversement d'un fichier de type dangereux), avec un score CVSS 3.1 de 9,3 et le vecteur AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N. Le correctif est le bulletin Adobe APSB26-73. Le 27 octobre 2026, la CISA l'a ajoutée à son catalogue des vulnérabilités exploitées (KEV), avec une échéance au 10 novembre 2026 pour les agences fédérales américaines : l'exploitation n'est plus une hypothèse.

Les sources ne décrivent pas la faille de la même façon. La NVD parle d'une exécution de code arbitraire « dans le contexte de l'utilisateur courant », qui demande une interaction : une victime doit visiter une URL piégée ou une page compromise, et l'impact déborde du composant vulnérable. Sansec et la presse spécialisée décrivent des téléversements de fichiers qui aboutissent à des webshells sur le serveur. Nous ne tranchons pas entre ces deux lectures. La conduite prudente, pour une agence, consiste à traiter toute boutique restée sans correctif comme une boutique qui peut déjà porter un webshell.

Ce que disent les sources, et ce que vous en retenez

Faites défiler le tableau

SourceCe qu'elle affirmeCe que vous en retenez
NVDCWE-434, CVSS 3.1 de 9,3, interaction requise, exécution dans le contexte de l'utilisateur courantLes identifiants à reporter dans le dossier client
CISA, catalogue KEVExploitation constatée, ajout le 27 octobre 2026, échéance fédérale au 10 novembre 2026Un horizon de traitement, pas une date de confort
Adobe, bulletin APSB26-73Les versions au suffixe 2026-jul ne sont pas affectéesLa version cible de chaque branche
Sansec, 30 mars 2026Vague de masse : 471 boutiques compromises en une heure, webshell PHP puis portes dérobées `accesson.php`Les fichiers à chercher sur le disque
Sansec, 24 octobre 2026Chargeur JavaScript dans `cms_block`, campagne suivie depuis juillet 2025 sur 953 boutiques ; 102 installations non corrigées sur 169 portaient des fichiers téléversésLes requêtes à jouer sur la base
Presse spécialiséeTéléversement de fichiers menant à des webshellsUne lecture à recouper, pas une source primaire

Pourquoi le correctif ne clôt pas le dossier

Appliquer APSB26-73 supprime la faille. Cela ne retire rien de ce qui est déjà entré. Un webshell déposé avant la mise à jour reste sur le disque, une porte dérobée accesson.php continue de répondre, un script injecté dans cms_block continue d'être servi à chaque visiteur, et un compte administrateur créé par l'attaquant reste valide. Sansec le résume ainsi : retirer les scripts ne retire pas l'accès de l'attaquant.

La seconde étude de Sansec montre pourquoi la question se pose sur un parc entier. Sur 169 installations Magento 2 non corrigées examinées, 102 portaient des fichiers téléversés par PolyShell ou par SessionReaper (CVE-2025-54236, corrigée par le bulletin APSB25-88), soit 60 %. L'ordre de travail est donc fixe : inventaire, état figé, mise à jour, recherche de traces, rotation des accès, puis un état daté remis au client. Sauter la rotation pour gagner une heure, c'est laisser à l'attaquant les clés qu'il a peut-être déjà copiées.

Ce que cette procédure vous laisse en main

  • Un inventaire par boutique — édition (Commerce ou Open Source), version exacte, présence ou absence du correctif 2026-jul.
  • Une version cible par branche — lue dans le bulletin APSB26-73, sans deviner la numérotation.
  • Un état figé avant intervention — snapshot et export de base conservés comme pièce, avant tout nettoyage.
  • Quatre contrôles reproductibles — fichiers sous pub/media, portes dérobées accesson.php, JavaScript dans cms_block et dans cms_page.
  • Une rotation complète des accès — comptes admin, clés API et d'intégration, base de données, clé de chiffrement, SSH et SFTP.
  • Un état daté pour chaque client — ce qui a été vérifié, trouvé, corrigé, et ce qui ne l'a pas été.

Versions affectées et versions corrigées selon APSB26-73

Faites défiler le tableau

Produit et brancheAffectée jusqu'àVersion corrigée
Adobe Commerce 2.4.92.4.92.4.9-2026-jul
Adobe Commerce 2.4.82.4.8-p52.4.8-2026-jul
Adobe Commerce 2.4.72.4.7-p102.4.7-2026-jul
Adobe Commerce 2.4.62.4.6-p152.4.6-2026-jul
Adobe Commerce 2.4.52.4.5-p172.4.5-2026-jul
Adobe Commerce 2.4.42.4.4-p182.4.4-2026-jul
Magento Open Source 2.4.92.4.92.4.9-2026-jul
Magento Open Source 2.4.82.4.8-p52.4.8-2026-jul
Magento Open Source 2.4.72.4.7-p102.4.7-2026-jul
Magento Open Source 2.4.62.4.6-p152.4.6-2026-jul
Adobe Commerce B2B1.5.3, 1.5.2-p5, 1.4.2-p10, 1.3.4-p17, 1.3.3-p181.5.3-2026-jul, 1.5.2-2026-jul, 1.4.2-2026-jul, 1.3.4-2026-jul, 1.3.3-2026-jul
Adobe Commerce Events1.20.0 et antérieures1.21.0
Magento Open Source 2.4.5 et 2.4.4Absentes de la liste NVDAucune conclusion : lire l'avis Adobe

Inventorier la version de chaque boutique

  1. Lire la version déclarée

    cd /var/www/boutique-client
    bin/magento --version
    La commande affiche l'édition et le numéro. Le chemin est un exemple : adaptez-le à chaque hébergement. Lancez-la avec l'utilisateur système propriétaire des fichiers, pas en root, pour ne pas modifier les droits du cache.

  2. Recouper avec Composer

    composer show magento/product-community-edition
    pour Magento Open Source, ou
    composer show magento/product-enterprise-edition
    pour Adobe Commerce. Composer lit ce qui est réellement installé. Si les deux lectures divergent, c'est Composer qui fait foi, et l'écart se note.

  3. Balayer un serveur entier

    find /var/www /home -name composer.lock -not -path '*/vendor/*' -exec grep -H -A1 '"name": "magento/product-' {} +
    Chaque fichier cité appartient à une installation Magento, et la ligne version suit le nom du paquet. Une préproduction publique ou une ancienne copie décompressée compte comme une boutique : elle est exposée de la même façon si elle est servie.

  4. Classer avec le tableau des versions

    Comparez le numéro relevé au tableau ci-dessus. Règle de lecture : toute version qui ne porte pas le suffixe 2026-jul de sa branche est à traiter. Pour Magento Open Source 2.4.5 et 2.4.4, absentes de la liste NVD, n'écrivez pas « non concernée » : renvoyez au bulletin Adobe et traitez la boutique comme exposée tant que vous n'avez pas lu le contraire.

  5. Consigner une ligne par boutique

    Client, serveur, chemin, édition, version relevée, date et heure du relevé. Ajoutez dès maintenant les colonnes qui serviront plus loin : correctif appliqué, résultat des quatre contrôles, accès tournés. Ce tableau devient la pièce centrale du dossier remis au client.

Figer l'état avant de toucher : c'est aussi une preuve

Avant toute modification, figez la boutique telle que vous l'avez trouvée. Sur un VPS, un snapshot du VPS, si votre hébergeur le propose, capture le disque entier ; ajoutez un export de la base et une archive du code sur un support que la mise à jour ne touche pas. La différence entre les deux outils est détaillée dans notre comparatif snapshot et sauvegarde.

Cet état sert deux fois. Il permet de revenir en arrière si la mise à jour casse le tunnel d'achat. Il conserve surtout la preuve : si l'attaquant est entré, les fichiers déposés, leurs dates et les blocs CMS modifiés sont dans cette copie, et nulle part ailleurs une fois le nettoyage fait. La CISA renvoie d'ailleurs à ses exigences de tri forensique pour les systèmes concernés. Ne supprimez ni n'écrasez cet état tant que le dossier n'est pas clos.

Une montée de branche, de 2.4.6 vers 2.4.9 par exemple, est un autre chantier : sa procédure Composer et son calendrier de support sont dans notre guide de mise à niveau. Ici, chaque boutique reste dans sa branche et reçoit seulement le correctif.

Appliquer le correctif sans coupure longue

  1. Répéter sur une préproduction

    Restaurez l'état figé sur une préproduction, ou clonez la boutique, et jouez la mise à jour là d'abord. Chronométrez chaque commande : c'est cette durée qui fixe la fenêtre de maintenance à annoncer au client.

  2. Fixer la version corrigée

    composer require magento/product-community-edition=<version-corrigée> --no-update
    Remplacez le paquet par magento/product-enterprise-edition pour Adobe Commerce, et <version-corrigée> par la version au suffixe 2026-jul de votre branche, telle que l'écrit le bulletin.

  3. Résoudre et valider le verrou

    composer update magento/product-community-edition --with-all-dependencies
    Relisez la liste des paquets modifiés. Le composer.lock obtenu et testé est celui que vous déploierez : la production ne résout plus rien, elle installe.

  4. Ouvrir la fenêtre de maintenance en production

    bin/magento maintenance:enable
    bin/magento maintenance:allow-ips <votre-ip>
    Tout ce qui précède s'est fait sans couper la vente. La seconde commande vous laisse tester la boutique avant sa réouverture.

  5. Installer et appliquer

    composer install --no-dev
    bin/magento setup:upgrade
    bin/magento setup:di:compile
    bin/magento setup:static-content:deploy
    Avec un verrou déjà validé, la coupure se limite à ces quatre commandes.

  6. Rouvrir et contrôler

    bin/magento maintenance:disable
    composer show magento/product-community-edition
    La version installée doit être la version corrigée de votre branche. Passez une commande avec la passerelle de paiement en mode test, puis reportez la version et l'heure dans le tableau.

Chercher les traces de compromission

  1. Lister les fichiers déposés sous pub/media

    find pub/media/custom_options/ pub/media/customer_address/ -type f ! -name '.htaccess'
    Commande publiée par Sansec, à lancer depuis la racine de la boutique. Tout fichier listé est à examiner, en particulier un script PHP. Copiez-le hors de l'arborescence publique avec sa date de modification avant de le supprimer.

  2. Chercher les portes dérobées accesson.php

    find . -name 'accesson.php' -type f
    Sansec signale ce fichier « dans plusieurs répertoires » : lancez la recherche depuis la racine, pas seulement sous pub/. Un résultat vide prouve l'absence de ce fichier-là, pas l'absence de toute porte dérobée.

  3. Interroger la table cms_block

    SELECT block_id, identifier, update_time FROM cms_block WHERE content LIKE '%fpCode%' OR content LIKE '%se_referrer%' OR content LIKE '%localStorage.getItem%';
    Requête publiée par Sansec. Ajoutez le préfixe de table de l'installation s'il en existe un. La colonne update_time aide à dater l'injection.

  4. Interroger la table cms_page

    SELECT page_id, identifier, update_time FROM cms_page WHERE content LIKE '%fpCode%' OR content LIKE '%se_referrer%' OR content LIKE '%localStorage.getItem%';
    Même contrôle sur les pages CMS. Un résultat n'est pas forcément malveillant : localStorage.getItem peut figurer dans un script légitime. Lisez le contenu avant de conclure.

  5. Rapprocher des indicateurs publiés

    Pour la vague de mars 2026, Sansec a publié un domaine de chargeur, lanhd6549tdhse.top, une clé localStorage, 136c1e07507f4a97, et une balise de porte dérobée, 8194460. Cherchez-les dans les résultats précédents et dans les fichiers trouvés, par exemple avec grep -rl 'lanhd6549tdhse' pub/ app/. Cette liste n'est pas exhaustive : son absence ne blanchit pas une boutique.

  6. Contrôler les comptes administrateurs

    SELECT user_id, username, email, created, logdate, is_active FROM admin_user ORDER BY created DESC;
    Un compte que personne ne reconnaît, ou créé à une date proche d'un fichier suspect, se désactive puis se documente. Le contrôle mensuel de ces points sur chaque VPS client est décrit dans notre checklist d'audit.

Durcissement : PHP n'a rien à faire sous pub/media

Indépendamment de PolyShell, un dossier qui reçoit des fichiers envoyés par les visiteurs ne devrait jamais exécuter de PHP. Vérifiez que votre configuration nginx ou Apache refuse l'exécution de scripts sous pub/media, et testez-le en préproduction avec un fichier inoffensif. Ce n'est pas une mitigation publiée par Adobe pour cette CVE, et cela ne remplace pas le correctif : c'est un durcissement général, qui réduit l'effet d'un futur téléversement réussi.

Dépannage : les blocages fréquents pendant la procédure

« Your requirements could not be resolved to an installable set of packages. » Composer refuse la version demandée : un module tiers fige une dépendance, ou la contrainte de stabilité de composer.json exclut la version visée. La commande composer why-not magento/product-community-edition <version-corrigée> nomme le paquet qui bloque. Réglez-le en préproduction, jamais en production.

« Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory. » La boutique affiche ce message après la mise à jour du code : l'étape setup:upgrade n'a pas été jouée, ou elle a échoué. Relancez-la, puis la compilation.

« Table '…cms_block' doesn't exist » à l'exécution de la requête Sansec : l'installation utilise un préfixe de table. Lisez le préfixe dans la configuration de la boutique et ajoutez-le au nom de la table.

« No such file or directory » sur la commande find de pub/media : le dossier custom_options ou customer_address n'existe pas sur cette boutique. Notez-le dans le tableau ; ce n'est ni un échec ni une preuve de propreté.

Une boutique qui reste en maintenance : vérifiez qu'aucun drapeau de maintenance ne subsiste et relancez bin/magento maintenance:disable avec l'utilisateur propriétaire des fichiers.

Après le nettoyage : ce qui doit tourner

  • Mots de passe administrateur — tous les comptes de admin_user, y compris ceux que vous jugez sains.
  • Clés API et intégrations — jetons des intégrations déclarées dans l'administration, clés des services tiers (paiement, transport, ERP) stockées dans la configuration.
  • Identifiants de base de données — nouveau mot de passe, reporté dans la configuration de la boutique.
  • Clé de chiffrement — à changer en suivant la documentation Adobe, après avoir mesuré l'effet sur les données déjà chiffrées.
  • Accès SSH et SFTP — mots de passe, clés SSH autorisées, comptes système inconnus.
  • Accès d'hébergement — panneau de contrôle et sauvegardes, qui donnent eux aussi accès aux fichiers.

L'état daté à remettre à chaque client

Faites défiler le tableau

ColonneCe que vous y écrivezPourquoi
Version avant et aprèsNuméros relevés par Composer, avec date et heureMontre que le correctif APSB26-73 est en place
État figéRéférence du snapshot et de l'export de basePermet le retour arrière et l'examen forensique
Fichiers sous pub/mediaChemins et dates des fichiers trouvés, ou « aucun »Contrôle publié par Sansec
accesson.phpChemins trouvés, ou « aucun »Porte dérobée signalée par Sansec
cms_block et cms_pageIdentifiants listés et verdict après lectureJavaScript injecté servi aux visiteurs
Comptes adminComptes inconnus désactivés, ou « aucun »Accès laissé par l'attaquant
Accès tournésSecrets changés et date du changementFerme ce que l'attaquant a pu copier
Non vérifiéCe que vous n'avez pas pu regarder, et pourquoiUn état honnête vaut mieux qu'un « tout va bien »

Ce que vous gardez, et les sources à citer

Quand une boutique est trouvée compromise, c'est l'agence que le client appelle. Gardez ce rôle : vous tenez la relation, le diagnostic et l'état daté ; la plateforme tient l'infrastructure, l'accès root au VPS qui permet de lancer ces contrôles et le snapshot avant intervention. Nous ne modifions pas le code d'une boutique à votre place : la mise à jour de Magento reste un geste de l'agence. Conservez aussi le modèle de tableau : la prochaine faille sur une boutique suivra la même séquence, avec une ligne de plus dans l'inventaire.

Sources primaires :
Fiche NVD de CVE-2026-48356
Bulletin Adobe APSB26-73
Alerte CISA du 27 octobre 2026
Sansec, vague de masse PolyShell
Sansec, chargeur JavaScript dans cms_block

Un parc de boutiques, un seul inventaire

Pour un parc de boutiques clientes, le vrai coût est l'absence d'inventaire. Sur la page agences, voyez comment centraliser le portefeuille, les infrastructures et leur état au même endroit : vous gardez la relation client, nous tenons l'infrastructure.

Articles liés

Magento 2.4.6 hors support : passer en 2.4.9, coupure réduite
Sécurité & Monitoring9 min de lecture

Magento 2.4.6 hors support : passer en 2.4.9, coupure réduite

Magento 2.4.6 n'est plus en support standard. Calendrier Adobe, prérequis de la 2.4.9 et procédure Composer répétée en préproduction, coupure réduite.

Lire l'article →
Comment installer Magento sur un VPS
Self-hosting3 min de lecture

Comment installer Magento sur un VPS

Installez Magento sur VPS ServOrbit : catalogue complexe, stack Docker, HTTPS et lien vers la documentation officielle Adobe Commerce.

Lire l'article →
Snapshot vs sauvegarde VPS : différence et restauration
Sécurité & Monitoring9 min de lecture

Snapshot vs sauvegarde VPS : différence et restauration

Snapshot ou sauvegarde de VPS : ce que chacun protège, ce qu'il ne protège pas, comment restaurer, et la règle de décision pour les VPS de vos clients.

Lire l'article →
Audit sécurité mensuel d'un VPS client : checklist en 45 min
Sécurité & Monitoring10 min de lecture

Audit sécurité mensuel d'un VPS client : checklist en 45 min

Sept contrôles à dérouler chaque mois sur un VPS client : mises à jour, noyau, comptes SSH, ports, certificats, sauvegardes, journaux. Rapport daté inclus.

Lire l'article →
Bricksforge CVE-2026-85097 : mettre à jour et auditer le parc
Sécurité & Monitoring10 min de lecture

Bricksforge CVE-2026-85097 : mettre à jour et auditer le parc

Bricksforge 3.1.8.10 corrige CVE-2026-85097, un upload non authentifié exploité. Inventaire wp-cli, fichiers PHP déposés, journaux, secrets à rotater.

Lire l'article →
Drupal Commerce CVE-2026-118539 : corriger et auditer
Sécurité & Monitoring10 min de lecture

Drupal Commerce CVE-2026-118539 : corriger et auditer

Faille Commerce Core exploitée, avis SA-CONTRIB-2026-254 : repérez les versions touchées, passez en 3.3.13 ou 8.x-2.41, puis auditez les commandes.

Lire l'article →

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