一个邮件模板的渲染过程,把 Magento 的模板处理与依赖注入代码变成了免认证 RCE 链。从首次确认利用到一台生产服务器沦陷:50 分钟。
StyleSmuggler CVE-2026-75650:Magento CVSS 10.0 零日深度分析
一、事件时间线
| 时间(2026 年) | 事件 |
|---|---|
| 9 月 4 日 22:20 UTC | Sansec 首次确认 StyleSmuggler 在野利用 |
| 同日 +50 分钟 | Disrex 披露:其托管平台上的一台 Magento 服务器被攻破 |
| 9 月 7 日 | Adobe 发布 APSB26-146 安全公告(Priority 1)+ 热修补丁 |
| 9 月 7 日起 | Previdian 蜜罐记录 12 次利用尝试(2 个 IP:中国、罗马尼亚),均失败 |
| 9 月 8 日 | CISA 将 CVE-2026-75650 收入 KEV 目录,FCEB 机构修复截止 9 月 11 日 |
| 同日 | Adobe 同批修复全产品线 170+ 漏洞 |
漏洞档案:
| 项目 | 内容 |
|---|---|
| CVE | CVE-2026-75650(Sansec 命名 StyleSmuggler) |
| 产品 | Adobe Commerce 2.4.4–2.4.9(≤ 2026-aug)、B2B 1.3.3–1.5.3、Magento Open Source 2.4.4–2.4.9 |
| 类型 | CWE-1336:模板引擎中特殊元素中和不当(Improper Neutralization of Special Elements Used in a Template Engine) |
| 认证要求 | 无(PR:N,无需任何凭据) |
| CVSS 3.1 | 10.0 —— AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| 影响 | 任意代码执行(范围改变:影响超出漏洞组件自身) |
| 官方修复 | 热修补丁 VULN-39341 + 轮换加密密钥 |
CVSS 向量值得逐项看:AV:N(网络可达)+ AC:L(低复杂度)+ PR:N(免认证)+ UI:N(无需交互)+ S:C(Scope Changed)——最后这项是 10.0 满分的关键:漏洞的破坏力越过了模板组件自身的边界,直接拿到宿主机代码执行。
二、漏洞机制:模板渲染如何变成 RCE
2.1 注入点:Payment Transaction Failed Reminder 邮件
THN 与 Aviatrix 的分析一致指出:漏洞位于 Magento 模板系统的 PHP 代码注入,触发场景是 "Payment Transaction Failed Reminder"(支付交易失败提醒)邮件的模板渲染——商户通过后台编辑的邮件模板内容未经充分中和,被模板引擎当作代码处理,渲染时执行。
CWE-1336 的通用模式是:
用户可控输入 → 进入模板引擎的指令语法 → 被当作模板代码执行Magento 的模板与依赖注入体系(StyleSmuggler turns Magento's own template-processing and dependency-injection code into an unauthenticated remote-code-execution chain——Disrex 的定性)把这条链放大成了完整的免认证 RCE。注意:完整的 exploit 细节 Sansec 选择不公开,考虑到漏洞处于 KEV 目录、在野利用已确认,这是正确的负责任披露姿势。本文也不复现攻击载荷,只讲清楚防御视角。
2.2 为什么电商模板系统天然高危
Magento 的邮件/模板体系允许商户在后台自定义模板内容,模板里嵌入动态指令是正常用法——这本质上是一个"让非程序员安全地写半代码"的设计目标。当"中和"环节失守,它就变成:
文字版攻击链
──────────────────────────────────────────────────────────
[1] 攻击者投递模板载荷(免认证,PR:N —— 入口细节未公开)
│
▼
[2] 支付失败提醒邮件触发模板渲染
│ 模板引擎解析载荷 → 当作指令而非文本
▼
[3] PHP 代码执行(CVE-2026-75650 RCE 落地点)
│
├─→ [4a] PHP Dropper → 写入 PHP Web Shell
│ (任意 PHP 代码执行的持久化入口)
│
└─→ [4b] 投放 Rust 编译的 Linux 后门 ELF
连接外部 C2,等待后续指令
│
▼
[5] 商户数据(支付相关)暴露风险 + 横向移动
Adobe 明确要求:修复后必须轮换加密密钥
──────────────────────────────────────────────────────────两条持久化路线值得注意:
- PHP Web Shell:经典手法,贴着 PHP 运行时走,T1505.003(Server Software Component: Web Shell);
- Rust 后门:这一步是 2026 年攻击面的缩影——攻击者不再只写 bash 脚本,而是投放编译型 ELF 二进制。Rust 编译的后门对静态特征检测更不友好(无解释器依赖、字符串编译期混淆更成熟),也侧面说明攻击者的工程投入。
2.3 50 分钟意味着什么
Disrex 披露:其平台上托管的一台 Magento 服务器,在 9 月 4 日 22:20 UTC 首例确认利用后 50 分钟内被攻破。两个解读:
- 这不是定向 APT 式的手工渗透,而是自动化武器化利用——扫描、利用、投后门一气呵成,普通商户没有任何反应窗口;
- Sansec 发现的零日利用在先,Adobe 补丁在后(9/7)——patch-gap 期间商户唯一的防线是 WAF/运行时防护。这与站内 BlueMoon 漏洞链分析 的 patch-gap 武器化模式完全一致:零日 + 自动化 + 电商高价值目标 = 闪电战。
三、修复与应急响应
3.1 官方修复路径
Adobe 的修复分两部分,缺一不可:
# 1. 应用热修补丁(VULN-39341)
# 从 repo.magento.com 下载对应版本的 composer patch
# repo.magento.com/patch/VULN-39341-composer-patches.zip
# 2. 轮换加密密钥(Adobe KB 明确要求)
bin/magento config:sensitive:set encrypt/key # 按官方 KB 流程为什么要轮换加密密钥?Magento 的加密密钥保护支付卡号、API 凭据等敏感数据。在 RCE 已经发生过(或无法排除已发生)的前提下,密钥必须视为可能泄露——RCE 类漏洞的修复不止于打补丁。
3.2 应急排查清单(无论是否已打补丁)
立即动作:
- 版本自查:
bin/magento --version,落在受影响区间(≤ 2026-aug 系列)即需热修; - 应用 VULN-39341 + 轮换加密密钥(顺序:先补丁、再换钥、最后清理);
- 强制重置所有管理员密码。
入侵痕迹排查(按 MITRE ATT&CK 映射):
| 检查点 | 命令/位置 | 对应技术 |
|---|---|---|
| 可疑 ELF 二进制 | find var/ pub/ -type f -exec file {} \; | grep ELF | T1105 工具投递 |
| 异常 cron 任务 | crontab -l、var/cron/、app/etc/ | 持久化 |
| PHP Web Shell | 近期修改的 .php 文件(find . -name "*.php" -mtime -30) | T1505.003 |
| 动态链接器劫持 | ld.so.preload 是否存在/异常 | T1574.006 |
| 进程注入痕迹 | 异常父子的进程树、内存扫描 | T1055 |
| 出站连接 | netstat/ss 对比已知 C2 模式(后门会连外部服务器等待指令) | T1071.001 |
| 管理员账户 | 后台异常新增管理员 | 横向持久化 |
如果确认已沦陷:不要只打补丁了事。密钥已泄露、后门可能多份持久化——正确姿势是隔离取证后重建环境。信任一旦丢失,"补丁装完"不等于"系统干净"(这与站内 KEV 全景文的结论一致)。
3.3 WAF/运行时防护的价值
Previdian 蜜罐数据给了个反例参考:9/7 以来 12 次利用尝试(来自中国与罗马尼亚两个 IP)全部失败——蜜罐环境有针对 CWE-1336 类载荷的检测规则。对来不及热修的商户,运行时检测/拦截模板指令类 payload 是 patch-gap 期间的救命稻草;对已修复的商户,它是纵深防御的一层。
四、PHP 开发者视角:CWE-1336 的通用防御
跳出 Magento,CWE-1336(模板引擎注入)在 PHP 生态是个需要制度性防御的类别。Twig、Smarty、Blade、Magento 自有模板引擎——只要存在"用户输入进入模板语法层"的可能,就适用同一套规则:
4.1 原则层
- 数据与代码分离:用户输入永远走数据通道(变量、参数),绝不走代码通道(模板语法、
eval、call_user_func); - 拒绝双渲染:把用户输入渲染成文本后,再把它作为模板二次渲染,是最常见的翻车点;
- 模板能力最小化:面向商户/编辑者的自定义模板功能,用受限沙箱引擎(如 Twig sandbox 的白名单标签/过滤器),而不是暴露完整引擎。
4.2 代码层示范(以 Twig 为例)
// ❌ 错误:createTemplate 会把 $userInput 当模板语法执行
$twig->createTemplate($userInput)->render($context);
// ✅ 正确:用户输入作为数据渲染,永不进入语法层
$twig->render('email/payment_reminder.html.twig', [
'customer_note' => $userInput, // 模板中以转义变量方式输出,输入不会进入模板语法层
]);如果业务必须允许用户写模板(如 Magento 商户自定义邮件),参考 Magento 官方对本次漏洞的修复思路:在模板编译/加载层面对特殊元素做中和,并把可用指令集收窄到业务必需的最小面。
4.3 框架/平台维护者:收到安全报告怎么办
PHP Weekly 本月刚好有一篇 "So You Received a Security Report. Now What?"——StyleSmuggler 的披露过程本身就是一份教材:Sansec 先观察在野利用、与厂商协同、Adobe 7 天内出 Priority 1 补丁 + KEV 收录 + 强制密钥轮换指引。对中小 PHP 项目的维护者,最小流程是:验证 → 评估影响面 → 修复 → 公告(含版本与变通方案)→ 致谢报告者。
五、写在最后
StyleSmuggler 的三个标签值得记住:
- CVSS 10.0 + 免认证 + S:C——最严重档位的满分组合,没有之一;
- 50 分钟——自动化武器化利用的响应窗口,寄希望于"发现后马上修"是不现实的;
- Rust 后门 + PHP Web Shell 双持久化——攻击者的工程投入已经对齐"编译型恶意软件"的水位。
对运营 Adobe Commerce/Magento 的团队,今天该做的三件事:查版本、打 VULN-39341、轮换加密密钥。对写 PHP 的人,记住 createTemplate($userInput) 这行反例——CWE-1336 不会只属于 Magento。
参考资料
- Adobe Security Bulletin APSB26-146(官方公告,Priority 1):https://helpx.adobe.com/security/products/magento/apsb26-146.html
- Adobe Experience League · CVE-2026-75650 热修指引:https://experienceleague.adobe.com/en/docs/commerce-knowledge-base/kb/announcements/commerce-apsb26-146
- The Hacker News · Adobe Patches Magento Zero-Day Exploited to Deploy Rust Backdoor and PHP Web Shell(2026-09-08):https://thehackernews.com/2026/09/adobe-patches-magento-zero-day.html
- CISA KEV 收录公告(2026-09-08):https://www.cisa.gov/news-events/alerts/2026/09/08/cisa-adds-four-known-exploited-vulnerabilities-catalog
- Previdian · CVE-2026-75650 蜜罐遥测:https://previdian.com/CVE-2026-75650
- CWE-1336:模板引擎特殊元素中和不当:https://cwe.mitre.org/data/definitions/1336.html
- 站内相关:BlueMoon 漏洞链与 patch-gap 武器化 · wp2shell WordPress 免认证 RCE 链 · CISA KEV 2026 全景

