Threat Overview
Adobe and Sansec have confirmed active exploitation of CVE-2026-75650, a CVSS 10.0 unauthenticated remote code execution vulnerability in Adobe Commerce and Magento Open Source. Sansec first observed exploitation on September 4, 2026 and named the issue StyleSmuggler. The chain abuses Magento template processing through attacker-controlled style data, plants PHP code in Magento-written content, and then causes Magento to execute the poisoned content while rendering a Payment Transaction Failed Reminder email. No recipient has to open the message. Adobe published hotfix VULN-39341 on September 7 and states that CVE-2026-75650 has been exploited in the wild targeting Adobe Commerce merchants.
Post-exploitation has evolved quickly. Sansec observed Rust Linux backdoors masquerading as `[kworker/u:8:0]`, `fc-cache`, and `chronyd`, persistence in cron spool files, WebSocket/TLS C2, and later builds using NTP-shaped UDP/123 traffic. A separate attacker was also observed exploiting the same vulnerable surface to deploy a PHP web shell under the product image cache.
References
- Adobe / The Hacker News patch confirmation and affected-version summary, published September 8, 2026: https://thehackernews.com/2026/09/adobe-patches-magento-zero-day.html
- Sansec StyleSmuggler technical analysis, published September 5 and updated September 7, 2026: https://sansec.io/research/stylesmuggler-0day
- Earlier exploitation reporting and independent incident-response corroboration, September 5, 2026: https://thehackernews.com/2026/09/unpatched-magento-and-adobe-commerce.html
Impacted Systems
Vendor/product: Adobe Commerce, Adobe Commerce B2B, and Magento Open Source. Deployment model: self-managed/on-premises or hosted merchant deployments running affected application builds. Affected Adobe Commerce versions: 2.4.9-2026-aug and earlier, 2.4.8-2026-aug and earlier, 2.4.7-2026-aug and earlier, 2.4.6-2026-aug and earlier, 2.4.5-2026-aug and earlier, and 2.4.4-2026-aug and earlier. Affected Adobe Commerce B2B versions: 1.5.3-2026-aug and earlier, 1.5.2-2026-aug and earlier, 1.4.2-2026-aug and earlier, 1.3.4-2026-aug and earlier, and 1.3.3-2026-aug and earlier. Affected Magento Open Source versions: 2.4.9-2026-aug and earlier, 2.4.8-2026-aug and earlier, 2.4.7-2026-aug and earlier, and 2.4.6-2026-aug and earlier. Attack prerequisite: network reachability to the vulnerable commerce application; authentication is not required. Adobe’s fix is hotfix VULN-39341. Adobe also directs customers to rotate encryption keys after applying the patch.
Why this matters
This is confirmed exploitation of an Internet-facing e-commerce platform with unauthenticated code execution, persistent malware, rapidly changing process names, and multiple observed post-exploitation chains. Patching closes the vulnerable path but does not remove implants placed during the zero-day window.
Criticality: Critical
Exploitation Status
Confirmed active exploitation. Sansec observed exploitation beginning September 4, 2026. Adobe subsequently confirmed that CVE-2026-75650 has been exploited in the wild against Adobe Commerce merchants. Sansec documented multiple backdoor variants and a separate PHP web-shell deployment path on affected stores.
What this hunt looks for
Available Microsoft Sentinel telemetry can be reviewed for suspicious GraphQL traffic, published attacker infrastructure, Linux backdoor process masquerading, malicious file creation, cron persistence, NTP-shaped C2, WebSocket/TLS C2, and PHP web-shell creation where the relevant WAF, firewall, DNS, Syslog, or Defender XDR telemetry is ingested.
Required logs
- Microsoft Defender XDR / Defender for Endpoint: DeviceProcessEvents, DeviceFileEvents, and DeviceNetworkEvents
- CommonSecurityLog from WAF, reverse proxy, or firewall telemetry with URL/request fields
- Linux Syslog from Adobe Commerce or Magento servers for cron/process fallback hunting
First Pass – Published StyleSmuggler Process and File Indicators
DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where FileName in~ ("gvfsd-user","fc-cache","chronyd") or ProcessCommandLine has_any ("[kworker/u:8:0]",".local/share/.gvfsd","/tmp/.chrony-","/tmp/.fc-","/tmp/.kw_")
| project TimeGenerated, DeviceName, AccountName, FileName, FolderPath, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, SHA256
| order by TimeGenerated desc
Published StyleSmuggler Malware Hashes
let StyleSmugglerHashes = dynamic(["e315687a1dfe61ef4a5a5642214db6d3b2b05d81391285eebc2af664641a26a7","b79dfdc1eed860e0b76c629d6adfce251db379b0b45a6d728d4ef483f7551420","4352cabaa451e5a894535fbcc4d46628701303322a13745cb5479d7d0534ae8e","d2fbf9eb75c495bfea48790d3b228fab0c15a282419c3d3f5e49294c4e1a3e82","1a3374ffac5b0a62467612f264c49792d206304d4514409c982325c91231375d"]);
DeviceFileEvents
| where TimeGenerated > ago(30d)
| where SHA256 in (StyleSmugglerHashes)
| project TimeGenerated, DeviceName, ActionType, FolderPath, FileName, SHA256, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by TimeGenerated desc
StyleSmuggler Persistence Paths and PHP Web Shells
DeviceFileEvents
| where TimeGenerated > ago(14d)
| where FolderPath has_any (".local/share/.gvfsd",".cache/fontconfig","/tmp/.chrony-","/tmp/.fc-","/var/spool/cron","pub/media/catalog/product/cache")
| where FileName in~ ("gvfsd-user","fc-cache","chronyd") or FileName matches regex @"(?i)^sync_[0-9a-f]{10}\.php$" or FileName matches regex @"(?i)^\.gvfsd_[0-9a-f]{8}\.lock$"
| project TimeGenerated, DeviceName, ActionType, FolderPath, FileName, SHA256, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by TimeGenerated desc
Published C2 and Malware Download Infrastructure
let StyleSmugglerIPs = dynamic(["99.84.67.186","185.157.160.251","209.141.43.95"]);
let StyleSmugglerDomains = dynamic(["247.cdnflare.xyz","windwsecurity.run","ntp.timesysnc.net","time.microsft.run","pool.microsft.studio","ntp.timesync.to","ntp.synctime.to","ntp.syncstime.to"]);
DeviceNetworkEvents
| where TimeGenerated > ago(30d)
| where RemoteIP in (StyleSmugglerIPs) or RemoteUrl has_any (StyleSmugglerDomains)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort, Protocol
| order by TimeGenerated desc
NTP-Shaped C2 From Unexpected Linux Processes
DeviceNetworkEvents
| where TimeGenerated > ago(14d)
| where RemotePort == 123
| where InitiatingProcessFileName in~ ("fc-cache","chronyd","gvfsd-user") or InitiatingProcessCommandLine has_any (".chrony-",".fc-",".gvfsd","[kworker/u:8:0]")
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Connections=count(), RemoteIPs=make_set(RemoteIP,20), RemoteUrls=make_set(RemoteUrl,20) by DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by LastSeen desc
Magento GraphQL Requests With Published Attack Markers
CommonSecurityLog
| where TimeGenerated > ago(14d)
| extend Raw=strcat(RequestMethod," ",RequestURL," ",Message," ",AdditionalExtensions)
| where Raw has "/graphql"
| where Raw has_any ("styles[","X-TRACE","X_TRACE_","ss6_457cfa2fb7","Store:")
| project TimeGenerated, SourceIP, DestinationIP, RequestMethod, RequestURL, DeviceAction, Raw
| order by TimeGenerated desc
Published StyleSmuggler Attacker Source Addresses
let Sources = dynamic(["88.216.72.181","182.182.152.48","76.31.99.207","209.73.130.148","77.239.124.107","5.181.86.133"]);
CommonSecurityLog
| where TimeGenerated > ago(30d)
| where SourceIP in (Sources)
| project TimeGenerated, SourceIP, DestinationIP, DestinationPort, RequestMethod, RequestURL, DeviceAction, Message
| order by TimeGenerated desc
Rare Outbound Destinations From Commerce Servers
let CommerceHosts = dynamic(["REPLACE_WITH_MAGENTO_OR_ADOBE_COMMERCE_HOST"]);
let Baseline = DeviceNetworkEvents
| where TimeGenerated between (ago(30d) .. ago(2d))
| where DeviceName in~ (CommerceHosts)
| summarize by RemoteUrl, RemoteIP;
DeviceNetworkEvents
| where TimeGenerated > ago(2d)
| where DeviceName in~ (CommerceHosts)
| where (RemoteUrl, RemoteIP) !in (Baseline)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort, Protocol
| order by TimeGenerated desc
Linux Syslog Cron and Process Persistence Fallback
Syslog
| where TimeGenerated > ago(14d)
| where SyslogMessage has_any ("gvfsd-user","/tmp/.kw_","/tmp/.fc-","/tmp/.chrony-","fc-cache","chronyd")
| project TimeGenerated, Computer, Facility, SeverityLevel, ProcessName, SyslogMessage
| order by TimeGenerated desc
Detection Notes
Highest signal is a published implant path/hash, a non-root `[kworker/u:8:0]`-style process, `fc-cache` or `chronyd` executing from the published hidden paths, or outbound traffic to the published C2 infrastructure. A process named `chronyd` is not inherently suspicious; path, parent process, ownership, and network pattern matter. NTP-shaped C2 can be missed if monitoring excludes UDP/123 or automatically trusts `chronyd`. WAF/CEF field population varies by product, so the GraphQL query may require adapting RequestURL, Message, or AdditionalExtensions parsing. Patching does not remove an already deployed implant.