Le 17 mars 2026, l'équipe Sansec Forensics a divulgué PolyShell, une vulnérabilité critique dans l'API REST de Magento 2 et Adobe Commerce. Le bug permet l'upload de fichiers PHP exécutables sans authentification, et il est présent depuis la première version de Magento 2 — toutes les versions stables sont concernées.
État au 14 avril 2026 : selon les données Sansec, 82 % des boutiques Magento monitorées ont reçu des tentatives d'upload malveillant. Le correctif n'existe que dans la pre-release 2.4.9-alpha3 (APSB25-94) — aucun patch isolé n'est disponible pour les versions production.
Qu'est-ce que PolyShell ?
PolyShell est une faille d'upload non restreint exploitée via les options personnalisées des articles du panier invité. Le terme « polyshell » vient du fichier polyglotte utilisé par les attaquants : un fichier valide à la fois comme image GIF (header GIF89a) et comme script PHP exécutable.
Trois contrôles sont absents du code Magento :
- Pas de validation de l'ID d'option produit soumis
- Pas de vérification du type d'option réel
- Pas de restriction d'extension (
.php,.phtml,.pharsont autorisés)
La seule validation effectuée est un appel à getimagesizefromstring() sur l'en-tête du fichier — trivialement contournable en injectant un préfixe d'image valide devant le payload PHP.
Endpoints vulnérables
POST /V1/guest-carts/:cartId/items
PUT /V1/guest-carts/:cartId/items/:itemIdCes endpoints sont accessibles sans authentification. Les fichiers uploadés sont écrits dans pub/media/custom_options/quote/.
Bonne nouvelle : les mutations GraphQL utilisent un autre chemin de code et ne sont pas concernées par cette vulnérabilité.
Versions affectées
| Version Magento Open Source / Adobe Commerce | Statut |
|---|---|
| ≤ 2.4.9-alpha2 (toutes les versions stables) | Vulnérable |
| 2.4.9-alpha3+ (pre-release uniquement) | Corrigée (APSB25-94) |
| Pré-2.3.5 (Stored XSS additionnel) | Vulnérable |
| Nginx stock 2.0.0–2.2.x | RCE directe possible |
À ce jour, aucun rétroportage du correctif n'a été publié pour les versions production. Les boutiques sous 2.4.x doivent appliquer les mitigations décrites plus bas en attendant.
Chronologie de l'exploitation
- 16 mars 2026 — premières tentatives d'exploitation détectées (12:00 UTC)
- 19 mars — début du scan automatisé massif
- 23 mars — 23 % des boutiques scannées
- 24 mars — 56,7 % des boutiques touchées par des uploads PHP malveillants ; un retailer à 100 milliards de dollars compromis avec un skimmer WebRTC
- 30 mars — 79,5 % des boutiques visées ; déploiement actif de backdoors et de loaders JavaScript
- 14 avril — 82 % de l'écosystème touché
Auditer son Magento : commandes à lancer
Lister les fichiers suspects dans le dossier d'upload
find pub/media/custom_options/ -type f ! -name '.htaccess'Toute extension .php, .phtml ou .phar dans ce répertoire est un indicateur de compromission direct.
Rechercher la backdoor accesson.php
find /var/www -name 'accesson.php' -type f 2>/dev/nullCette backdoor secondaire est dispersée par les attaquants dans plusieurs répertoires :
var/assets/images/accesson.php
vendor/assets/images/accesson.php
pub/assets/images/accesson.php
app/assets/images/accesson.php
lib/assets/images/accesson.php
bin/assets/images/accesson.php
setup/assets/images/accesson.php
generated/assets/images/accesson.phpRepérer les patterns d'évaluation dans les fichiers PHP
find pub/media/custom_options/ -type f \( -name '*.php' -o -name '*.phtml' -o -name '*.phar' \)
grep -rE 'eval\s*\(\s*base64_decode' pub/ var/ generated/ 2>/dev/nullIndicateurs de compromission
Noms de fichiers observés en attaques
index.php, json-shell.php, bypass.phtml, c.php, r.php, rce.php, static.php, test.php, blocked-json.php, bypass-async.php, urlencode-shell.php, accesson.php, toggige-arrow.jpg.
Pattern récurrent : [optionID]index.php (par exemple 780index.php).
Domaines de chargement de payload JavaScript
lanhd6549tdhse[.]topjslibrary[.]netcanevaslab[.]com
Signature beacon
La backdoor accesson.php retourne systématiquement la valeur 8194460 (résultat de 409723 × 20) comme empreinte. C'est une signature unique exploitable pour grep réseau ou pour détecter les shells actifs sur un serveur déjà compromis.
Se protéger : configurations à appliquer
Nginx
Insérer ce bloc avant tout location ~ \.php$ dans la config du virtual host Magento :
location ~* ^/pub/media/custom_options/ {
deny all;
return 403;
}Apache
Créer ou modifier le fichier .htaccess dans pub/media/custom_options/ :
<IfModule mod_php.c>
php_flag engine 0
</IfModule>
Deny from allLimite importante : bloquer l'accès web au répertoire n'empêche pas l'upload via l'API REST. Les fichiers malveillants restent sur le disque et redeviennent dangereux après une migration ou un changement de serveur web. Il faut scanner activement le filesystem en plus.
Recommandations
- Lancer immédiatement les commandes d'audit ci-dessus sur tous les environnements de production
- Appliquer la configuration Nginx ou Apache dès aujourd'hui
- Mettre en place un cron de scan sur
pub/media/custom_options/avec alerte par e-mail en cas de fichier non-image - Envisager un WAF dédié Magento (Sansec Shield, eComscan ou équivalent) pour intercepter les tentatives en temps réel
- Surveiller les annonces Adobe pour le rétroportage du correctif sur la branche 2.4.x
- En cas de compromission avérée : isoler la machine, dumper la base, restaurer depuis un backup antérieur au 16 mars 2026 et changer toutes les clés (API, admin, intégrations tierces)
Conclusion
PolyShell est l'une des failles les plus critiques de l'année pour l'écosystème Magento : non authentifiée, exploitée massivement, sans patch isolé pour les versions stables. Tant qu'Adobe ne publie pas de rétroportage, les mitigations décrites ici sont la seule barrière entre une boutique et une RCE complète.
Sources :
- Article original Sansec : sansec.io/research/magento-polyshell
- Bulletin Adobe APSB25-94