Free cookie consent management tool by TermsFeedAktualizacja preferencji plików cookie

StyleSmuggler et les dernières attaques contre les boutiques Magento : comment les hackers opèrent et comment limiter les risques

9 min de lecture 2 vues

Ces derniers jours ont mis en évidence une réalité que les administrateurs de boutiques en ligne connaissent depuis longtemps, mais qu’il est facile d’ignorer dans la maintenance quotidienne : un système à jour ne signifie pas toujours un système sécurisé. Lorsqu’une vulnérabilité de type 0-day apparaît, les attaquants n’attendent pas le communiqué officiel de l’éditeur, un numéro CVE clairement attribué ni un créneau pratique pour déployer le correctif. Des robots scannent Internet, recherchent des endpoints vulnérables et tentent d’installer un accès persistant plus vite que la plupart des entreprises n’ont le temps de convoquer une réunion.

C’est exactement le cas de StyleSmuggler, une vulnérabilité activement exploitée signalée par Sansec le 5 septembre 2026. Selon Sansec, les attaques ont commencé le 4 septembre et concernent Magento Open Source ainsi qu’Adobe Commerce. L’information la plus importante pour les propriétaires de boutiques est brutale : la vulnérabilité a également été observée sur des installations considérées comme entièrement à jour.

Ce texte n’est pas un mode d’emploi pour attaquer. Il s’agit d’un résumé pratique de la manière dont se déroule aujourd’hui une intrusion dans une boutique e-commerce et de ce qu’il est possible de faire ici et maintenant, avant la publication ou la confirmation d’un correctif officiel de l’éditeur.

Que s’est-il passé ?

StyleSmuggler est décrite comme une RCE non autorisée, c’est-à-dire la possibilité d’exécuter du code sur le serveur sans connexion au panneau d’administration. En termes simples : l’attaquant n’a pas besoin du mot de passe administrateur, d’un compte employé compromis ni d’un accès SSH. Il lui suffit d’une application vulnérable exposée sur Internet.

Selon les analyses publiques, l’attaque se déroule en plusieurs étapes :

  1. L’attaquant envoie une requête spécialement conçue à Magento en exploitant l’endpoint GraphQL.
  2. Le code malveillant est placé à un endroit que Magento traitera ensuite lui-même.
  3. L’application exécute le code lors du mécanisme standard de traitement des e-mails, notamment dans le scénario d’erreur de paiement.
  4. Un backdoor est installé sur le serveur, c’est-à-dire un mécanisme de retour persistant.

Ce modèle est particulièrement dangereux, car il ne nécessite ni clic sur un lien par un employé ni tentative de connexion réussie. La boutique peut être attaquée uniquement parce qu’elle est accessible publiquement.

Comment les hackers opèrent-ils aujourd’hui ?

Les intrusions dans les boutiques en ligne ressemblent de moins en moins au piratage manuel d’une cible unique. Le plus souvent, elles prennent la forme d’une campagne automatisée :

  • scan d’Internet à la recherche d’un endpoint précis,
  • envoi de tentatives prêtes à l’emploi pour exploiter la vulnérabilité,
  • installation d’un processus se faisant passer pour un composant légitime du système,
  • maintien de l’accès via cron ou un autre mécanisme de démarrage automatique,
  • collecte de sessions, secrets, clés API ou données de paiement,
  • installation éventuelle d’un webshell, d’un skimmer ou d’un autre backdoor.

Dans le cas de StyleSmuggler, deux détails sont particulièrement importants. Premièrement, le backdoor peut se trouver en dehors du répertoire de la boutique, de sorte qu’une simple vérification des fichiers Magento ne suffit pas. Deuxièmement, le processus peut se faire passer pour un élément système, par exemple avec un nom ressemblant à kworker, fc-cache ou chronyd. Pour un œil non averti, cela paraît anodin, mais s’il est lancé sous l’utilisateur web, cela doit déclencher un signal d’alerte.

