Magento / Adobe Commerce “StyleSmuggler” — CVE-2026-75650

Unauthenticated PHP template-injection RCE (CVSS 10.0) in Magento Open Source & Adobe Commerce 2.4.4–2.4.9 — exploited in the wild since 2026-09-04, deploying a Rust-based Linux backdoor and independent PHP web shells
Threat
StyleSmuggler / CVE-2026-75650
Severity
EXPLOITED ITW — CVSS 10.0
Type
Unauthenticated RCE / Web Shell / Linux Backdoor
Access
Network, no auth, no user interaction
Version
v0.1 (Draft) — 2026-09-08
Author
HuntPack
Confidence
High (5 corroborating sources, incl. Adobe's own bulletin)
01

Executive Summary

Adobe Commerce and Magento Open Source (versions 2.4.4 through 2.4.9, plus Adobe Commerce B2B 1.3.3–1.5.3) carry an unauthenticated, network-exploitable remote code execution flaw — CVE-2026-75650, CVSS 10.0, CWE-1336 (Improper Neutralization of Special Elements Used in a Template Engine) — publicly nicknamed StyleSmuggler by discoverer Sansec. The attacker's objective is straightforward: smuggle PHP into Magento's template engine via a styles property, then force the platform to render its own standard “Payment Transaction Failed Reminder” email template so the poisoned content is loaded and executed through a dependency-injection file-include path — no valid account, and no victim interaction, required. Exploitation began 2026-09-04 22:20 UTC; Adobe shipped emergency bulletin APSB26-146 and hotfix VULN-39341 on 2026-09-07, roughly three days later. Critically, Sansec's first confirmed compromised customer was already running the July and August 2026 security patches — this is a true zero-day, and "fully patched before September 7" does not mean "was never exposed."

Two independent payload families have been observed riding the same RCE: a Rust-based Linux backdoor that renames itself to blend in with legitimate system processes ([kworker/u:8:0], fc-cache, chronyd, and a gvfsd-themed variant referenced in the researcher's own hunt commands), persists via cron, and beacons every 60 seconds over UDP/123 disguised as NTP traffic to a small set of C2 hosts including 99.84.67.186; and, from an apparently unrelated actor, a 485-byte PHP web shell dropper that plants a header-gated shell inside Magento's own product-image cache directory (pub/media/catalog/product/cache/...).

The highest-value defensive angle is layered: (1) the vendor patch closes the door — apply VULN-39341 now; (2) the masquerading process names and disguised-NTP C2 beacon are distinctive and cheap to hunt on Linux endpoint telemetry even without knowing every future C2 IP; (3) the web shell's file-write location and required X-Cache-Token header make it a strong indicator once WAF/app-log visibility exists; and (4) because RCE predates public detection content by days, every internet-facing store that was reachable between 2026-09-04 and patch application needs a retrospective compromise review, not just a version check.

Defender priority: Patch first (VULN-39341), then hunt for the masquerading Linux process names and the disguised-NTP C2 beacon — these two signals catch the RCE's most-observed payload even for stores compromised before the hotfix existed, and they require no updated IOC feed to be useful.

02

Source Review & Web Hunter Notes

Five sources were fetched live and saved verbatim to Magento-StyleSmuggler-CVE-2026-75650-Hunt-sources/ before any fact in this pack was written. All five were reviewed for injected/adversarial instructions directed at an AI agent — none were found; all fetched content was analyzed strictly as data. No source's content was used to override or replace the independently-corroborated C2 IP (99.84.67.186) supplied in the original tasking.

TierSourceKey FindingCarry Forward
T1Sansec — StyleSmuggler ResearchDiscoverer's primary technical writeup: attack mechanism, full backdoor variant list (kworker/fc-cache/chronyd/gvfsd), cron persistence schedule, NTP-disguised C2, IOC list (IPs/domains), detection/hunt commands, remediation steps, timeline.Yes
T1Adobe — APSB26-146 Bulletin (Experience League mirror)Authoritative bulletin ID, CVE, affected version ranges (Commerce/B2B/Open Source), hotfix ID VULN-39341, required credential/key rotation. helpx.adobe.com's own bulletin page returned HTTP 403 to the fetch tool; this Adobe-hosted knowledge-base mirror of the same bulletin was used instead.Yes
T2The Hacker NewsRecency + corroboration of affected-version list and dual-payload (Rust backdoor / PHP web shell) framing; notes 12 exploitation attempts from China/Romania-sourced IPs per Previdian (not independently verified further — treated as context, not an atomic IOC).Partial
T2CSO OnlineIndependently corroborates C2 IP 99.84.67.186, cron-based persistence, and disguised-NTP/UDP-123 C2 traffic.Yes
T2SOC PrimeDeepest single-source technical narrative of the two-stage template-injection→dependency-injection-include chain; CWE-1336 classification; web-shell path pattern and X-Cache-Token gating; extensive IR/detection-indicator checklist; corroborates 185.157.160.251.Yes

Cross-reference notes: C2 IP 99.84.67.186 is corroborated by two independent sources (Sansec, CSO Online) and matches the value supplied in the original tasking — no source suggested a different value, so no substitution risk applies. No file hashes were recovered verbatim from any fetched source despite Sansec stating hashes exist for the backdoor and dropper — those hash values are therefore shipped as labelled REPLACE_WITH_SHA256 placeholders rather than fabricated. Affected-version phrasing differs slightly between sources (Sansec: "2.4.4 through 2.4.9"; Adobe/THN: itemized "-2026-aug and earlier" branch list) — both describe the same version range and are not a real contradiction.

Gap: No public SHA256/MD5/SHA1 hash values for either the Rust backdoor or the PHP dropper were present in any of the five fetched snapshots, even though Sansec's page references their existence. Populate the placeholder hash rows in §10 from your own eComscan/YARA sweep or a direct (non-AI-agent) pull of Sansec's full IOC appendix before relying on hash-based blocking.

03

Hunt Brief & Attack Chain

Hunt hypotheses

#HypothesisMITREFalcon TelemetryExpected FPConfidence
H1A Linux backdoor process is running under one of the known StyleSmuggler masquerade names, spawned from a web/app-server-family parent — never a legitimate spawn path for those binaries.T1036.004/.005ProcessRollup2 / SyntheticProcessRollup2MediumHigh
H2A process self-identifies as a kernel worker thread (kworker/u:N:N) inside real process-execution telemetry — kernel threads are never captured this way, so any hit is inherently anomalous.T1036.004ProcessRollup2 / SyntheticProcessRollup2LowHigh
H3An ELF binary is written to one of the specific disguise paths (fontconfig cache, chrony-style temp dir, gvfsd-style paths) documented by the discoverer.T1036.005, T1105ELFFileWrittenLowHigh
H4The cron daemon is invoked (or crontab is modified) by a web/app-server-family parent process — persistence being installed by the compromised application tier itself.T1053.003ProcessRollup2 / SyntheticProcessRollup2LowHigh
H5The endpoint makes an outbound network connection to a known StyleSmuggler C2/malware-hosting IP.T1071, T1571, T1001.003NetworkConnectIP4LowHigh
H6The endpoint resolves a known StyleSmuggler C2/malware-hosting domain.T1071.004DnsRequestLowHigh
H7A PHP-FPM/web-server worker process spawns a shell or common recon/transfer tool — the classic web-shell-RCE tell, independent of how the shell file was written to disk.T1505.003, T1059.004ProcessRollup2 / SyntheticProcessRollup2MediumHigh
H8The application layer shows an anomalous volume of "Payment Transaction Failed Reminder" template renders or GraphQL requests carrying PHP content in the Store header — the exploitation trigger and the secondary actor's recon technique respectively.T1190, T1595None (app/WAF log only — see §7 gap)MediumMedium

Attack chain

StepTelemetryHunt Angle
1. Initial access — unauthenticated HTTP request smuggles PHP into Magento's template engine via a styles propertyWAF / CDN / app access log (no Falcon endpoint event — see §5 gap)Retrospective log review for the September 4–7 exposure window; virtual-patch WAF rule as a stop-gap
2. Trigger — attacker forces render of the standard "Payment Transaction Failed Reminder" email template; PHP executes via a dependency-injection file-include of attacker-poisoned contentMagento var/report/ logs, x_trace_ stringsNative log grep (§7); succeeds even if outbound mail delivery fails
3a. Payload A — Rust backdoor dropped and renamed to masquerade as a system process, cron persistence installedProcessRollup2, ELFFileWritten, cronH1–H4, Q1–Q4
3b. Payload B (independent actor) — 485-byte PHP dropper writes a header-gated web shell into pub/media/catalog/product/cache/File integrity / native find sweep (no typed Falcon file-write event for plain PHP — see §5 gap)§7 native hunt; H7/Q7 catches shell execution, not creation
4. Command and control — backdoor beacons every 60s over UDP/123 disguised as NTP to a small IP/domain setNetworkConnectIP4, DnsRequestH5, H6, Q5, Q6
5. Post-exploitation — secrets exposure (encryption key, admin/DB/API/payment/SSH credentials) reachable from the compromised app-server processNot directly observable in endpoint telemetry — credential-rotation and secret-scope review§14 Containment; hardening §12
04

Consolidated IOC Table

TypeValueConfidenceActionContextExpiry
IPv499.84.67.186High (2 sources)detectRust backdoor C2, TCP/4432027-03-08
IPv4185.157.160.251High (3 sources)detectC2 disguised as NTP reply, UDP/1232027-03-08
IPv4209.141.43.95Medium (1 source)detectMalware-hosting IP2027-03-08
Domainwindwsecurity.runHigh (1 primary source)detectRust backdoor C2 domain2027-03-08
Domainntp.timesync.toHigh (1 primary source)detectC2 disguised as NTP time-sync domain2027-03-08
Domain247.cdnflare.xyzMedium (1 source)detectMalware-hosting domain2027-03-08
IPv4 (recon, perishable)88.216.72.181, 182.182.152.48, 76.31.99.207, 209.73.130.148, 77.239.124.107LowenrichExploitation-attempt source IPs seen hitting the vulnerable endpoint; treat as a short-lived watch list, not campaign infrastructure2026-10-08
Hash (SHA256)REPLACE_WITH_SHA256N/A — placeholderpivotRust backdoor sample (fc-cache/chronyd variant) — no hash value was present in any fetched source snapshot
Hash (SHA256)REPLACE_WITH_SHA256N/A — placeholderpivot485-byte PHP web-shell dropper — no hash value was present in any fetched source snapshot
Process name (behavioral)[kworker/u:8:0], fc-cache, chronyd, gvfsdHighhuntMasquerade names used by the Rust backdoor across observed builds2027-03-08
File path (behavioral)~/.cache/fontconfig/fc-cache, /tmp/.chrony-<8hex>/chronyd, ~/.local/share/.gvfsd/, /tmp/.gvfsd-*, /tmp/.kw_*, /tmp/.cache_*, /tmp/.fc-*/fc-cache, /tmp/fc-cacheHighhuntBackdoor drop/persistence locations2027-03-08
Cron schedule (behavioral)13,43 * * * *HighhuntBackdoor cron persistence entry (fc-cache build)2027-03-08
File path pattern (behavioral)pub/media/catalog/product/cache/ss_<10hex>/sync_<10hex>.phpHighhuntPHP web-shell drop location (independent secondary actor)2027-03-08
HTTP header (behavioral)X-Cache-TokenHighhuntRequired header to activate the web shell's PHP-execution POST parameter2027-03-08
05

Affected Surface & Telemetry Matrix

SurfaceRequired TelemetryPriorityGap Risk
Magento Open Source / Adobe Commerce / Adobe Commerce B2B application servers (Linux, PHP-FPM + web server, versions 2.4.4–2.4.9 / B2B 1.3.3–1.5.3)Falcon Linux sensor: ProcessRollup2, SyntheticProcessRollup2, ELFFileWritten, NetworkConnectIP4, DnsRequestCritical — public internet-facing, CVSS 10.0, exploited in the wild pre-patchLow for post-exploitation behavior; see app-layer gap below
HTTP/application layer — the template-injection request itself and GraphQL recon requests carrying PHP in the Store headerWAF / CDN / reverse-proxy access logs; Magento var/report/ and var/log/ application logsCritical for retrospective compromise review of the pre-patch exposure windowGAP — Falcon endpoint telemetry does not see raw HTTP request content; this surface requires WAF/CDN/app-log ingestion (native hunt, §7) rather than CQL
Web-shell drop location (pub/media/catalog/product/cache/)File integrity monitoring / periodic filesystem sweep; ProcessRollup2 for shell executionHighPartial — Falcon's typed file-write events (PeFileWritten, ELFFileWritten, ZipFileWritten, etc.) do not cover plain-text PHP file creation, so shell drop is not directly observable via CQL; shell execution is (H7/Q7)
Encryption keys, admin/DB/API/payment/SSH credentials reachable from the app-server processSecrets-management / credential-rotation audit trail (not Falcon endpoint telemetry)Critical for any store confirmed or suspected exposed 2026-09-04 through patch dateNot observable retroactively via EDR — must be assumed compromised and rotated for any exposed store (§14)
06

ATT&CK Mapping

TacticTechniqueTechnique NameObserved Behavior
Initial AccessT1190Exploitation of Public-Facing ApplicationUnauthenticated PHP code injection into Magento's template engine via a styles property, reaching a dependency-injection file-include path
PersistenceT1053.003Scheduled Task/Job: CronRust backdoor installs a cron entry (13,43 * * * *) to relaunch itself twice hourly
Defense EvasionT1036.004 / T1036.005Masquerading: Masquerade Task or Service / Match Legitimate Name or LocationBackdoor renamed to [kworker/u:8:0], fc-cache, chronyd, or gvfsd and dropped into fontconfig/chrony/gvfsd-style paths
Defense EvasionT1001.003Data Obfuscation: Protocol or Service ImpersonationC2 traffic crafted as 48-byte UDP packets disguised as NTP replies
Command and ControlT1071 / T1571Application Layer Protocol / Non-Standard PortBeacons every 60 seconds to C2 IPs/domains over UDP/123 (disguised NTP) and TCP/443
Persistence (secondary actor)T1505.003Server Software Component: Web Shell485-byte PHP dropper writes a header-gated web shell into pub/media/catalog/product/cache/
ExecutionT1059.004Command and Scripting Interpreter: Unix ShellWeb shell executes attacker-supplied PHP/shell commands when the required X-Cache-Token header is present
Reconnaissance (inferred)T1595Active ScanningGraphQL POST requests carrying PHP code in the Store header; OAST callbacks used to confirm blind execution
Credential Access (inferred)T1552Unsecured CredentialsPost-RCE exposure of Magento encryption keys and application/DB/API/payment/SSH credentials, per Adobe's own rotate-everything guidance

TTPs marked (inferred) are analyst mappings from the described behavior to the closest ATT&CK technique; the cited sources describe the behavior but did not themselves cite a technique ID for that specific line.

07

Native Audit-Log Hunts

These are non-CQL checks — run directly on the Magento/Linux host or via your log-management tool — for the surfaces CQL cannot reach (raw HTTP content, plain-text PHP file writes, patch status). Commands are reproduced from Sansec's own published detection guidance (source snapshot 01) and are detection/hunt commands only — no exploit or weaponization code.

Patch status verification

vendor/bin/magento-patches -n status | grep "39341\|Status"

Backdoor process, path, and persistence sweep

crontab -l | grep -i gvfsd
ls -la ~/.local/share/.gvfsd/ ~/.cache/fontconfig/fc-cache /tmp/.kw_* /tmp/.cache_* /tmp/.gvfsd-* /tmp/.fc-*/fc-cache /tmp/fc-cache /tmp/.chrony-*/chronyd 2>/dev/null
ps -eo pid,comm,args | grep -iE 'kworker|fc-cache|chronyd'

Template-injection / exploitation-attempt log review

grep -r 'crontab command not allowed' /var/log/
grep -ril 'x_trace_' var/report/

A hit on x_trace_ strings inside var/report/ or the "crontab command not allowed" string in system logs indicates the exploit chain was attempted or succeeded against this host — treat as a compromise indicator requiring the §14 containment runbook, not just a tuning note.

Web-shell drop sweep

find pub/media -name '*.php'

Any result is anomalous — pub/media/ is an asset-serving directory and should never legitimately contain executable PHP. Combine with a check of each hit's mtime against the store's last-known-clean deployment date. If the web server config change in Playbook Step 3 (§13) is already deployed, follow up by confirming these files also cannot execute (HTTP 403/404 on direct request) rather than only checking for their existence.

Application-layer / WAF log hunt (fills the §5 telemetry gap)

  • Search reverse-proxy/CDN/WAF access logs for a spike in requests that trigger Magento's Payment Transaction Failed Reminder template render, especially from IPs with no matching legitimate checkout/order history.
  • Search the same logs for GraphQL POST requests where the Store header contains PHP syntax (e.g. <?php, eval(, system() rather than a normal store-view code.
  • Search for inbound requests carrying an X-Cache-Token header to any URL under pub/media/catalog/product/cache/ — legitimate asset requests never require this header.
  • Cross-reference source IPs against the perishable recon watch-list in §4/§10 (88.216.72.181, 182.182.152.48, 76.31.99.207, 209.73.130.148, 77.239.124.107); a hit narrows the retrospective review window.
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · Rust Backdoor Process Masquerade (fc-cache / chronyd / gvfsd)
CONF HIGHFP MEDCOST LOW

Looks for: a process named fc-cache, chronyd, or gvfsd spawned by a web/app-server-family parent — never a legitimate spawn path for those binaries. FP: fc-cache is a real fontconfig utility; a build/deploy pipeline or font-management tool can legitimately invoke it under a non-web parent.

// HUNT: StyleSmuggler Rust Backdoor Process Masquerade
// MITRE: T1036.004, T1036.005
// CONF: high  FP: medium  COST: low
// REQUIRES: Falcon Linux sensor, ProcessRollup2/SyntheticProcessRollup2
// FALSE POSITIVES: legitimate fc-cache invocations from package post-install scripts, font managers, or PDF/print pipelines
// TUNING: exclude fc-cache/chronyd/gvfsd spawned by dpkg, rpm, apt, yum, systemd, or a recognized package post-install/build-agent parent -- a php-fpm/httpd/apache2/nginx/www-data/shell parent is never legitimate for these binaries
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^(fc-cache|chronyd|gvfsd)$/i
| ParentBaseFileName=/^(php-fpm[0-9.]*|php-cgi|httpd|apache2|nginx|www-data|sh|bash|dash)$/i
| table([@timestamp, aid, ComputerName, FileName, ImageFileName, ParentBaseFileName, CommandLine, UserName])
Q2 · Fake Kernel-Worker Process (kworker masquerade)
CONF HIGHFP LOWCOST LOW

Looks for: a userland process execution event that self-identifies as a kernel worker thread (kworker/u:N:N). FP: genuine kernel worker threads are scheduled inside the kernel and are never captured as an exec'd, monitored process — any hit here is inherently anomalous.

// HUNT: StyleSmuggler Fake Kernel-Worker Process
// MITRE: T1036.004
// CONF: high  FP: low  COST: low
// REQUIRES: Falcon Linux sensor, ProcessRollup2/SyntheticProcessRollup2
// FALSE POSITIVES: none expected -- real kernel worker threads are never exec'd as a monitored process
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| CommandLine = *kworker/u:*
| table([@timestamp, aid, ComputerName, FileName, ImageFileName, ParentBaseFileName, CommandLine, UserName])
Q3 · ELF Binary Written to Backdoor Disguise Paths
CONF HIGHFP LOWCOST LOW

Looks for: a new ELF executable written into the fontconfig, chrony, or gvfsd-style disguise paths documented by the discoverer. FP: low — these are not standard install locations for real fontconfig/chrony/gvfsd binaries.

// HUNT: StyleSmuggler Backdoor ELF Drop to Disguise Path
// MITRE: T1036.005, T1105
// CONF: high  FP: low  COST: low
// REQUIRES: Falcon Linux sensor, ELFFileWritten
// FALSE POSITIVES: none expected -- real fontconfig cache files are hash-named, not literally "fc-cache"; real chronyd/gvfsd ship from package paths, not /tmp
#event_simpleName=ELFFileWritten
| (TargetFileName = */.cache/fontconfig/fc-cache* or TargetFileName = */.local/share/.gvfsd/* or TargetFileName = */tmp/.chrony-* or TargetFileName = */tmp/.gvfsd-* or TargetFileName = */tmp/.kw_* or TargetFileName = */tmp/.cache_* or TargetFileName = */tmp/.fc-** or TargetFileName = */tmp/fc-cache*)
| table([@timestamp, aid, ComputerName, TargetFileName, SHA256HashData, ContextBaseFileName, UserName])
Q4 · Cron Persistence Installed by a Web-Server-Family Parent
CONF HIGHFP LOWCOST LOW

Looks for: the crontab binary invoked by a PHP-FPM/web-server-family parent — the application tier installing its own persistence. FP: low — a web/app server process legitimately touching crontab is very unusual.

// HUNT: StyleSmuggler Cron Persistence via Web-Server Parent
// MITRE: T1053.003
// CONF: high  FP: low  COST: low
// REQUIRES: Falcon Linux sensor, ProcessRollup2/SyntheticProcessRollup2
// FALSE POSITIVES: none expected -- legitimate crontab management runs from admin shells or configuration-management agents, not from php-fpm/httpd/nginx
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^crontab$/i
| ParentBaseFileName=/^(php-fpm[0-9.]*|php-cgi|httpd|apache2|nginx|www-data|sh|bash|dash)$/i
| table([@timestamp, aid, ComputerName, FileName, CommandLine, ParentBaseFileName, UserName])
Q5 · Network Connection to Known StyleSmuggler C2 Infrastructure
CONF HIGHFP LOWCOST LOW

Looks for: an outbound connection to one of the published StyleSmuggler C2/malware-hosting IPs. FP: low — exact IOC match against attacker infrastructure.

// HUNT: StyleSmuggler C2 Network Connection
// MITRE: T1071, T1571, T1001.003
// CONF: high  FP: low  COST: low
// REQUIRES: Falcon Linux sensor, NetworkConnectIP4
// FALSE POSITIVES: none expected -- exact match against published campaign infrastructure; rotate this IOC list on a 30-90 day cycle as C2 infra churns
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["99.84.67.186","185.157.160.251","209.141.43.95"])
| table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4, UserName])
Q6 · DNS Resolution of Known StyleSmuggler C2 Domains
CONF HIGHFP LOWCOST LOW

Looks for: DNS requests for the published C2/malware-hosting domains. FP: low — exact IOC match.

// HUNT: StyleSmuggler C2 Domain Resolution
// MITRE: T1071.004
// CONF: high  FP: low  COST: low
// REQUIRES: Falcon Linux sensor, DnsRequest
// FALSE POSITIVES: none expected -- exact match against published campaign infrastructure; rotate this IOC list as domains churn
#event_simpleName=DnsRequest
| DomainName=/^(windwsecurity\.run|ntp\.timesync\.to|247\.cdnflare\.xyz)$/i
| table([@timestamp, aid, ComputerName, DomainName, ContextProcessId, UserName])
Q7 · Web-Server Worker Spawning a Shell or Recon/Transfer Tool (Web-Shell RCE Indicator)
CONF HIGHFP MEDCOST LOW

Looks for: a PHP-FPM/web-server worker process spawning a shell or a common recon/transfer binary — the classic web-shell-RCE tell that fires regardless of how or where the shell file was written to disk. FP: some Magento/Adobe Commerce media-processing and deployment tooling legitimately shells out.

// HUNT: StyleSmuggler Web Shell RCE Indicator (Web-Server Spawns Shell)
// MITRE: T1505.003, T1059.004
// CONF: high  FP: medium  COST: low
// REQUIRES: Falcon Linux sensor, ProcessRollup2/SyntheticProcessRollup2
// FALSE POSITIVES: Magento/Adobe Commerce media-processing tools (ImageMagick convert, ffmpeg) and deployment tooling (git, composer, n98-magerun) legitimately shell out from a PHP-FPM/httpd worker
// TUNING: exclude known legitimate Magento/Adobe Commerce shell-outs -- convert, ffmpeg, git, composer, n98-magerun, and CI/CD deploy hooks running under a recognized service account -- before promoting this to a blocking rule
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(php-fpm[0-9.]*|php-cgi|httpd|apache2|nginx)$/i
| FileName=/^(sh|bash|dash|curl|wget|id|whoami|uname|python3?|perl|nc|ncat|socat)$/i
| table([@timestamp, aid, ComputerName, ParentBaseFileName, FileName, CommandLine, UserName])
09

CrowdStrike Custom IOA Recommendations

Custom IOAs fire in real time on the same behaviors Q1–Q7 hunt for historically. Start every rule in Detect mode; promote to Block only after a measured FP rate below 5% on a canary sensor group for 14+ days, per the standing prevention-promotion policy.

IOA NameRule TypePattern (source query)Deployment Path
StyleSmuggler — Backdoor Process MasqueradeProcess CreationImage Filename: .*\/(fc-cache|chronyd|gvfsd)$; Parent Image Filename: .*\/(php-fpm.*|httpd|apache2|nginx|sh|bash)$ (from Q1)Detect first; low collateral-damage risk once fc-cache/gvfsd legitimate-use exclusions are confirmed absent from the web-server process tree
StyleSmuggler — Fake Kernel-Worker ProcessProcess CreationCommand Line: .*kworker/u:.* (from Q2)Safe to promote to Block quickly — no legitimate exec matches this pattern
StyleSmuggler — C2 Network ConnectionNetwork ConnectionRemote Address in [99.84.67.186, 185.157.160.251, 209.141.43.95] (from Q5)Safe to promote to Block — exact IOC match; refresh the list as C2 infra churns
StyleSmuggler — C2 Domain ResolutionDNS RequestDomain in [windwsecurity.run, ntp.timesync.to, 247.cdnflare.xyz] (from Q6)Safe to promote to Block — exact IOC match
StyleSmuggler — Web-Server Spawns ShellProcess CreationParent Image Filename: .*\/(php-fpm.*|httpd|apache2|nginx)$; Image Filename: .*\/(sh|bash|curl|wget)$ (from Q7)Detect-only until the media-processing/deploy-tool exclusion list (Q7 TUNING) is confirmed against your environment's actual process tree
10

Machine-Readable IOC Appendix

Grouped, one-click blocks for import or reference. Every atomic value here traces to a saved source snapshot in Magento-StyleSmuggler-CVE-2026-75650-Hunt-sources/.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
ipv4,99.84.67.186,detect,critical,2027-03-08,StyleSmuggler Rust backdoor C2 (TCP/443),campaign:StyleSmuggler
ipv4,185.157.160.251,detect,critical,2027-03-08,StyleSmuggler C2 disguised as NTP (UDP/123),campaign:StyleSmuggler
ipv4,209.141.43.95,detect,high,2027-03-08,StyleSmuggler malware-hosting IP,campaign:StyleSmuggler
domain,windwsecurity.run,detect,critical,2027-03-08,StyleSmuggler Rust backdoor C2 domain,campaign:StyleSmuggler
domain,ntp.timesync.to,detect,critical,2027-03-08,StyleSmuggler C2 disguised as NTP time-sync domain,campaign:StyleSmuggler
domain,247.cdnflare.xyz,detect,high,2027-03-08,StyleSmuggler malware-hosting domain,campaign:StyleSmuggler
ipv4,88.216.72.181,enrich,low,2026-10-08,StyleSmuggler exploitation-attempt source IP (perishable),campaign:StyleSmuggler
ipv4,182.182.152.48,enrich,low,2026-10-08,StyleSmuggler exploitation-attempt source IP (perishable),campaign:StyleSmuggler
ipv4,76.31.99.207,enrich,low,2026-10-08,StyleSmuggler exploitation-attempt source IP (perishable),campaign:StyleSmuggler
ipv4,209.73.130.148,enrich,low,2026-10-08,StyleSmuggler exploitation-attempt source IP (perishable),campaign:StyleSmuggler
ipv4,77.239.124.107,enrich,low,2026-10-08,StyleSmuggler exploitation-attempt source IP (perishable),campaign:StyleSmuggler
sha256,REPLACE_WITH_SHA256,prevent,critical,2027-03-08,StyleSmuggler Rust backdoor sample (fc-cache/chronyd variant) -- hash not published in any cited source; populate from your own eComscan/YARA sweep,campaign:StyleSmuggler
sha256,REPLACE_WITH_SHA256,prevent,critical,2027-03-08,StyleSmuggler PHP web-shell dropper (485-byte) -- hash not published in any cited source; populate from your own file sweep,campaign:StyleSmuggler
Behavioral Signatureshunt / EDR rule input
# Masquerade process names (Rust backdoor)
[kworker/u:8:0]
fc-cache
chronyd
gvfsd

# Disguise / drop paths
~/.cache/fontconfig/fc-cache
/tmp/.chrony-<8hex>/chronyd
~/.local/share/.gvfsd/
/tmp/.gvfsd-*
/tmp/.kw_*
/tmp/.cache_*
/tmp/.fc-*/fc-cache
/tmp/fc-cache

# Cron persistence schedule
13,43 * * * *

# Web shell path pattern (independent secondary actor)
pub/media/catalog/product/cache/ss_<10hex>/sync_<10hex>.php

# Required header to activate the web shell
X-Cache-Token
Named Malware / Toolingreference
Vulnerability:      CVE-2026-75650 ("StyleSmuggler")
CWE:                CWE-1336 (Improper Neutralization of Special
                    Elements Used in a Template Engine)
CVSS:               10.0 (Critical)
Payload A:          Unnamed Rust-based Linux backdoor
                    (masquerades as fc-cache / chronyd / gvfsd / kworker)
Payload B:          Unnamed PHP web-shell dropper (485 bytes),
                    independent/unrelated threat actor
Discoverer:         Sansec
Bulletin:           Adobe APSB26-146 (Priority 1)
Hotfix:             VULN-39341 (VULN-39341-composer-patches.zip,
                    repo.magento.com)
Patch / Audit Checklistverification
# 1. Confirm VULN-39341 is applied
vendor/bin/magento-patches -n status | grep "39341\|Status"

# 2. Confirm affected version is out of range
#    Adobe Commerce / B2B / Magento Open Source: 2.4.4-2.4.9
#    (fixed by the VULN-39341 hotfix, not a version bump)

# 3. Confirm credential rotation completed post-patch
#    - Magento encryption key (bin/magento encryption:key:regenerate)
#    - Admin passwords, integration tokens, API keys
#    - Payment gateway credentials, DB credentials, SSH keys

# 4. Confirm no PHP files exist under pub/media
find pub/media -name '*.php'
11

Detection Validation Gates

GateRequirementStatus / Notes
Telemetry readyFalcon Linux sensor deployed on all Magento/Adobe Commerce app servers with ProcessRollup2, ELFFileWritten, NetworkConnectIP4, and DnsRequest enabledVerify sensor policy before relying on Q1–Q7; app servers are frequently a coverage gap versus general fleet endpoints
Benign baselineRun Q1 and Q7 in a wide time window first to catalog any legitimate fc-cache/shell-out activity in your environment before adding the TUNING exclusionsRequired before promoting Q1/Q7 to a Custom IOA in Block mode
Positive testOn an isolated/canary Linux host, confirm Q2 fires by executing a benign process with argv[0] or command line containing the literal string kworker/u:8:0 (e.g. exec -a "kworker/u:8:0" /bin/sleep 5) — never deploy or execute the actual malware sampleNot yet run — schedule in a test environment
PromotionQ2, Q5, Q6 are safe to promote to Prevent quickly (exact/behavioral match with no legitimate collateral); Q1, Q4, Q7 require a 14-day Detect-mode canary period with measured FP < 5% firstFollow the standard rollout: canary group (10–20 endpoints) → 48hr review → full fleet
12

Hardening — Tiered

Primary Mitigations: M1051 (Update Software), M1040 (Behavior Prevention on Endpoint), M1037 (Filter Network Traffic), M1031 (Network Intrusion Prevention), M1022 (Restrict File and Directory Permissions), M1047 (Audit). Platforms in scope: the Linux/PHP application tier hosting Magento/Adobe Commerce, and the network egress path from that tier — this threat does not touch Windows/AD or a specific cloud IdP, so no controls are included for those surfaces.

Immediate — deploy this week
  • Apply Adobe hotfix VULN-39341 — the vendor patch, per Adobe bulletin APSB26-146 (Priority 1). Framework: M1051 (Update Software), vendor PSIRT advisory (highest-authority citation available for a zero-day).
  • Rotate the Magento encryption key and every credential it protects (admin passwords, integration tokens, API keys, payment gateway credentials, DB credentials, SSH keys) — required by Adobe's own bulletin for any store that was internet-reachable before the hotfix. Framework: M1027 (Password Policies) + vendor PSIRT advisory.
  • Block PHP execution under pub/media/ at the web-server layer — a one-line config change that neutralizes the independent web-shell actor's drop location regardless of whether the underlying RCE is otherwise patched. Framework: M1022 (Restrict File and Directory Permissions), ⚠ best-practice, no formal CIS/DISA line item for this Magento-specific path (no formal benchmark exists for Adobe Commerce specifically; vendor community best-practice).
Near term — 1 to 4 weeks
  • Disable dangerous PHP functions (exec, shell_exec, system, passthru, proc_open, popen, pcntl_exec) on the web-facing PHP-FPM pool specifically — removes the shell-out step Q7 hunts for, at the cost of needing to pilot against any legitimate extension that shells out (media processing, deploy hooks). Keep a separate CLI/cron-context pool with these enabled if your indexers or n98-magerun tooling requires them. Framework: M1040 (Behavior Prevention on Endpoint), CIS-style least-privilege PHP hardening (⚠ best-practice, no formal CIS Magento/PHP-FPM benchmark exists).
  • Egress-filter the application tier — block outbound UDP/123 to anything but an explicit allow-listed NTP server set, and block outbound to the published C2 IPs (§10). This directly defeats the disguised-NTP beacon even against a not-yet-published C2 IP that reuses the same technique. Framework: M1037 (Filter Network Traffic), M1031 (Network Intrusion Prevention).
  • Deploy a scheduled file-integrity sweep of pub/media for PHP files and of the fc-cache/chrony/gvfsd disguise paths (§7 commands) — catches drops that predate this pack's IOCs. Framework: M1047 (Audit).
Long-term / Strategic — 1 to 3 months
  • Move the application tier to a read-only root filesystem / immutable container image for the web-serving layer, so a web-shell or backdoor drop cannot persist across a redeploy. Framework: M1022, CIS Docker/Kubernetes Benchmark practices if containerized (⚠ best-practice for a bare-metal/VM deployment with no formal benchmark).
  • Extend Falcon (or equivalent EDR) + NG-SIEM log ingestion to every internet-facing Magento/Adobe Commerce app server, including WAF/CDN access logs, closing the §5 application-layer telemetry gap for the next template-engine-class zero-day. Framework: M1047 (Audit), NIST SP 800-53 AU-family logging controls.
  • Stand up a WAF virtual-patching program fed by vendor advisories, so future Adobe Commerce zero-days get a stop-gap rule before a hotfix ships — this specific incident had a 3-day exploited-but-unpatched window. Framework: M1050 (Exploit Protection).
13

Deployable Playbooks

Step 1 — Apply Adobe Hotfix VULN-39341

Prerequisites: Composer-based Adobe Commerce / Magento Open Source install with network access to repo.magento.com; a recent backup of composer.lock and the database. Reboot required: No (PHP-FPM / web-server reload only).

# Download and apply via the Magento Quality Patches Tool / composer patch package
composer require --dev magento/quality-patches
bin/magento community:catalog-events:hydrate 2>/dev/null # (no-op placeholder if not applicable to your edition)
# Or apply the composer patch bundle directly per Adobe's bulletin instructions:
curl -O https://repo.magento.com/patch/VULN-39341-composer-patches.zip
unzip VULN-39341-composer-patches.zip -d ./patches/
vendor/bin/magento-patches apply VULN-39341

Verify:

vendor/bin/magento-patches -n status | grep "39341\|Status"

Rollback: Restore the pre-patch composer.lock backup and run composer install from it, then reload PHP-FPM/web server. Keep the backup until the patch has run in production for at least one full business cycle.

Step 2 — Rotate the Encryption Key and Protected Credentials

Prerequisites: Magento CLI (bin/magento) access; a brief maintenance window for cache flush and re-encryption of sensitive data. Reboot required: No — brief application-level downtime recommended during re-encryption.

php bin/magento encryption:key:regenerate --tag
php bin/magento cache:flush
# Then rotate out-of-band: admin passwords, integration tokens/API keys,
# payment gateway credentials, database credentials, and SSH keys reachable
# from the application host.

Verify: Confirm the store loads and checkout/admin login succeed post-rotation; confirm the old key is retired (not reused) in your secrets vault.

Rollback: none required — rotating a potentially-compromised key forward is the safe direction. Retain the prior key only in secure offline storage in case decryption of pre-rotation backups is later required; never revert to it for live use.

Step 3 — Block PHP Execution Under pub/media

Prerequisites: Admin/sudo access to the nginx or Apache configuration fronting Magento; ability to reload the web server. Reboot required: No (web-server reload only).

# nginx
location ~* ^/(pub/)?media/.*\.php$ {
    deny all;
    return 403;
}

# Apache (httpd.conf or .htaccess under pub/media)
<FilesMatch "\.php$">
    Require all denied
</FilesMatch>

Verify:

curl -s -o /dev/null -w "%{http_code}\n" https://YOUR-STORE-DOMAIN/media/catalog/product/cache/x/y/test.php
# Expect 403 or 404, never 200

Rollback: Remove the added location/FilesMatch block and reload the web server. Legitimate (non-PHP) media serving is unaffected in either direction — this control never blocks anything the store legitimately needs.

Step 4 — Disable Dangerous PHP Functions on the Web-Facing FPM Pool

Prerequisites: Ability to separate the web-facing PHP-FPM pool from any CLI/cron pool that needs shell-out functions (indexers, n98-magerun); test in staging first. Reboot required: No (PHP-FPM pool reload).

# In the web pool's .conf (e.g. /etc/php/8.x/fpm/pool.d/www.conf)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen,pcntl_exec

Verify:

php-fpm8.x -t && systemctl reload php8.x-fpm
# From a web-triggered diagnostic (never expose this publicly):
php -r "var_dump(function_exists('exec'));"   # expect bool(false) for the web pool

Rollback: Remove the disable_functions line from the pool config (or restore the prior pool .conf backup) and reload PHP-FPM.

Step 5 — Egress-Filter the Application Tier

Prerequisites: Host or network firewall (iptables/nftables/security-group) fronting the Magento app servers; a documented allow-list of legitimate outbound NTP servers and required destinations. Reboot required: No.

# nftables example
nft add rule inet filter output udp dport 123 ip daddr != { 192.0.2.10, 192.0.2.11 } drop
nft add rule inet filter output ip daddr { 99.84.67.186, 185.157.160.251, 209.141.43.95 } drop

Verify:

# From the app host, confirm a non-allow-listed UDP/123 destination is dropped
nc -u -w2 203.0.113.5 123 <<< "test" ; echo "exit: $?"
# Check firewall counters/logs for the added rules

Rollback: Remove/disable the added firewall rules by handle/ID (nft delete rule ...) to restore the prior egress posture.


Deploying via your RMM

The snippets above are raw shell/config. To wrap them for fleet deployment (admin check, error handling, custom-field writeback for compliance tracking), hand them to your RMM deployment tooling and ask for a deployable package.

14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-isolate the affected app server via Falcon host containment or firewall ACL; preserve the running process list and open network connections before killing anything; snapshot the disk/filesystem for forensicsIR / SOC on-callps -eo pid,ppid,comm,args output, ss -tunap / netstat output, disk snapshot
EradicateTerminate masquerading processes (kworker/fc-cache/chronyd/gvfsd variants); remove cron entries matching 13,43 * * * * or referencing the disguise paths; delete confirmed web-shell files under pub/media/; do not assume deletion alone is sufficient — malware in this campaign has relocated outside the webroot and recreated persistence after removal, so re-run the §7 sweep after cleanupIR / Linux/App adminBefore/after crontab -l, before/after §7 sweep output, deleted-file manifest
RecoverApply VULN-39341 if not already applied; rotate the encryption key and every protected credential (§13 Step 2); rebuild the app server from a known-good image rather than trusting an in-place clean; re-enable traffic only after the §11 validation gates pass on the rebuilt hostIR / Platform engineeringPatch status output, credential-rotation log, clean §7 sweep result, passing validation-gate checklist

Any internet-facing store reachable between 2026-09-04 and hotfix application is in scope for this runbook even if it currently shows no active indicators — the exploit predates public detection content, so absence of an alert does not establish absence of compromise.

15

Detection Coverage Map

MITRE TechniqueTechnique NameCQL QueryCustom IOAIOC BlockCoverage
T1190Exploitation of Public-Facing ApplicationGAP
T1036.004/.005Masquerading✓ Q1, Q2✓ IOA-1, IOA-2Good
T1105Ingress Tool Transfer✓ Q3Partial
T1053.003Scheduled Task/Job: Cron✓ Q4Partial
T1071 / T1571 / T1001.003Application Layer Protocol / Non-Standard Port / Protocol Impersonation✓ Q5✓ IOA-3✓ IPsGood
T1071.004DNS✓ Q6✓ IOA-4✓ DomainsGood
T1505.003Server Software Component: Web Shell— (drop not observable; §7 native sweep only)Partial
T1059.004Command and Scripting Interpreter: Unix Shell✓ Q7✓ IOA-5Partial
T1595Active Scanning (GraphQL recon)— (WAF/app-log only)GAP
T1552Unsecured CredentialsGAP

Coverage Summary: 6 of 10 identified techniques have at least partial detection coverage via CQL/IOA/IOC; 3 remain GAPs.

Priority Gaps: T1190 (the initial exploitation request itself) and T1595 (GraphQL header-based recon) are invisible to Falcon endpoint telemetry — Falcon does not inspect raw HTTP request content. Close these via WAF/CDN log ingestion and the §7 native application-log hunts, not CQL. T1552 (credential exposure) is not directly observable after the fact via EDR and must be handled as a blanket rotation requirement (§13 Step 2, §14 Recover) for any store confirmed or suspected exposed during the zero-day window.

Validation gates: see §11 for the telemetry-readiness, benign-baseline, positive-test, and promotion gates each query must pass before being relied on operationally or promoted to Prevent/Block.

16

Hunt Summary Ticket

TITLE:       StyleSmuggler / CVE-2026-75650 -- Magento & Adobe Commerce
             Unauthenticated Template-Injection RCE
SEVERITY:    CRITICAL (CVSS 10.0, exploited in the wild since 2026-09-04)
SCOPE:       All internet-facing Adobe Commerce / Adobe Commerce B2B /
             Magento Open Source instances on versions 2.4.4-2.4.9
             (B2B 1.3.3-1.5.3) not yet running hotfix VULN-39341
HYPOTHESIS:  If this environment was exploited, endpoint telemetry should
             show a masquerading Linux process (fc-cache/chronyd/gvfsd/
             kworker), cron persistence, and/or an outbound beacon
             disguised as NTP to a small published C2 set; independently,
             application logs may show a PHP web shell dropped under
             pub/media/catalog/product/cache/.
QUERIES:     Q1-Q7 (Section 8); native hunts (Section 7)
DO FIRST:    1. Apply VULN-39341            2. Run Section 7 native sweep
             3. Run Q1/Q2/Q5/Q6 (high-conf, low-FP, no tuning dependency)
FINDINGS:    [Queries must be run manually in Falcon LogScale by the
             analyst; this pack describes what a positive result looks
             like -- it does not claim any query has already fired.]
GAPS:        T1190 initial exploitation and T1595 GraphQL recon are not
             visible in Falcon endpoint telemetry (WAF/app-log only, see
             Section 15). No published SHA256 hashes exist in any source
             fetched for this pack -- Section 10 hash rows are labelled
             placeholders pending your own sweep.
ACTIONS:     Patch -> rotate credentials -> block PHP-in-pub/media ->
             run native + CQL hunts -> retrospective review of any store
             internet-reachable 2026-09-04 through patch date
OWNER:       [assign analyst/team]
VERSION:     v0.1 (2026-09-08)
17

Changelog

v0.12026-09-08Initial release. Five sources fetched and saved as verbatim snapshots; 7 CQL hunt queries, 5 Custom IOA recommendations, native audit-log hunts, hardening (Immediate/Near-term/Strategic), 5-step deployable playbook, containment runbook, and coverage map built against CVE-2026-75650 / StyleSmuggler.
18

References

TierSourceUsed ForAccess Date
T1Sansec — StyleSmuggler ResearchAttack mechanism, backdoor variants, C2 infrastructure, hunt/detection commands, timeline2026-09-08
T1Adobe — APSB26-146 Security BulletinAuthoritative CVE/version/hotfix data, required remediation steps2026-09-08
T2The Hacker NewsAffected-version corroboration, recency2026-09-08
T2CSO OnlineC2 IP corroboration (99.84.67.186), cron/NTP-disguise corroboration2026-09-08
T2SOC PrimeTwo-stage exploitation chain detail, web-shell path/header gating, IR checklist2026-09-08
T1MITRE ATT&CKTechnique ID reference for §6 mapping2026-09-08

Generated 2026-09-08 by HuntPack. All fetched source text was reviewed for injected/adversarial instructions before use; none were found. This pack is defensive-only: detection logic and hardening guidance, no offensive or exploit code.