一个邮件模板的渲染过程,把 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)+ 热修补丁;同批还修复了全产品线 170+ 漏洞 |
| 9 月 7 日起 | Previdian 蜜罐记录 12 次利用尝试(2 个 IP:中国、罗马尼亚),均失败 |
| 9 月 8 日 | CISA 将 CVE-2026-75650 收入 KEV 目录,FCEB 机构修复截止 9 月 11 日 |
漏洞档案:
| 项目 | 内容 |
|---|---|
| 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 与 Sansec 的描述一致:漏洞滥用(abuse)Magento 的模板系统,通过 PHP 代码注入,在生成 "Payment Transaction Failed Reminder"(支付交易失败提醒)邮件的过程中触发代码执行。Adobe 官方对它的分类是 CWE-1336(模板引擎特殊元素中和不当),结果列为任意代码执行。完整的攻击入口与利用载荷均未公开——Sansec 选择只披露"受到了攻击"这个事实与事后的木马线索。
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 二进制。相比解释型脚本,编译产物的落地形态更接近正常系统组件(Sansec 观察到的进程名伪装成
fc-cache、chronyd就是证据),也侧面说明攻击者的工程投入在往上走。
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,按版本选对应 patch zip)
# 下载:repo.magento.com/patch/VULN-39341-composer-patches.zip
# 解压后按 Adobe KB《How to apply a composer patch》流程应用
# 2. 确认补丁真的生效(Adobe Commerce Cloud 商户,需先装 Quality Patches Tool)
vendor/bin/magento-patches -n status | grep "39341|Status"
# 期望输出中 VULN-39341 显示 Status: Applied# 3. 轮换加密密钥(后台操作,非 CLI 命令)
Admin → System → Manage Encryption Key → Generate New Key & Re-encrypt
# 自建环境也可直接更新 app/etc/env.php 中的 crypt.key别以为换了密钥就完事了。 Adobe KB 有一句必须划重点的话:Rotating the encryption key alone does not invalidate credentials that may already have been exposed.(单独轮换加密密钥并不能让已泄露的凭据失效。)
原因很清楚:Magento 的加密密钥用于加密集成 token、支付网关凭据、系统级自动化 token。如果攻击者在补丁前已经用 RCE 把 app/etc/env.php 里的密钥读走,那它加密过的每一份凭据都必须视为已泄露。Adobe 给出的完整恢复顺序是:
- 应用热修 → 进维护模式 → 停用 cron;
- 轮换加密密钥;
- 重置所有后台管理员密码;
- 停用并重新生成全部 REST/SOAP/GraphQL 集成 token;
- 轮换已连接第三方应用的 OAuth client secret;
- 在服务商侧轮换支付网关凭据(Stripe / Braintree / Adyen / PayPal 等);
- 轮换数据库与 CDN(Fastly)凭据、SSH/部署密钥、物流/税务/扩展 API key;
- 清缓存 → 恢复 cron → 退出维护模式(Cloud 环境需重新部署以应用新数据库凭据)。
3.2 应急排查清单(无论是否已打补丁)
立即动作:
- 版本自查:
bin/magento --version,落在受影响区间(≤ 2026-aug 系列)即需热修;注意 2.4.0–2.4.3 及更早版本不在 Adobe 公告范围内,没有官方补丁; - 应用 VULN-39341 → 用上面的
magento-patches命令确认 Applied → 按 3.1 的两步做全量凭据轮换; - 强制重置所有管理员密码。
Sansec 公开的入侵线索(研究方披露的调查方向,非 Adobe/CISA 官方 IOC 清单):
| 线索 | 具体特征 |
|---|---|
| Rust 木马进程伪装 | 进程名伪装为 kworker/u:8:0、fc-cache、chronyd,并写入 cron 实现持久化 |
| PHP Web Shell 藏匿位置 | 商品图片缓存目录(pub/media 路径下)等非常规位置 |
| 后渗透工具 | gs-netcat、WraithC2、基于 cookie 的框架文件 RFI |
| C2 域名 | 字母换位域名 ntp.timesysnc.net,并伴随异常的出站 UDP/123 流量 |
| 第二攻击者 | Sansec 另发现一名操作者利用同一入口,工具不同,投放了需特定 HTTP 头才触发的 media 目录 web shell |
配合通用排查:
# 可疑 ELF 二进制(Rust 后门是编译后的 ELF)
find var/ pub/ -type f -exec file {} \; | grep ELF
# 近期被修改的 PHP 文件(web shell 常见落点)
find . -name "*.php" -newermt "2026-09-01" -not -path "./vendor/*"
# 异常 cron 与动态链接器劫持
crontab -l; ls -la /etc/ld.so.preload 2>/dev/null
# 出站连接与 UDP/123 异常
ss -tunp | grep -E "123|ESTAB"如果确认已沦陷:不要只打补丁了事。密钥已泄露、可能有多份持久化(Sansec 已观察到两套独立工具链)——正确姿势是隔离取证后重建环境,并核查支付集成是否被触碰。信任一旦丢失,"补丁装完"不等于"系统干净"(这与站内 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 于 9 月 7 日(首例确认利用后 3 天)发布 Priority 1 热修,CISA 次日收入 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 全景

