CVE-2026-45247 — Mirasvit Full Page Cache Warmer (Magento / Adobe Commerce) Unauthenticated RCE
CacheWarmer cookie → unserialize() → Monolog gadget chain → remote code execution. Hunt the web host running Falcon.Executive Summary
What it is. CVE-2026-45247 is a critical (CVSS 9.8) unauthenticated remote-code-execution flaw in the Mirasvit "Full Page Cache Warmer" extension for Magento 2 / Adobe Commerce. The extension reads the attacker-controlled CacheWarmer HTTP cookie and passes it straight to PHP unserialize() with no allow-list on which classes may be instantiated. An attacker supplies a base64-encoded, crafted serialized PHP object; deserialization triggers magic methods (__destruct / __wakeup) that drive a Monolog gadget chain into system() / current(), yielding code execution as the web-server user.
Why it matters. A single crafted cookie on any storefront page is enough — no login, no admin path, fires on ordinary traffic. CISA added it to the KEV catalog on 2026-06-03 (FCEB remediation deadline 2026-06-06) on evidence of active exploitation. Imperva observed in-the-wild payloads running validation commands such as echo PWNED_CVE2026_$(date +%s) and sleep 5 before staging further tooling. The natural follow-on for a compromised Magento host is a web shell under pub/ or media/, a Magecart payment skimmer injected into checkout/CMS content, a rogue admin user, and persistence via cron or modified application files.
Defensive angle. The exploit is a cookie, so the loudest, highest-fidelity Falcon signal is behavioral on the web host: the PHP / web-server process tree (php-fpm, httpd, nginx, apache2) spawning shells or recon binaries, and executable / PHP file writes under public web roots. Those are the hunts in this pack. The cookie signature CacheWarmer=(Tz|Qz|YT)... is best matched at the WAF / reverse-proxy / access-log layer (Section 7) and forwarded to Falcon NGSIEM.
Defender priority: On every internet-facing Magento/Adobe Commerce host running Falcon, hunt php-fpm/httpd/nginx/apache2 spawning sh, bash, id, whoami, curl, wget, python (Q1) and new .php / executable writes under pub/ or media/ (Q3) right now. These two fire on the post-exploitation step regardless of how the cookie was crafted. Patch to 1.11.12 or disable the extension to remove the attack path.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| 1 · Gov | CISA KEV catalog | Added 2026-06-03 on evidence of active exploitation; FCEB remediation due 2026-06-06. | yes |
| 1 · NVD | NVD / CVEdetails CVE-2026-45247 | CWE-502 deserialization of untrusted data; all versions < 1.11.12; CVSS 9.8. | yes |
| 2 · Vendor | Imperva advisory | ITW payloads via CacheWarmer cookie; Monolog gadget chain (SyslogUdpHandler, BufferHandler, FingersCrossedHandler, GroupHandler); validation cmds echo PWNED_CVE2026_$(date +%s), sleep 5; targets gaming/business in US/UK/FR/AU. | yes |
| 2 · Vendor | Indusface blog | Root cause unserialize() of cookie; post-ex = rogue admin, unknown PHP/webshells, injected JS in CMS/checkout, payment skimmer; rotate admin + DB creds. | yes |
| 2 · Press | The Hacker News | Cookie indicator pattern CacheWarmer:(Tz|Qz|YT); payloads invoke system() / current(); disable extension as interim mitigation. | yes |
| 3 · Aggreg. | Vulert / SecurityWeek / Security Affairs | Corroborate KEV add, patch date 2026-05-25, fix in 1.11.12, automatable once patch diffed. | partial |
Hunter note: No atomic IOCs (attacker IPs, webshell hashes, skimmer domains) are published yet — attribution is unknown and reported goal is reconnaissance. This pack therefore leans on behavioral detections plus the cookie signature. The base64 cookie prefixes decode to PHP serialization markers: Tz → O: (object), Qz → C: (custom/serializable object), YT → a: (array) — the presence of any of these in a CacheWarmer cookie indicates a serialized payload, which the extension never legitimately receives from a browser.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
- H1 (high): A web-server/PHP process (
php-fpm,httpd,apache2,nginx) on a Magento host spawned a shell or recon binary (sh,bash,id,whoami,uname) — the direct footprint of gadget-chain command execution. Covers T1190 → T1059. - H2 (high): The validation marker string
PWNED_CVE2026appears in a command line on the web host — Imperva's observed canary. Covers T1190 / T1059.004. - H3 (high): A new
.phpor executable file was written under a public web root (pub/,media/,pub/static/) by the web-server user — webshell drop. Covers T1505.003. - H4 (medium): The web-server/PHP process made an outbound network connection to an external host shortly after a write or shell event — tooling pull / C2 / skimmer beacon. Covers T1071 / T1105.
- H5 (medium): A reverse-shell command line (
bash -i,/dev/tcp/,nc -e,python -csocket) is observed on the web host. Covers T1059.004 / T1571. - H6 (medium): The web-server user registered a cron job or modified persistence files (
crontab,/etc/cron.*). Covers T1053.003. - H7 (medium): The cookie signature
CacheWarmer=(Tz|Qz|YT)appears in forwarded access/WAF logs — exploitation attempt, pre-impact. Covers T1190 (native-log hunt, Section 7). - H8 (low): New Magento admin user creation or
app/etc/env.php/ payment-config modification correlated to the web host — rogue admin / skimmer staging. Covers T1136 / T1505 (app-log hunt).
Attack chain
| # | Step | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Recon: attacker fingerprints Magento + Mirasvit FPC Warmer < 1.11.12 | Web access logs, WAF | Repeated requests setting CacheWarmer cookie |
| 2 | Deliver: crafted base64 serialized object in CacheWarmer cookie on a storefront request | Access/WAF logs → NGSIEM | Cookie value starts Tz/Qz/YT (Q7 / Section 7) |
| 3 | Exploit: unserialize() instantiates Monolog gadget chain → system()/current() | ProcessRollup2 | php-fpm/httpd parent spawns shell (Q1) |
| 4 | Validate: attacker runs canary (echo PWNED_CVE2026_..., sleep 5) | ProcessRollup2 | Canary string / sleep in cmdline (Q2) |
| 5 | Stage: drop webshell under pub/ or media/ | FileCreateInfo / PeFileWritten | New .php/executable in web root (Q3) |
| 6 | Pull tooling / beacon C2 / fetch skimmer | NetworkConnectIP4 / DnsRequest | Web process egress to external IP (Q4) |
| 7 | Persist: cron, rogue admin, env.php / payment edits | ProcessRollup2 / FileCreateInfo / app logs | cron write (Q6), reverse shell (Q5), admin create (S7/H8) |
| 8 | Impact: Magecart skimmer harvests cardholder data at checkout | App logs, client-side monitoring | Injected JS in CMS/checkout (native hunt, S7) |
Consolidated IOC Table
No atomic IOCs published. No attacker IPs, webshell hashes, or skimmer domains are public as of 2026-06-15. The indicators below are behavioral / signature-based. Treat published values as starting points and validate in-tenant.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| Cookie signature | CacheWarmer=(Tz|Qz|YT)... | high | hunt | Serialized PHP object (O:/C:/a:) in cookie — never sent by a real browser | 2026-09-15 |
| Cmdline canary | PWNED_CVE2026 | high | detect | Imperva-observed exploitation validation marker | 2026-12-15 |
| Cmdline pattern | sleep 5 spawned by web process | medium | hunt | Timing canary post-exploitation | 2026-09-15 |
| Gadget class | Monolog\Handler\SyslogUdpHandler | high | hunt | Gadget chain entry; appears in serialized payload / php-fpm error logs | 2026-12-15 |
| Gadget class | Monolog\Handler\BufferHandler / FingersCrossedHandler / GroupHandler | high | hunt | Gadget chain links | 2026-12-15 |
| Behavior | php-fpm/httpd/nginx/apache2 → sh/bash/id/whoami | high | detect | Post-exploitation command execution (Q1) | 2026-12-15 |
| Behavior | New .php under pub/ or media/ | high | detect | Webshell drop (Q3) | 2026-12-15 |
| CWE | CWE-502 (Deserialization of Untrusted Data) | high | enrich | Root-cause class | 2026-12-15 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Linux web host (php-fpm / nginx / apache2) running Falcon | ProcessRollup2, FileCreateInfo, NetworkConnectIP4, DnsRequest | Critical | Low — core Falcon Linux telemetry |
Public web roots (pub/, media/, pub/static/) | FileCreateInfo / file-write events with TargetFileName | High | Med — depends on file telemetry being enabled for Linux sensor |
| WAF / reverse proxy / Magento access logs | HTTP log forwarding to Falcon NGSIEM (cookie field) | High | High — cookie not in EDR; needs log ingest pipeline |
| Magento application (admin, env.php, payment config) | App/audit logs forwarded to NGSIEM | Medium | High — app-layer, not native EDR |
| Storefront client (checkout/CMS JavaScript) | Client-side integrity / CSP report-uri monitoring | Medium | High — outside EDR scope; needs SRI/CSP or external monitor |
ATT&CK Mapping
| Tactic | Technique | Name | Observed Behavior | Query / Control |
|---|---|---|---|---|
| Initial Access | T1190 | Exploit Public-Facing Application | Crafted CacheWarmer cookie → unserialize() RCE | Q7 / S7 · Patch |
| Execution | T1059.004 | Command & Scripting: Unix Shell | php-fpm spawns sh/bash; canary commands | Q1, Q2, Q5 |
| Persistence | T1505.003 | Server Software Component: Web Shell | .php dropped under pub/ or media/ | Q3 |
| Persistence | T1053.003 | Scheduled Task/Job: Cron | Web-server user writes crontab / cron.d | Q6 |
| Persistence | T1136.001 | Create Account: Local Account | New Magento admin user | S7 / H8 |
| Discovery | T1082 / T1033 | System / Owner Discovery | id, whoami, uname spawned by web process | Q1 |
| Command & Control | T1071.001 / T1105 | Web Protocols / Ingress Tool Transfer | Web process egress (curl/wget) to external host | Q4 |
| Command & Control | T1571 / T1059.004 | Non-Standard Port / Reverse Shell | bash -i >& /dev/tcp; nc -e; python socket | Q5 |
| Collection / Impact | T1056.003 / T1565 | Web Portal Capture / Data Manipulation | Magecart JS skimmer in checkout/CMS | S7 (native) |
Native Audit-Log Hunts (non-CQL)
The exploit primitive is an HTTP cookie that never reaches the EDR process layer. These checks run at the web / app tier and feed Falcon NGSIEM where forwarded.
1 · WAF / reverse-proxy / Magento access logs — cookie signature
Search HTTP request logs for a CacheWarmer cookie whose value begins with a PHP serialization marker. Any match is high-fidelity — browsers never send serialized objects in this cookie.
grep -E 'CacheWarmer=(Tz|Qz|YT)' /var/log/nginx/access.log /var/log/apache2/access.log # decode + confirm: base64 -d after the cookie value should reveal O: / C: / a: serialized PHP # also flag overly long CacheWarmer cookie values (> 200 chars) regardless of prefix
2 · php-fpm / web-server error logs — gadget classes
grep -E 'Monolog\\(Handler\\)?(SyslogUdpHandler|BufferHandler|FingersCrossedHandler|GroupHandler)' \ /var/log/php*-fpm.log /var/log/php_errors.log # unserialize() of these handler classes outside legitimate logging = gadget-chain attempt
3 · Magento admin audit — rogue accounts & config tamper
- Admin → System → Permissions → All Users: review for unexpected accounts created on/after 2026-05-25.
SELECT username, created, logdate FROM admin_user ORDER BY created DESC;— flag entries not in your change record.- Diff
app/etc/env.php, payment-method config, and CMS blocks/pages against a known-good backup for injected JS or altered crypt key.
4 · Storefront client-side — Magecart skimmer
- Compare checkout / CMS page JavaScript against baseline; look for unfamiliar external script
srcor inline form-field listeners. - If CSP is deployed, review
report-uriviolations for new script origins.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a Magento web-server/PHP parent (php-fpm, httpd, apache2, nginx) spawning an interactive shell or recon tool — the direct footprint of gadget-chain command execution. FP: deploy/build scripts and legitimate site cron run via php-cli; scope to internet-facing storefront hosts and exclude known maintenance windows.
// HUNT: Web/PHP process spawns shell or recon binary (CVE-2026-45247 post-exploit) // MITRE: T1190, T1059.004, T1082, T1033 // CONF: high FP: low COST: low | REQUIRES: Linux ProcessRollup2 // FALSE POSITIVES: deploy/build tooling, site cron via php-cli // TUNING: restrict aid to Magento web hosts; exclude CI/deploy service accounts #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ event_platform=Lin | ParentBaseFileName=/^(php-fpm|httpd|apache2|nginx|php)/i | ImageFileName=/\/(sh|bash|dash|id|whoami|uname|hostname|cat|curl|wget|python[23]?|perl)$/i | table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, UserName], limit=200)
Looks for: the Imperva-observed canary marker PWNED_CVE2026 or a bare sleep timing test spawned by a web process. The PWNED marker is essentially zero-FP. FP: the sleep clause alone can match benign scripts — keep it gated behind the web-process parent.
// HUNT: CVE-2026-45247 exploitation validation canary (PWNED marker / sleep test) // MITRE: T1190, T1059.004 // CONF: high FP: low COST: low | REQUIRES: Linux ProcessRollup2 // FALSE POSITIVES: benign scripts using sleep (mitigated by web-parent gate) // TUNING: PWNED_CVE2026 needs no tuning; drop the sleep alternation if noisy #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ event_platform=Lin | ParentBaseFileName=/^(php-fpm|httpd|apache2|nginx|php)/i | CommandLine=/PWNED_CVE2026|\bsleep\s+\d+\b/i | table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, UserName], limit=200)
Looks for: a new .php / .phtml / executable file written under a Magento public web root — the classic webshell drop. FP: Magento static-content deploy regenerates files under pub/static/ and var/; exclude pub/static/ and deploy windows, focus on pub/media and media/ where PHP should never appear.
// HUNT: New PHP/executable written under Magento public web root (webshell) // MITRE: T1505.003 // CONF: high FP: medium COST: low | REQUIRES: Linux FileCreateInfo (file telemetry) // FALSE POSITIVES: setup:static-content:deploy writing under pub/static // TUNING: exclude /pub/static/ paths and CI deploy accounts; PHP under media/ is never legitimate #event_simpleName=/NewExecutableWritten|PeFileWritten/ event_platform=Lin | TargetFileName=/\/(pub|media)\/.*\.(php|phtml|phar|pht)$/i | TargetFileName!=/\/pub\/static\//i | table([@timestamp, ComputerName, aid, TargetFileName, ImageFileName, UserName], limit=200)
Looks for: a web-server/PHP process initiating an outbound IPv4 connection — staging additional tooling, beaconing, or fetching a skimmer. FP: Magento legitimately calls payment gateways, Adobe services, and package repos; exclude known-good destinations and RFC1918 internal addresses, then triage the remainder.
// HUNT: Web/PHP process outbound connection (ingress tool transfer / C2) // MITRE: T1071.001, T1105 // CONF: medium FP: medium COST: medium | REQUIRES: Linux NetworkConnectIP4 // FALSE POSITIVES: payment gateway / Adobe / package-repo callbacks // TUNING: allow-list known gateway + vendor CIDRs; exclude RFC1918 RemoteAddressIP4 #event_simpleName=NetworkConnectIP4 event_platform=Lin | ContextBaseFileName=/^(php-fpm|httpd|apache2|nginx|php|sh|bash|curl|wget)/i | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|127\.)/ | table([@timestamp, ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: classic reverse-shell one-liners (bash -i + /dev/tcp, nc -e, python socket, php -r fsockopen) on a Magento host. FP: very rare in production web tier; any hit warrants immediate triage.
// HUNT: Reverse-shell command pattern on Magento web host // MITRE: T1059.004, T1571 // CONF: high FP: low COST: low | REQUIRES: Linux ProcessRollup2 // FALSE POSITIVES: legitimate admin troubleshooting (rare) // TUNING: scope to web hosts; alert on any match #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ event_platform=Lin | CommandLine=/(bash\s+-i|\/dev\/tcp\/|nc\s+(-[a-z]*e|--exec)|python[23]?\s+-c\s+.*socket|php\s+-r\s+.*fsockopen|fsockopen\(|socket_create)/i | table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, UserName], limit=200)
Looks for: creation/modification of cron artifacts (crontab exec, writes to /etc/cron.* or /var/spool/cron/) attributable to the web-server context. FP: Magento itself installs a cron entry at deploy; baseline the expected magento cron line and exclude it, alert on anything else.
// HUNT: Cron persistence created from web-server context // MITRE: T1053.003 // CONF: medium FP: medium COST: low | REQUIRES: Linux ProcessRollup2 + FileCreateInfo // FALSE POSITIVES: Magento's own deploy-time cron entry // TUNING: exclude known magento cron install line; alert on web-user-owned cron edits #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ event_platform=Lin | ParentBaseFileName=/^(php-fpm|httpd|apache2|nginx|php|sh|bash)/i | (CommandLine=/crontab\s+(-|\/)/i or TargetFileName=/\/(etc\/cron|var\/spool\/cron)\//i) | table([@timestamp, ComputerName, aid, ParentBaseFileName, ImageFileName, CommandLine, TargetFileName, UserName], limit=200)
Looks for: the exploitation cookie itself in HTTP access/WAF logs forwarded to NGSIEM — a CacheWarmer cookie whose value begins with a base64 serialization marker (Tz/Qz/YT) or the raw O:/C:/a: marker. FP: field/parser names vary by log source — adjust http.request.cookie to your repo's schema. Legitimate CacheWarmer cookies are short opaque tokens, never serialized objects.
// HUNT: CVE-2026-45247 CacheWarmer cookie exploit signature (HTTP/WAF logs) // MITRE: T1190 // CONF: high FP: medium COST: medium | REQUIRES: HTTP access/WAF log ingest to NGSIEM // FALSE POSITIVES: schema/field-name drift across log sources // TUNING: map cookie field to your repo; serialized markers are never legit here cookie := coalesce([http.request.cookie, request_cookies, cs_cookie, cookie]) | cookie=/CacheWarmer=(Tz|Qz|YT|O%3A|C%3A|a%3A|O:|C:|a:)/i | table([@timestamp, source.address, url.path, http.request.method, cookie], limit=200)
Field-validation note: Q1–Q6 use core Linux Falcon fields (ImageFileName, ParentBaseFileName, CommandLine, TargetFileName, ContextBaseFileName, RemoteAddressIP4, aid, ComputerName, UserName) — all standard. Q7 targets forwarded HTTP/WAF logs, not EDR; its field names (http.request.cookie etc.) depend on your NGSIEM parser and must be mapped to your repo before use — ⚠ validate parser fields in tenant.
CrowdStrike Custom IOA Recommendations
Promote the highest-fidelity behaviors (Q1, Q2, Q5) to Custom IOAs for real-time prevention on Magento web hosts. Build in Endpoint Security → Custom IOA Rule Groups, platform Linux, assign to a host group scoped to internet-facing commerce servers.
| IOA Name | Type | Parent / Image / Cmdline pattern | Action | Exclusions |
|---|---|---|---|---|
| Magento Web Process Spawns Shell | Process Creation | Parent php-fpm|httpd|apache2|nginx → Image (sh|bash|dash) | Detect → Block | CI/deploy service accounts |
| CVE-2026-45247 Canary Marker | Process Creation | CommandLine contains PWNED_CVE2026 | Block | None (zero-FP marker) |
| Reverse Shell from Web Tier | Process Creation | CommandLine matches /dev/tcp/ or nc -e or fsockopen under web parent | Block | None |
| PHP Written to Public Web Root | File Creation | TargetFileName matches /(pub|media)/.*\.php$, not under /pub/static/ | Detect | pub/static/, deploy windows |
Roll out in Detect mode first. Run each IOA in Detect for one full deploy/maintenance cycle to confirm the exclusions cover legitimate static-content deploys and site cron, then flip the high-confidence rules (canary, reverse shell) to Block.
Machine-Readable IOC Appendix
Quick-copy blocks for direct ingestion. No atomic IOCs are published yet — the Falcon IOC CSV uses REPLACE_WITH_... placeholders for values you extract during triage (webshell hash, skimmer domain, attacker IP).
type,value,action,severity,expiration,description,tags sha256,REPLACE_WITH_WEBSHELL_SHA256,prevent,critical,2026-12-15,CVE-2026-45247 webshell payload,campaign:Mirasvit-CacheWarmer domain,REPLACE_WITH_C2_OR_SKIMMER_DOMAIN,detect,high,2026-09-15,CVE-2026-45247 C2 / skimmer domain,campaign:Mirasvit-CacheWarmer ipv4,REPLACE_WITH_ATTACKER_IP,detect,high,2026-09-15,CVE-2026-45247 exploit source IP,campaign:Mirasvit-CacheWarmer
cookie_signature: CacheWarmer=(Tz|Qz|YT|O:|C:|a:) cmdline_canary: PWNED_CVE2026 web_parent: php-fpm | httpd | apache2 | nginx shell_children: sh | bash | dash | id | whoami | uname | curl | wget webshell_path: /(pub|media)/.*\.(php|phtml|phar|pht)$ (exclude /pub/static/) revshell: /dev/tcp/ | nc -e | fsockopen( | python -c .*socket
Monolog\Handler\SyslogUdpHandler Monolog\Handler\BufferHandler Monolog\Handler\FingersCrossedHandler Monolog\Handler\GroupHandler # PHP serialization markers (base64): Tz=>O: Qz=>C: YT=>a: # Functions abused by chain: system() current()
# Confirm Mirasvit FPC Warmer version (must be >= 1.11.12) composer show mirasvit/module-cache-warmer 2>/dev/null | grep -i versions php bin/magento module:status | grep -i Mirasvit_CacheWarmer # Interim: disable the extension to remove the attack path php bin/magento module:disable Mirasvit_CacheWarmer && php bin/magento cache:flush # CISA KEV: CVE-2026-45247 | FCEB due 2026-06-06
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| Telemetry ready | Linux sensor on Magento hosts reports ProcessRollup2 + FileCreateInfo + NetworkConnectIP4 | Events visible in last 24h for each web aid |
| Benign baseline | Run Q3/Q6 across a deploy cycle | Static-content deploy and Magento cron entry appear → added to exclusions |
| Positive test | In a lab, have php-fpm spawn id and write a .php under media/ | Q1 and Q3 both fire |
| Canary test | Echo PWNED_CVE2026_test from a web-context shell in lab | Q2 fires; IOA blocks if promoted |
| Log pipeline | Confirm HTTP/WAF cookie field is parsed into NGSIEM | Q7 cookie field resolves to real values |
| Promotion | Q1/Q2/Q5 stable with zero FP over one cycle | Promote to Custom IOA (Detect → Block) |
Hardening — Tiered & Deployable
- Patch or disable the extension. Upgrade Mirasvit Full Page Cache Warmer to 1.11.12+; if you can't patch immediately,
module:disable Mirasvit_CacheWarmerremoves the vulnerableunserialize()path. MITRE M1051 · vendor advisory - WAF rule for the cookie. Block/alert requests with a
CacheWarmercookie whose value matches(Tz|Qz|YT|O:|C:|a:)or exceeds a sane length. M1050 · Imperva/Indusface guidance - Make web roots non-executable for PHP. Ensure
media/andpub/media/cannot execute PHP (web-server config), so a dropped.phpcan't be invoked. M1022 · Adobe Commerce security best practice
- Disable dangerous PHP functions for the web SAPI: add
system,exec,shell_exec,passthru,popen,proc_opentodisable_functionsinphp.ini(pilot — Magento itself does not need these in fpm). M1042 · CIS PHP / DISA - Least-privilege web user. Run php-fpm as a dedicated unprivileged user with no shell and no write access outside
var/,media/uploads, and cache dirs. M1026 · CIS Linux Benchmark - File-integrity monitoring on
app/etc/env.php, payment config, and CMS content tables to catch skimmer injection. M1040 · best practice ⚠ no formal benchmark
- Content Security Policy + Subresource Integrity on checkout to neutralize Magecart skimmers even if a host is compromised. M1021 · Adobe Commerce CSP
- Segment & restrict web-host egress to known payment-gateway / vendor CIDRs so tooling pull and skimmer beacon (Q4) fail. M1030 · CIS / NIST
- Extension supply-chain governance: inventory all third-party Magento modules, subscribe to vendor PSIRT feeds, and gate new modules on a security review. M1016 · NIST SSDF
Deployable Playbooks
Playbook A — Patch / mitigate the extension
## 1. Check installed version composer show mirasvit/module-cache-warmer | grep -i versions php bin/magento module:status | grep -i Mirasvit_CacheWarmer ## 2a. Patch (preferred) composer require mirasvit/module-cache-warmer:^1.11.12 --update-with-dependencies php bin/magento setup:upgrade php bin/magento setup:di:compile php bin/magento cache:flush ## 2b. Interim mitigation if patch is blocked php bin/magento module:disable Mirasvit_CacheWarmer php bin/magento cache:flush ## 3. Verify the version is >= 1.11.12 composer show mirasvit/module-cache-warmer | grep -i versions
Playbook B — Harden the web tier (nginx + PHP)
## Deny PHP execution under media/ (nginx) — drop in server block
location ~* /(media|pub/media)/.*\.(php|phtml|phar|pht)$ { deny all; return 403; }
## php.ini for the fpm pool (pilot before prod)
disable_functions = system,exec,shell_exec,passthru,popen,proc_open,proc_close
expose_php = Off
allow_url_include = Off
## Reload
php-fpm -t && systemctl reload php-fpm
nginx -t && systemctl reload nginx
Playbook C — WAF signature (ModSecurity-style)
## Block serialized-object CacheWarmer cookies SecRule REQUEST_COOKIES:CacheWarmer "@rx ^(Tz|Qz|YT|O:|C:|a:)" \ "id:2026045247,phase:1,deny,status:403,log,\ msg:'CVE-2026-45247 Mirasvit CacheWarmer deserialization attempt'" ## Also flag abnormally long values SecRule REQUEST_COOKIES:CacheWarmer "@gt 200" \ "id:2026045248,phase:1,t:length,pass,log,\ msg:'CVE-2026-45247 oversized CacheWarmer cookie'"
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the affected web host in Falcon; preserve memory/disk; do not power off. Block attacker source IP at edge. | SOC / IR | Falcon RTR session, host containment log |
| Eradicate | Patch to 1.11.12 (or disable extension). Remove webshells found by Q3. Kill rogue cron (Q6) and reverse shells (Q5). Delete unauthorized admin users. | Web ops / IR | File hashes, cron diffs, admin_user diff |
| Rotate | Rotate Magento admin passwords, integration tokens, DB creds, env.php crypt key, API keys. Invalidate all admin sessions. | Web ops | Credential-rotation ticket |
| Recover | Restore tampered files/CMS content from known-good backup; redeploy static content; re-enable host after clean scan. | Web ops | Backup restore log, clean Falcon scan |
| Assess impact | Determine if a payment skimmer ran and over what window; engage PCI/forensics and notify per breach obligations if cardholder data was exposed. | IR / Legal / Compliance | Skimmer timeline, client-side JS diff |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 | Cookie exploit delivery | Q7 (logs) | — | Partial (needs HTTP log ingest) |
| T1059.004 | Web process spawns shell / canary | Q1, Q2 | Yes | Good |
| T1505.003 | Webshell file write | Q3 | Yes | Good |
| T1571 / revshell | Reverse shell | Q5 | Yes | Good |
| T1071 / T1105 | Tooling pull / C2 egress | Q4 | — | Partial (FP tuning needed) |
| T1053.003 | Cron persistence | Q6 | — | Partial |
| T1136.001 | Rogue Magento admin | — | — | GAP (app-log only, S7/H8) |
| T1056.003 / T1565 | Magecart skimmer / CMS JS inject | — | — | GAP (client-side; CSP/SRI + S7) |
Gaps: rogue-admin creation and client-side skimmer injection sit outside EDR telemetry — cover them with Magento app/audit-log forwarding (Section 7, H8) and CSP/SRI monitoring respectively. The cookie-delivery signal (Q7) is only as good as your HTTP/WAF log pipeline into NGSIEM. Validation: run the gates in Section 11 before promoting any IOA; baseline Q3/Q6 across a deploy cycle to seed exclusions.
Hunt Summary Ticket
TITLE: Hunt — CVE-2026-45247 Mirasvit Cache Warmer Magento RCE (PHP Object Injection)
SEVERITY: Critical (CVSS 9.8 · CISA KEV · exploited ITW)
SCOPE: Internet-facing Magento 2 / Adobe Commerce hosts running Falcon (Linux)
HYPOTHESIS: Crafted CacheWarmer cookie → unserialize() → Monolog gadget chain → RCE;
post-ex = webshell under pub/media, reverse shell, cron, rogue admin, Magecart skimmer
QUERIES: Q1 web-proc spawns shell · Q2 PWNED canary · Q3 webshell write ·
Q4 web egress · Q5 reverse shell · Q6 cron · Q7 cookie signature (logs)
DO FIRST: Run Q1 + Q3 on all Magento web hosts; confirm extension version >= 1.11.12
FINDINGS: <fill in>
GAPS: Rogue-admin + skimmer = app/client-side (no EDR); cookie hunt needs HTTP log ingest
ACTIONS: Patch/disable extension · WAF cookie rule · rotate admin+DB creds · contain on hit
OWNER: HuntPack
VERSION: v0.1 · 2026-06-15
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For | Accessed |
|---|---|---|---|
| 1 · Gov | CISA KEV Catalog | KEV add date, FCEB deadline | 2026-06-15 |
| 1 · NVD | CVEdetails CVE-2026-45247 | CWE-502, affected versions, CVSS | 2026-06-15 |
| 2 · Vendor | Imperva advisory | ITW payloads, Monolog gadget chain, canary commands, targeting | 2026-06-15 |
| 2 · Vendor | Indusface blog | Root cause, post-ex behavior, mitigation | 2026-06-15 |
| 2 · Press | The Hacker News | Cookie signature pattern, KEV reporting | 2026-06-15 |
| 3 · Aggreg. | Vulert KEV blog | Patch date, fix version corroboration | 2026-06-15 |
| 3 · Press | SecurityWeek | Exploitation confirmation | 2026-06-15 |