Magento / Adobe Commerce “StyleSmuggler” — CVE-2026-75650
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.
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.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| T1 | Sansec — StyleSmuggler Research | Discoverer'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 |
| T1 | Adobe — 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 |
| T2 | The Hacker News | Recency + 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 |
| T2 | CSO Online | Independently corroborates C2 IP 99.84.67.186, cron-based persistence, and disguised-NTP/UDP-123 C2 traffic. | Yes |
| T2 | SOC Prime | Deepest 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.
Hunt Brief & Attack Chain
Hunt hypotheses
| # | Hypothesis | MITRE | Falcon Telemetry | Expected FP | Confidence |
|---|---|---|---|---|---|
| H1 | A 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/.005 | ProcessRollup2 / SyntheticProcessRollup2 | Medium | High |
| H2 | A 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.004 | ProcessRollup2 / SyntheticProcessRollup2 | Low | High |
| H3 | An 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, T1105 | ELFFileWritten | Low | High |
| H4 | The 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.003 | ProcessRollup2 / SyntheticProcessRollup2 | Low | High |
| H5 | The endpoint makes an outbound network connection to a known StyleSmuggler C2/malware-hosting IP. | T1071, T1571, T1001.003 | NetworkConnectIP4 | Low | High |
| H6 | The endpoint resolves a known StyleSmuggler C2/malware-hosting domain. | T1071.004 | DnsRequest | Low | High |
| H7 | A 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.004 | ProcessRollup2 / SyntheticProcessRollup2 | Medium | High |
| H8 | The 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, T1595 | None (app/WAF log only — see §7 gap) | Medium | Medium |
Attack chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
1. Initial access — unauthenticated HTTP request smuggles PHP into Magento's template engine via a styles property | WAF / 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 content | Magento var/report/ logs, x_trace_ strings | Native 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 installed | ProcessRollup2, ELFFileWritten, cron | H1–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 set | NetworkConnectIP4, DnsRequest | H5, H6, Q5, Q6 |
| 5. Post-exploitation — secrets exposure (encryption key, admin/DB/API/payment/SSH credentials) reachable from the compromised app-server process | Not directly observable in endpoint telemetry — credential-rotation and secret-scope review | §14 Containment; hardening §12 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| IPv4 | 99.84.67.186 | High (2 sources) | detect | Rust backdoor C2, TCP/443 | 2027-03-08 |
| IPv4 | 185.157.160.251 | High (3 sources) | detect | C2 disguised as NTP reply, UDP/123 | 2027-03-08 |
| IPv4 | 209.141.43.95 | Medium (1 source) | detect | Malware-hosting IP | 2027-03-08 |
| Domain | windwsecurity.run | High (1 primary source) | detect | Rust backdoor C2 domain | 2027-03-08 |
| Domain | ntp.timesync.to | High (1 primary source) | detect | C2 disguised as NTP time-sync domain | 2027-03-08 |
| Domain | 247.cdnflare.xyz | Medium (1 source) | detect | Malware-hosting domain | 2027-03-08 |
| IPv4 (recon, perishable) | 88.216.72.181, 182.182.152.48, 76.31.99.207, 209.73.130.148, 77.239.124.107 | Low | enrich | Exploitation-attempt source IPs seen hitting the vulnerable endpoint; treat as a short-lived watch list, not campaign infrastructure | 2026-10-08 |
| Hash (SHA256) | REPLACE_WITH_SHA256 | N/A — placeholder | pivot | Rust backdoor sample (fc-cache/chronyd variant) — no hash value was present in any fetched source snapshot | — |
| Hash (SHA256) | REPLACE_WITH_SHA256 | N/A — placeholder | pivot | 485-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, gvfsd | High | hunt | Masquerade names used by the Rust backdoor across observed builds | 2027-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-cache | High | hunt | Backdoor drop/persistence locations | 2027-03-08 |
| Cron schedule (behavioral) | 13,43 * * * * | High | hunt | Backdoor cron persistence entry (fc-cache build) | 2027-03-08 |
| File path pattern (behavioral) | pub/media/catalog/product/cache/ss_<10hex>/sync_<10hex>.php | High | hunt | PHP web-shell drop location (independent secondary actor) | 2027-03-08 |
| HTTP header (behavioral) | X-Cache-Token | High | hunt | Required header to activate the web shell's PHP-execution POST parameter | 2027-03-08 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap 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, DnsRequest | Critical — public internet-facing, CVSS 10.0, exploited in the wild pre-patch | Low 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 header | WAF / CDN / reverse-proxy access logs; Magento var/report/ and var/log/ application logs | Critical for retrospective compromise review of the pre-patch exposure window | GAP — 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 execution | High | Partial — 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 process | Secrets-management / credential-rotation audit trail (not Falcon endpoint telemetry) | Critical for any store confirmed or suspected exposed 2026-09-04 through patch date | Not observable retroactively via EDR — must be assumed compromised and rotated for any exposed store (§14) |
ATT&CK Mapping
| Tactic | Technique | Technique Name | Observed Behavior |
|---|---|---|---|
| Initial Access | T1190 | Exploitation of Public-Facing Application | Unauthenticated PHP code injection into Magento's template engine via a styles property, reaching a dependency-injection file-include path |
| Persistence | T1053.003 | Scheduled Task/Job: Cron | Rust backdoor installs a cron entry (13,43 * * * *) to relaunch itself twice hourly |
| Defense Evasion | T1036.004 / T1036.005 | Masquerading: Masquerade Task or Service / Match Legitimate Name or Location | Backdoor renamed to [kworker/u:8:0], fc-cache, chronyd, or gvfsd and dropped into fontconfig/chrony/gvfsd-style paths |
| Defense Evasion | T1001.003 | Data Obfuscation: Protocol or Service Impersonation | C2 traffic crafted as 48-byte UDP packets disguised as NTP replies |
| Command and Control | T1071 / T1571 | Application Layer Protocol / Non-Standard Port | Beacons every 60 seconds to C2 IPs/domains over UDP/123 (disguised NTP) and TCP/443 |
| Persistence (secondary actor) | T1505.003 | Server Software Component: Web Shell | 485-byte PHP dropper writes a header-gated web shell into pub/media/catalog/product/cache/ |
| Execution | T1059.004 | Command and Scripting Interpreter: Unix Shell | Web shell executes attacker-supplied PHP/shell commands when the required X-Cache-Token header is present |
| Reconnaissance (inferred) | T1595 | Active Scanning | GraphQL POST requests carrying PHP code in the Store header; OAST callbacks used to confirm blind execution |
| Credential Access (inferred) | T1552 | Unsecured Credentials | Post-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.
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
Storeheader contains PHP syntax (e.g.<?php,eval(,system() rather than a normal store-view code. - Search for inbound requests carrying an
X-Cache-Tokenheader to any URL underpub/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.
CrowdStrike LogScale CQL Hunt Queries
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])
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])
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])
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])
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])
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])
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])
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 Name | Rule Type | Pattern (source query) | Deployment Path |
|---|---|---|---|
| StyleSmuggler — Backdoor Process Masquerade | Process Creation | Image 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 Process | Process Creation | Command Line: .*kworker/u:.* (from Q2) | Safe to promote to Block quickly — no legitimate exec matches this pattern |
| StyleSmuggler — C2 Network Connection | Network Connection | Remote 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 Resolution | DNS Request | Domain in [windwsecurity.run, ntp.timesync.to, 247.cdnflare.xyz] (from Q6) | Safe to promote to Block — exact IOC match |
| StyleSmuggler — Web-Server Spawns Shell | Process Creation | Parent 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 |
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/.
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
# 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
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)
# 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'
Detection Validation Gates
| Gate | Requirement | Status / Notes |
|---|---|---|
| Telemetry ready | Falcon Linux sensor deployed on all Magento/Adobe Commerce app servers with ProcessRollup2, ELFFileWritten, NetworkConnectIP4, and DnsRequest enabled | Verify sensor policy before relying on Q1–Q7; app servers are frequently a coverage gap versus general fleet endpoints |
| Benign baseline | Run 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 exclusions | Required before promoting Q1/Q7 to a Custom IOA in Block mode |
| Positive test | On 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 sample | Not yet run — schedule in a test environment |
| Promotion | Q2, 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% first | Follow the standard rollout: canary group (10–20 endpoints) → 48hr review → full fleet |
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.
- 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).
- 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/mediafor PHP files and of the fc-cache/chrony/gvfsd disguise paths (§7 commands) — catches drops that predate this pack's IOCs. Framework: M1047 (Audit).
- 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).
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.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-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 forensics | IR / SOC on-call | ps -eo pid,ppid,comm,args output, ss -tunap / netstat output, disk snapshot |
| Eradicate | Terminate 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 cleanup | IR / Linux/App admin | Before/after crontab -l, before/after §7 sweep output, deleted-file manifest |
| Recover | Apply 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 host | IR / Platform engineering | Patch 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.
Detection Coverage Map
| MITRE Technique | Technique Name | CQL Query | Custom IOA | IOC Block | Coverage |
|---|---|---|---|---|---|
| T1190 | Exploitation of Public-Facing Application | — | — | — | GAP |
| T1036.004/.005 | Masquerading | ✓ Q1, Q2 | ✓ IOA-1, IOA-2 | — | Good |
| T1105 | Ingress Tool Transfer | ✓ Q3 | — | — | Partial |
| T1053.003 | Scheduled Task/Job: Cron | ✓ Q4 | — | — | Partial |
| T1071 / T1571 / T1001.003 | Application Layer Protocol / Non-Standard Port / Protocol Impersonation | ✓ Q5 | ✓ IOA-3 | ✓ IPs | Good |
| T1071.004 | DNS | ✓ Q6 | ✓ IOA-4 | ✓ Domains | Good |
| T1505.003 | Server Software Component: Web Shell | — (drop not observable; §7 native sweep only) | — | — | Partial |
| T1059.004 | Command and Scripting Interpreter: Unix Shell | ✓ Q7 | ✓ IOA-5 | — | Partial |
| T1595 | Active Scanning (GraphQL recon) | — (WAF/app-log only) | — | — | GAP |
| T1552 | Unsecured Credentials | — | — | — | GAP |
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.
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)
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| T1 | Sansec — StyleSmuggler Research | Attack mechanism, backdoor variants, C2 infrastructure, hunt/detection commands, timeline | 2026-09-08 |
| T1 | Adobe — APSB26-146 Security Bulletin | Authoritative CVE/version/hotfix data, required remediation steps | 2026-09-08 |
| T2 | The Hacker News | Affected-version corroboration, recency | 2026-09-08 |
| T2 | CSO Online | C2 IP corroboration (99.84.67.186), cron/NTP-disguise corroboration | 2026-09-08 |
| T2 | SOC Prime | Two-stage exploitation chain detail, web-shell path/header gating, IR checklist | 2026-09-08 |
| T1 | MITRE ATT&CK | Technique ID reference for §6 mapping | 2026-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.