,

StyleSmuggler: responding to a Magento zero-day

StyleSmuggler (CVE-2026-75650) was exploited before anyone knew it existed. Attacks began on 4 September 2026, and stores were compromised for three days before Adobe shipped a fix. It affected every Magento and Adobe Commerce version from 2.4.4 to 2.4.9, including fully patched stores. Here is how to think about the response, because patching was only one part of it.

Key takeaways

  • CVE-2026-75650, CVSS 10.0, unauthenticated code execution in Magento 2.4.4–2.4.9; exploited from 4 September 2026.
  • Apply hotfix VULN-39341 (APSB26-146) and keep it in place.
  • Patching does not clean a compromised store: check for compromise on every store that was exposed.
  • Rotate the encryption key first, then every secret the Magento user could read.
  • Harden PHP and the filesystem so the next bug does less damage.

Timeline

When (UTC)What happened
4 Sep, 22:20First confirmed exploitation.
5 SepSansec discloses the campaign; WAF detection rules go live. Disrex publishes an emergency source patch and hardening advice.
7 Sep, 20:20Adobe publishes APSB26-146, Priority 1, with hotfix VULN-39341.
8 SepAdobe’s regular September release APSB26-138 ships separately.

How it works, in principle

The attack has two stages. First, the attacker gets Magento to write attacker-controlled PHP into a file the application can reach, such as a log or error report. Second, a crafted request abuses Magento’s template processing (the styles handling that gave it its name) and dependency-injection code so that the poisoned file is included and executed. Researchers observed it delivered through failed-payment emails, but also showed it working without them. No authentication is needed, and the payloads seen in the wild installed a native Linux implant disguised as a kernel process.

The response, in layers

Five layers of response: edge, runtime, code, detection and recovery1EdgeWAF / virtual patching blocks known requests2RuntimeNo shell functions, noexec /tmp, GraphQL off if unused3CodeOfficial hotfix VULN-39341, build fails if it does not apply4DetectionHunt processes, cron, PHP in var/ and pub/media5RecoveryRotate encryption key and every secret
Defence in layers: each one still helps if the one above fails.

1. Block it at the edge first

During a zero-day there is no patch to apply, so the fastest protection is virtual patching. Sansec Shield, Cloudflare and Imperva all shipped rules. Edge rules buy time; they are not a fix, because request parameters can be moved to evade them.

2. Reduce what a successful exploit can do

  • Disable process-spawning functions in PHP where the application allows it: exec, shell_exec, system, passthru, popen and, importantly, proc_open.
  • Mount temporary directories with noexec (/tmp, /var/tmp, /dev/shm), after checking nothing legitimate executes from them.
  • Temporarily disable GraphQL if the store genuinely doesn’t use it. Confirm first: headless and PWA storefronts depend on it.

These are good hardening practices anyway. A web process that cannot start a shell or run a binary from /tmp turns many remote code execution bugs from a full compromise into a failed attempt.

3. Apply the official hotfix properly

Apply VULN-39341 through your normal Composer patch process, test on staging, and make the deployment fail if a patch doesn’t apply. Remove any emergency third-party patch once the official one is in place, so you’re not carrying two fixes for the same code.

4. Assume compromise until you’ve checked

A patch stops new attacks. It does nothing for a store that was already compromised during those three days. For every store that was exposed, check for:

  • non-root processes with kernel-thread-style names in brackets, or unfamiliar processes named like system services;
  • new cron entries, and hidden binaries or lock files in the web user’s home directory and /tmp;
  • PHP code inside log and report files under var/, and any .php file under pub/media;
  • unusual bursts of “payment transaction failed” emails, and new errors in var/log/exception.log.

Use the published indicator lists and a malware scanner, but remember that a clean result is not proof. If you do find something, preserve evidence before cleaning: don’t reboot, delete the binary or redeploy until it has been captured.

5. Rotate secrets, starting with the encryption key

If code ran as the Magento user, everything that user could read is exposed. Rotate the Magento encryption key first, then every credential it protected and every secret on the filesystem: admin passwords, API and integration tokens, database credentials, SSH and deploy keys, and third-party service keys, each at its source.

What it reinforces

“Fully patched” is a point in time, not a security posture. The stores that came through best had layers that didn’t depend on the patch: a WAF, a locked-down PHP configuration, monitoring that would notice a strange process, and a practised process for rotating secrets. And it was followed a month later by a bypass of the fix, which is the subject of the next post.

Sources

Platform: , ,