Chat on WhatsApp
Upgrades & Patches 11 min read

Mage-OS 3.2.0: Adobe's Isolated Security Patch, Ported to Source

Adobe shipped its July security fix as an out-of-band .patch file. Mage-OS shipped it as version 3.2.0. Here is what the patch actually fixes, the nginx caveat that bit a store I cleaned up in June, and how to upgrade.

Mage-OS 3.2.0: Adobe's Isolated Security Patch, Ported to Source

July 14 was patch day for the whole Magento ecosystem, but the day looked completely different depending on which distribution you run. On stock Magento Open Source and Adobe Commerce, Adobe published APSB26-73 and an isolated security patch named 249-2026-07-001: a file you download, apply by hand, and track yourself, because Adobe does not push isolated patches to any git tag or Composer package. On Mage-OS, the same fixes arrived as version 3.2.0, a normal release you install with a normal composer update.

I spent that week patching client stores on both sides of the fence, so I got to feel the difference in my hands. This post walks through what 3.2.0 actually contains, in plain English, why the guest cart fix is the one that should worry store owners, the nginx caveat that I saw exploited in the wild a month before the patch existed, and who should (and should not) consider moving to Mage-OS because of how this release was delivered.

7security fixes ported to source
1composer command to get patched
0.patch files applied by hand

Patch day, two ways

Adobe's isolated patch model works like this: when a security issue needs fixing between quarterly releases, Adobe publishes a patch file out-of-band. It never appears on a git tag. It never appears in a Composer package. You download it, apply it with git apply or the composer-patches plugin, keep the file in your repository, and remember to re-check it against every future upgrade. If you run stock Magento 2.4.9, I wrote a full walkthrough of exactly that process in my APSB26-73 isolated patch apply guide, including the headline CVE-2026-48358 (NVD 10.0, arbitrary code execution through webhooks) that made this bulletin front-page news.

Mage-OS took the same isolated patch and did what a source-distributed fork can do: ported the changes into the codebase and cut a release. Mage-OS 3.2.0 is built on the Magento Open Source 2.4.9 upstream and contains the full 249-2026-07-001 patch content, plus a lower-severity installer fix, bug fixes, and updates to the bundled add-on modules. The release notes say all 3.x users should upgrade, and I agree.

AspectStock Magento 2.4.9Mage-OS 3.2.0
How the fix arrivesOut-of-band .patch file (249-2026-07-001)Normal versioned release
How you apply itgit apply or composer-patches plugin, by handcomposer require + composer update
How you track itYourself, plus Adobe's patch-status toolcomposer.lock records the version
Future upgradesRe-verify the patch still applies or is supersededFix is part of the source going forward
Telemetrypatch-status reports to Adobe's registryNone (tool deliberately omitted)

The guest cart takeover fix deserves the most attention

Every Magento store hands out masked cart IDs. When a guest starts shopping, the API identifies their quote by a random masked string instead of the numeric quote ID, and that masked ID is the only credential the guest endpoints ask for. Cart contents, coupons, billing and shipping addresses, payment and shipping method selection, totals, gift messages: all of it is reachable through guest-facing REST and GraphQL endpoints keyed on that one string.

Here is the bug: those endpoints did not verify that the masked ID actually resolved to a guest cart. A masked ID could reach a logged-in customer's cart. That turns a token designed for anonymous sessions into a key that opens authenticated customers' active quotes. An attacker holding such an ID could read the customer's billing and shipping addresses (real names, street addresses, phone numbers), tamper with cart items and coupons, or swap payment and shipping selections mid-checkout. On a busy store, carts are where fresh PII concentrates, and this class of flaw is exactly what carders and data scrapers probe for.

The fix in 3.2.0 is thorough rather than cosmetic. Every guest-facing entry point (cart, items, coupons, billing and shipping addresses, payment and shipping methods, totals, gift messages) now validates cart ownership before doing anything. And quote address validation, which previously ran only on the REST path, has been promoted to all entry points, including GraphQL.

Key point: the GraphQL promotion is the part I would not sleep on. Storefront GraphQL is public on effectively every modern Magento store, headless or not, and it is the first place automated attack tooling looks. A validation that existed for REST but not GraphQL was a gap shaped exactly like the traffic attackers already send.

Template injection and XSS: three smaller doors, now closed

The rest of the ported patch closes a cluster of injection paths that are individually less dramatic but add up.

Stored XSS through inline translation