Pourquoi le seul niveau de correctif ne suffit-il pas ?

Avec une vulnérabilité classique, la réponse est simple : on vérifie la version, on met à jour, et le sujet est clos. Avec un 0-day, la situation est différente. Pendant un certain temps, la vulnérabilité est exploitée avant que l’éditeur ne publie un correctif, ou avant que ce correctif ne soit clairement associé à une attaque précise.

C’est pourquoi, après un tel incident, il faut distinguer deux questions :

  • la boutique est-elle encore vulnérable ?
  • la boutique a-t-elle déjà été compromise auparavant ?

Ce n’est pas la même chose. Un WAF, le blocage de GraphQL ou un patch ultérieur peuvent limiter les tentatives suivantes, mais ils ne suppriment pas automatiquement un backdoor qui aurait pu être installé auparavant.

Que faire immédiatement ?

1. Limiter ou désactiver temporairement GraphQL

Si la boutique n’utilise pas GraphQL, la décision la plus simple consiste à bloquer temporairement /graphql jusqu’à la confirmation d’un correctif. De nombreuses boutiques Magento classiques, y compris un grand nombre de déploiements basés sur Hyvä, n’ont pas besoin d’un GraphQL public pour faire fonctionner le front. C’est différent pour les boutiques headless et PWA : dans ce cas, le blocage peut interrompre les ventes, il faut donc appliquer des règles WAF plus précises ou des restrictions de trafic.

Exemple d’approche pour nginx :

map $uri $gql_block { default 0; ~*^/+(index\.php/+)?graphql(\.php)?(/|$) 1;}

Dans chaque vhost Magento, avant les autres location :

if ($gql_block) { return 403;}

Après modification de la configuration :

nginx -t && systemctl reload nginx

Si Varnish fonctionne devant la boutique, il est également recommandé de vider le cache :

varnishadm ban 'req.url ~ .'

Après le déploiement, il faut tester différents variantes du chemin, et pas seulement le /graphql idéal. Le test doit notamment couvrir /graphql, /GraphQL, /graphql/, /graphql.php, /index.php/graphql ainsi que les variantes avec doubles barres obliques. Le résultat attendu pour GraphQL est 403, tandis que la page d’accueil de la boutique doit répondre normalement, par exemple avec 200.

2. Bloquer le vecteur connu styles[...]

Si vous ne pouvez pas désactiver tout GraphQL, appliquez au minimum des règles bloquant le paramètre observé styles[...] dans la query string ainsi que les schémas post-exploitation connus.

Pour nginx, vous pouvez utiliser des règles dans cet esprit :

if ($query_string ~* 'styles(\[|%5[bB])') { return 403;}if ($request_uri ~* '/paypal/transparent/response/.*(eval|base64_decode|%3[cC]%3[fF])') { return 403;}if ($request_uri ~* '%3[cC]%3[fF]|<\?') { return 403;}

