Active exploitation, no vendor patch as of 7 September 2026

    StyleSmuggler: the Magento zero-day Adobe has not patched

    Every version is affected, including 2.4.9, and being fully patched does not help

    By Simon Bumford, Founder of EveryHost8 min read

    TL;DR

    On 5 September 2026 the ecommerce security firm Sansec disclosed StyleSmuggler, an unauthenticated remote code execution flaw in Magento and Adobe Commerce. Attacks began on 4 September. All current versions are affected, including 2.4.9, and the first confirmed victim was already patched to August 2026. As of today Adobe has published no advisory, no CVE, no patch and no workaround. Adobe's next scheduled security release is 8 September. Until then, mitigation and detection are all you have. This page gives you both, including a script you can run on your own store whoever hosts it.

    We swept every Magento server we host. No EveryHost customer store was compromised. We found one injection attempt that never executed. The detail of what we found, and how we know it did not run, is further down this page.

    How the attack works, in two stages

    Stage 1: injectStage 2: triggerattackerunauthenticatedvar/report/<file>PHP written into a report Magento madePayment TransactionFailed Reminder jobcode executionpersistent backdoor installed

    The attacker first gets PHP written into a file that Magento itself creates, typically an exception report under var/report. Those files are ordinary JSON stack traces, so nothing looks unusual about Magento writing one.

    The second stage is the clever part, and it is why the usual defences do not help. Execution is triggered through Magento's Payment Transaction Failed Reminder email function, which runs from cron. That means the injected file never has to be reachable from a browser. Blocking direct access to var/ over HTTP, which most well-configured stores already do, does not stop it.

    Successful exploitation installs a persistent backdoor disguised as a Linux kernel thread, which is why it survives a casual look at the process list.

    Indicators of compromise

    These are the indicators published by Sansec. Check all of them, not just one, because the stages leave different traces.

    Process
    kworker/u:8:0 owned by a non-root user
    Backdoor binary
    ~/.local/share/.gvfsd/gvfsd-user
    Dropper files
    /tmp/.kw_*
    Command and control
    247.cdnflare[.]xyz
    Attacker IPs
    99.84.67.186, 88.216.72.181, 5.181.86.133
    Stage one artefact
    PHP inside files under var/report

    Check your own store, whoever hosts it

    This is the script we ran across our own fleet. It is read only. It changes nothing, deletes nothing and sends nothing anywhere. Run it as root on the server your store runs on. If you do not have server access, send it to whoever does.

    #!/bin/bash
    # StyleSmuggler IOC check. Sansec advisory 2026-09-05. READ ONLY.
    HIT=0
    
    echo "[1] Backdoor process"
    ps -eo user,pid,args | grep -F 'kworker/u:8:0' | grep -v '^root' | grep -v grep && HIT=1
    
    echo "[2] Backdoor binary"
    find /home /root /var/www -maxdepth 7 -path '*/.local/share/.gvfsd/gvfsd-user' 2>/dev/null && HIT=1
    
    echo "[3] Dropper artefacts"
    ls -la /tmp/.kw_* /var/tmp/.kw_* /dev/shm/.kw_* 2>/dev/null && HIT=1
    
    echo "[4] Live connections to known C2"
    ss -tan 2>/dev/null | grep -E '99\.84\.67\.186|88\.216\.72\.181|5\.181\.86\.133' && HIT=1
    
    echo "[5] PHP injected into Magento report files"
    for D in /home/*/public_html /var/www/*; do
      [ -d "$D/var/report" ] || continue
      grep -rlE '<\?=eval\(|<\?php.*eval\(|base64_decode' "$D/var/report" 2>/dev/null && HIT=1
    done
    
    echo "[6] Hardening posture"
    php -i 2>/dev/null | grep '^disable_functions' | grep -q proc_open \
      && echo "  proc_open disabled: yes" || echo "  proc_open disabled: NO"
    for M in /tmp /var/tmp /dev/shm; do
      findmnt -no OPTIONS "$M" 2>/dev/null | grep -q noexec \
        && echo "  $M noexec: yes" || echo "  $M noexec: NO"
    done
    
    [ "$HIT" = "0" ] && echo "RESULT: no indicators found" \
      || echo "RESULT: INDICATORS FOUND. Do not clean or reboot. Preserve state."

    If it finds something, stop. Do not delete the file, clean the server or reboot. Preserving the current state is what makes it possible to establish what happened, when, and whether anything left the building. Cleaning first destroys the only evidence you have.

    What to do before Adobe ships a fix

    Sansec recommends four mitigations. In our sweep of every Magento server we host, the two most commonly missing were the third and fourth. Start there.

    1. 1Temporarily disable GraphQL if your store does not use it. Check with your developer first, because headless and PWA storefronts depend on it.
    2. 2Block requests carrying the exploit parameters at the web server, in front of Magento.
    3. 3Disable proc_open in PHP. On our fleet this was enabled everywhere, and it is a one-line change in php.ini.
    4. 4Mount /tmp, /var/tmp and /dev/shm with noexec. On our fleet /tmp and /var/tmp were already correct and /dev/shm was not.

    There is a fifth option worth considering while there is no patch: disable the Payment Transaction Failed Reminder job. It removes the trigger without touching the vulnerability. Weigh that against losing the reminder emails for a few days.

    What we found on our own fleet

    We ran the check above on every Magento server we host, on 7 September, two days after Sansec published. No EveryHost customer store was compromised. No backdoor process, no dropper, no command and control traffic on any server.

    We did find one injection attempt, on one server, and we are publishing that rather than rounding it to zero. Two files under var/report carried an injected payload. They stood out for three reasons: only two of 3,777 report files on that store matched, both carried old filenames but had been rewritten on 5 September, and both were exactly 8,832 bytes where every normal report on that store is 2,564.

    It never executed. The payload carried its own 180 second self-expiry based on the file's modification time, and that window had closed long before we found it. It also required a specific secret HTTP header to run at all. We left both files in place as evidence rather than deleting them.

    We are a listed Sansec partner , which is how this reached us quickly. Being the host rather than a plugin vendor is the reason we could check every store ourselves instead of emailing customers a bulletin and hoping.

    StyleSmuggler: frequently asked questions

    Frequently Asked Questions

    StyleSmuggler is the name Sansec gave to a Magento and Adobe Commerce zero-day it disclosed on 5 September 2026. It allows an unauthenticated attacker to run code on the server. Sansec published early, before Adobe had an advisory, because stores were already being compromised. Attacks were first observed on 4 September 2026.

    Not at the time of writing. As of 7 September 2026 Adobe has published no advisory, no CVE identifier, no patch and no workaround for this specific flaw. Adobe's next scheduled security release is 8 September 2026. Until a fix exists, mitigation is the only option, which is why this page leads with mitigations rather than patch instructions.

    All current versions, including 2.4.9. Sansec confirmed exploitation on Magento Open Source 2.4.7, 2.4.8 and 2.4.9. The first identified victim was running 2.4.6-p15 with the August 2026 patches already applied. This is the part merchants get wrong: being fully patched does not protect you, because there is no patch for this yet.

    It runs in two stages. First the attacker injects PHP into a file Magento itself writes, typically an exception report under var/report. Then they trigger execution through Magento's Payment Transaction Failed Reminder email function. The second stage matters, because it means the injected file never needs to be reachable from the web. Your normal protections against browsing to a PHP file do not stop it.

    Look for a process named kworker/u:8:0 owned by a non-root user, a binary at ~/.local/share/.gvfsd/gvfsd-user, files matching /tmp/.kw_*, connections to 247.cdnflare.xyz, and PHP code inside files under var/report. The script further down this page checks all of those. If you find anything, do not clean or reboot. Preserving the current state is what makes it possible to establish what happened.

    Sansec recommends four things: temporarily disable GraphQL if you do not use it, block requests carrying the exploit parameters at the web server, disable proc_open in PHP, and mount /tmp, /var/tmp and /dev/shm with noexec. In our own sweep of every Magento server we host, the two most commonly missing were proc_open still enabled and /dev/shm not mounted noexec. Those are the two worth checking first.

    No EveryHost customer store was compromised. We swept every Magento server we host after Sansec published. We found one injection attempt on one server that never executed: the payload had a 180 second self-expiry which had long passed, and the file it was written to has no PHP extension so it could not be run by a web request. No backdoor process, no dropper, no command and control traffic was found on any server.

    No. This is the single most important thing to understand about StyleSmuggler. 2.4.9 is affected. The first confirmed victim was patched to August 2026. Version currency is normally good advice and it is not enough here, because the vulnerability is unpatched in every release line. Mitigation and monitoring are what help until Adobe ships.

    Want someone to run this check for you?

    We will run the StyleSmuggler check against your Magento store once, free, and send you the result in plain English. You do not have to be a customer and there is nothing to install. If it comes back clean, that is a useful thing to know today.

    EveryHost hosts Magento and Adobe Commerce on-premise, and nothing else. Read more in our APSB26-92 briefing or on our Sentinel security page.