Translated content is now sanitized before it renders: script, iframe, object, form, and style tags are stripped, on* event handlers are removed, and external links are filtered. Translation strings are one of those inputs developers mentally file under "trusted" because an admin typed them, which is precisely why stored XSS loves living there. An attacker who gets any foothold in translation data no longer gets JavaScript execution in other users' browsers for free.

Template injection, twice

Two separate template injection fixes shipped. First, the sanitizer that guards UI component data could be evaded by embedding a newline inside a ${...} payload; the pattern matching simply stopped at the line break. It now matches across newlines. Second, product gallery JSON and the product-view-counter data are no longer treated as interpolatable template content at all. Product data is merchant-editable and importer-editable, so treating it as template input was a standing risk; removing the interpolation is the correct fix, not just filtering harder.

Disabled product disclosure in GraphQL

The CatalogUrlRewrite GraphQL URL resolver leaked the existence of disabled products. Low severity, but if you disable products to hide upcoming launches, discontinued lines, or pricing experiments, a resolver that confirms "this SKU exists but is disabled" tells competitors and scrapers more than you intend.

The customer_address hardening, and the nginx rule I already deployed in June

This one is personal. In June 2026, a month before this patch existed, I cleaned up a defacement attempt on a Magento store that abused publicly served files under /media/customer_address. Customer address file attributes upload into that directory, and on that store nginx happily served whatever landed there to anyone with the URL. I saw this exact vector in the wild, and the fix I deployed was a plain nginx deny rule on the directory.

Mage-OS 3.2.0 now ships the same class of fix by default. The customer_address directory has been removed from the allowed media resources, a further set of dangerous file extensions is blocked (hta, mhtml, mht, htc, xht, shtm, php8), and nginx.conf.sample gains a deny all rule for /media/customer_address/.

Key point: the release notes carry a caveat that most people will skim past. The upgrade changes nginx.conf.sample, the reference file inside the codebase. If you maintain your own nginx config, and almost every production store does, upgrading does not touch your live server config. You have to add the deny rule yourself:
location ^~ /media/customer_address/ {
    deny all;
}

Reload nginx after adding it, then confirm a direct request to a file under that path returns 403. Two minutes of work, and it closes the exact door I watched someone walk through a month ago.

The tool Mage-OS left out: patch-status

Adobe's isolated patch ships with a vendor/bin/patch-status tool that reports your installed-patch state to Adobe's registry, authenticating with your repo.magento.com credentials. Mage-OS deliberately did not port it, and gave three reasons: there is no source-tree equivalent to report on (the fixes are simply in the source), Mage-OS users have no repo.magento.com credentials to authenticate with, and no security fix depends on the tool being present.

I think the omission is right, and also revealing. For Adobe, patch-status is a reasonable operational tool: when your fixes travel as loose files, you need some way to know which installations applied them, and support engineers benefit from that visibility. But it is also telemetry that phones home with your license credentials, bolted on to solve a problem the distribution model itself created. In a source-distribution model the question "am I patched?" is answered by composer.lock, offline, with no account required. The two patch-day experiences differ not because one team cares more, but because one delivery model needs bookkeeping infrastructure and the other does not.

The installer fix: GHSA-rcp4-m32j-8fhj

Alongside the ported Adobe patch, 3.2.0 fixes a low-severity issue of its own, tracked as GHSA-rcp4-m32j-8fhj (CWE-276, incorrect default permissions). When the interactive installer was re-run over an existing installation, it backed up app/etc/env.php to a world-readable file without a .php extension. env.php holds your database credentials and crypt key, so a backup copy that the web server will serve as plain text is a credential leak waiting for a directory guess.

The exposure was narrow: it affects only the interactive installer resume path, not bin/magento setup:install, and it requires the legacy layout where the Magento root is the web docroot rather than pub/. Modern deployments hit neither condition. The backup is now written with 0600 permissions and a .php extension, so even on a legacy layout the web server executes an empty response instead of serving secrets. Credit where due: the issue was reported by Volker Dusch (@edorian) of the PHP Ecosystem Security Team at The PHP Foundation. Coordinated reports like this landing in a community fork's release notes is a healthy sign for the project.

How to upgrade

The upgrade is the standard Mage-OS flow:

composer require mage-os/product-community-edition 3.2.0 --no-update && composer update

Then the usual Magento deployment sequence on top:

bin/magento maintenance:enable
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f en_US
bin/magento cache:flush
bin/magento maintenance:disable