Pour Apache, un mécanisme similaire peut s’appuyer sur mod_rewrite, en bloquant les occurrences brutes et encodées de styles[ ainsi que les tentatives d’injection d’une balise PHP dans l’URL.

Remarque importante : ces règles voient l’URL et la query string. Si une variante de l’attaque déplace entièrement la charge utile dans le body de la requête POST, une simple règle du serveur web peut ne pas suffire. Il faut alors un WAF analysant le body, ModSecurity, une solution de type Sansec Shield ou une désactivation temporaire de GraphQL.

3. Vérifier si la boutique n’a pas déjà été compromise

Bloquer les prochaines tentatives ne représente que la moitié du travail. L’autre moitié consiste à vérifier si l’attaque n’a pas déjà laissé des traces.

Lancez le contrôle en tant qu’utilisateur système Magento :

crontab -l | grep -i gvfsdls -la ~/.local/share/.gvfsd/ ~/.cache/fontconfig/fc-cache /tmp/.kw_* /tmp/.cache_* /tmp/.gvfsd-* /tmp/.fc-*/fc-cache /tmp/fc-cache 2>/dev/nullps -eo pid,comm,args | grep -iE 'kworker|fc-cache|chronyd'grep -ril 'x_trace_' var/report/

Portez une attention particulière à :

  • des fichiers dans ~/.local/share/.gvfsd/,
  • des fichiers fc-cache dans des emplacements inhabituels,
  • des répertoires temporaires de type /tmp/.kw_*, /tmp/.cache_*, /tmp/.fc-*,
  • des entrées cron lancées toutes les quelques minutes,
  • des processus se faisant passer pour des processus système, mais exécutés en tant qu’utilisateur de la boutique,
  • des fichiers PHP dans pub/media, où ils ne devraient normalement pas se trouver.

Exemple de contrôle rapide des webshells :

find pub/media -name '*.php' -print

Si le résultat n’est pas vide, il faut traiter cela comme un incident, et non comme une simple anomalie cosmétique.

4. Vérifier les logs d’accès

Dans les logs, recherchez les tentatives visant GraphQL ainsi que les requêtes inhabituelles vers les chemins de paiement. La simple présence d’une requête suspecte ne signifie pas toujours une intrusion réussie, mais elle montre que la boutique était une cible.

En pratique, il est utile de vérifier :

  • les requêtes POST vers /graphql avec des paramètres atypiques,
  • les occurrences de styles[ et de la forme encodée styles%5B,
  • les requêtes vers /paypal/transparent/response/ avec des fragments suspects,
  • les séries soudaines de requêtes provenant de nombreuses adresses IP,
  • le trafic provenant d’adresses connues dans les IOC publics.

Les documents de travail mentionnent notamment les IOC suivants : 185.157.160.251, 99.84.67.186, windwsecurity.run, ntp.timesync.to. Il ne faut toutefois pas limiter la défense à ces seules valeurs. Selon les descriptions d’incidents, une partie du trafic provenait d’un pool d’adresses plus large et d’une infrastructure intermédiaire.

5. Préserver d’abord les preuves, nettoyer ensuite

C’est une erreur fréquente : l’administrateur voit un processus suspect, le tue, supprime les fichiers, puis commence seulement l’analyse. Avec un backdoor bien conçu, cela peut détruire les traces les plus importantes, et parfois même compliquer la récupération de l’échantillon.

L’ordre des opérations doit être plus conservateur :

  1. Sauvegarder les logs nginx/Apache, PHP-FPM, système, Magento et cron.
  2. Enregistrer la liste des processus, fichiers ouverts et connexions réseau.
  3. Faire une copie des fichiers suspects pour analyse.
  4. Supprimer les entrées cron responsables de la relance du processus.
  5. Ensuite seulement, arrêter les processus et supprimer les mécanismes de persistance.
  6. Forcer la déconnexion des sessions utilisateurs et administrateurs.
  7. Faire une rotation des secrets : crypt/key, mots de passe administrateurs, clés API de paiement, d’intégrations, SMTP, ERP, PIM et marketplace.

Si la boutique traite des paiements ou des données clients, une compromission confirmée doit être considérée comme un incident de sécurité complet, et non comme une simple suppression de virus.

Quelques principes qui réduisent réellement le risque

Réduire la surface d’attaque publique

Les endpoints que la boutique n’utilise pas ne devraient pas être accessibles publiquement. Cela concerne GraphQL, les panneaux d’administration, les environnements de staging, les anciens domaines de démonstration et les copies oubliées de la boutique. En e-commerce, ce n’est très souvent pas la production qui tombe, mais un ancien staging avec une vraie base de données et les mêmes secrets.

Séparer les environnements et les droits

Le processus Magento ne doit pas disposer de plus d’accès que nécessaire. L’absence de sudo, un compte système distinct pour chaque boutique, la séparation de Redis, des bases de données distinctes et une communication sortante limitée peuvent transformer la compromission d’une boutique en incident limité plutôt qu’en catastrophe pour toute l’infrastructure.

Surveiller les processus, cron et les fichiers hors de la racine web

Scanner uniquement le répertoire Magento ne suffit pas. Le backdoor peut résider dans le répertoire home de l’utilisateur, dans /tmp, dans le cache des polices ou dans un autre emplacement accessible au processus de l’application. La surveillance doit couvrir :

  • les nouvelles entrées cron,
  • les processus inhabituels sous l’utilisateur web,
  • les nouveaux fichiers exécutables dans les répertoires temporaires,
  • les connexions à Redis, aux bases de données et à Internet,
  • les modifications dans app/etc/env.php,
  • les nouveaux comptes administrateurs.

Mettre à jour, sans confondre mise à jour et analyse d’incident

Lorsque Adobe publie un correctif, il faut le déployer. Mais après une attaque de type 0-day, le simple déploiement du correctif ne répond pas à la question de savoir si quelqu’un était déjà à l’intérieur. C’est pourquoi, après le patch, il faut tout de même effectuer un contrôle des IOC, des logs, des sessions et des secrets.

Préparer des règles d’urgence prêtes à l’emploi

Il est utile de disposer, dans le dépôt ou la documentation opérationnelle, de fragments prêts pour nginx, Apache, Varnish et WAF. En situation de crise, il n’y a pas de temps pour écrire des règles à partir de zéro. Une bonne pratique consiste également à tester les blocages sur le staging avant qu’ils ne soient nécessaires en production.

Que doit faire le propriétaire d’une boutique aujourd’hui ?

Si vous exploitez Magento ou Adobe Commerce, effectuez au minimum les actions suivantes :

  1. Dresser la liste de toutes les instances : production, staging, démo, copies de travail.
  2. Vérifier où GraphQL est public et s’il est réellement nécessaire.
  3. Déployer un blocage temporaire de GraphQL ou des règles bloquant styles[...].
  4. Valider le blocage avec des tests HTTP.
  5. Rechercher sur le serveur les processus, cron, fichiers et logs indiquant StyleSmuggler.
  6. Si vous trouvez des IOC, préserver les preuves et traiter le sujet comme un incident.
  7. Après le correctif officiel de l’éditeur, mettre à jour chaque instance, y compris le staging et les anciennes copies.
  8. Après la mise à jour, refaire un contrôle et procéder à la rotation des secrets si la boutique a pu être compromise.

La pire décision consiste à attendre que la situation se clarifie. Avec un 0-day activement exploité, le temps joue en faveur de l’attaquant. Même un blocage temporaire, s’il est bien testé et déployé consciemment, peut faire gagner de précieuses heures.

Résumé

StyleSmuggler est un bon exemple du risque moderne en e-commerce : l’attaque ne commence pas par le panneau admin, mais par un endpoint public ; elle ne s’arrête pas à un seul fichier dans le répertoire de la boutique, mais à un processus persistant en dehors de la racine web ; et un niveau de correctif à jour ne permet pas automatiquement de savoir si la boutique était sûre pendant la fenêtre d’attaque.

La défense doit être tout aussi pratique : réduire la surface, bloquer le vecteur connu, vérifier la compromission, préserver les preuves, faire tourner les secrets, et seulement ensuite considérer le sujet comme maîtrisé.

Dans ce type de situation, ce n’est pas celui qui dispose de la plus belle politique de sécurité qui gagne, mais celui qui possède des procédures prêtes, des logs, une séparation des environnements et la capacité de déployer rapidement des règles d’urgence sans arrêter toute l’activité.

Sources et ressources

  • Sansec : https://sansec.io/research/stylesmuggler-0day
  • The Hacker News : https://thehackernews.com/2026/09/unpatched-magento-and-adobe-commerce.html
  • Bulletin de sécurité Adobe pour Adobe Commerce : https://helpx.adobe.com/security/products/magento/apsb26-138.html