Test on staging first, as with any release, but expect this to be an uneventful upgrade: 3.2.0 is a security release on the same 2.4.9 upstream as 3.0.0 and 3.1.0, not a feature jump. For context on the 3.x line: 3.0.0 arrived in May 2026, 3.1.0 followed on June 18 with Mage-OS package name support in the composer root-update plugin, sixteen core stability fixes and bundled add-on updates, and 3.2.0 landed July 14. The next planned feature release is October 2026 per the Mage-OS roadmap, so this cadence (feature releases on a schedule, security releases when Adobe publishes) is the rhythm to plan around.

If you are coming from further back, either stock Magento or an older Mage-OS 2.x install, the path has more steps: PHP version alignment, extension compatibility, theme checks. I documented that route in my Magento 2.4.9 and Mage-OS upgrade guide, and I handle the whole thing as a fixed-scope job through my Magento upgrade service if you would rather not spend your own weekend on it.

Should you move to Mage-OS?

This release is the strongest practical argument the fork has made yet, so it is fair to ask. My honest answer cuts both ways.

Switching makes sense if you run Magento Open Source, install from GitHub or Composer, have no Adobe support contract, and patch your own servers. For you, the isolated patch model is pure overhead: you get no Adobe support engineer, no Cloud tooling that applies patches for you, just a .patch file and a checklist. Mage-OS turns that into a version bump, and because it tracks the 2.4.9 upstream, your extensions and theme almost always carry over unchanged.

Staying put is the right call if you are an Adobe Commerce customer. B2B features, Cloud infrastructure, and the support contract all live on Adobe's side of the fence, and Adobe's tooling exists precisely to manage patches for you. The same goes for Open Source stores that depend heavily on repo.magento.com Marketplace packages tied to their Adobe account: migrate the dependency chain first, or not at all. Distribution convenience is a real benefit, but it is not worth breaking a support relationship you are paying for.

Bottom line

Mage-OS 3.2.0 is a complete, faithful port of Adobe's July isolated security patch, delivered the way security fixes should be delivered: as a versioned release you install with composer. The guest cart ownership fix alone justifies upgrading today, and every 3.x store should. Just do not let the composer command lull you into skipping the one manual step: if you manage your own nginx config, the /media/customer_address deny rule does not deploy itself.

Not sure your store is actually patched? I patch and upgrade Magento and Mage-OS stores for a living, including the nginx and media hardening most upgrades silently skip. Fixed fee from $499 audit · $2,499 sprint · ~4h @ $25/hr for a typical security release rollout, staging-tested and verified live.

Get your store patched

Frequently asked questions

Do I need Mage-OS 3.2.0 if I already applied Adobe's isolated patch?

Those are two different worlds. Adobe's patch 249-2026-07-001 applies to stock Magento Open Source and Adobe Commerce. Mage-OS 3.2.0 is for stores running Mage-OS 3.x, and the release notes say all 3.x users should upgrade. If you run Mage-OS, upgrade; the .patch file was never meant for you.

Does Mage-OS 3.2.0 fix the CVSS 10.0 webhooks CVE from APSB26-73?

CVE-2026-48358, the headline of Adobe's bulletin, concerns arbitrary code execution through webhooks functionality in Adobe's stack. Mage-OS 3.2.0 ports the isolated patch 249-2026-07-001 content that applies to the Open Source codebase. If you run stock Magento or Adobe Commerce, follow my APSB26-73 apply guide to cover the full bulletin.

Will my Magento 2.4.9 extensions work on Mage-OS 3.2.0?

Almost always. Mage-OS 3.x is built on the Magento Open Source 2.4.9 upstream, so extensions that declare 2.4.9 compatibility generally install and run unchanged. Test on staging as you would for any release, especially anything touching checkout, since this release changes guest cart validation.

I maintain my own nginx config. What exactly do I need to change?

Add a location block that denies all requests to /media/customer_address/ and reload nginx. Upgrading only updates nginx.conf.sample inside the codebase; your live server config is untouched. Verify afterwards that a direct URL to a file under that path returns 403.

Why did Mage-OS leave out Adobe's patch-status tool?

Three stated reasons: the fixes live in source so there is no separate patch state to report, Mage-OS users have no repo.magento.com credentials for the tool to authenticate with, and no security fix depends on it. Your composer.lock already tells you whether you are patched.

Do I still need setup:upgrade after the composer update?

Yes. Composer only swaps the code. Run setup:upgrade, setup:di:compile, static-content:deploy and a cache flush, ideally behind maintenance mode, exactly as you would for any Magento release.

When is the next Mage-OS feature release?

October 2026, per the published roadmap. In between, expect security releases like 3.2.0 whenever Adobe publishes fixes, since Mage-OS ports them to source and ships a version bump rather than a patch file.