新闻
News Today
StyleSmuggler 漏洞预警:补丁失效与链式攻击分析
9 月 4 日晚,Sansec 在蜜罐流量中监测到针对 Magento /graphql 接口的异常 POST 请求,包含特殊的 styles[...] 参数。随后,未使用相关产品的客户也触发告警,表明攻击已大规模扩散。9 月 5 日,Sansec 将该漏洞命名为"StyleSmuggler"并提前披露。截至 9 月 6 日,Adobe 官方安全公告仍停留在 8 月版本,尚未发布 CVE 编号、官方修复补丁或临时缓解方案。
此次事件最令人担忧的是首个受害者案例:该站点运行 Magento Open Source 2.4.6-p15,已应用所有最新安全补丁且状态检测为“干净”。然而,StyleSmuggler 利用的是 Magento 原生功能逻辑形成的新攻击向量,与过往补丁无关,传统运维防御体系对此完全失效。
攻击原理:全链路利用原生功能
StyleSmuggler 是一次典型的链式攻击,全程未利用外部漏洞,仅组合 Magento 正常功能:
第一阶段(投毒):攻击者向 POST /graphql 发送含畸形 styles[...] 数组的请求。Magento 将其写入日志文件(如 var/log/system.log),由于通过“样式属性”通道传输,内容未经过滤,直接植入恶意 PHP 代码。
第二阶段(执行):攻击者触发 Magento 服务端“支付失败提醒邮件”逻辑。在渲染邮件时,依赖注入(DI)Scanner 类被调用,该类包含 include 语句,将前述被投毒的日志文件作为代码执行。关键点在于,此过程发生在服务端,无需用户点击邮件,彻底绕过了基于用户行为的防御防线。
后门特征:高度隐蔽的持久化机制
漏洞利用成功后,攻击者部署的后门极具隐蔽性,目前主流杀毒引擎(如 VirusTotal 上 70+ 引擎)均无法识别:
- 进程伪装:进程名伪装为 Linux 内核线程 [kworker/u:8:0],但在网站用户下运行并占用内存,以此混淆运维排查。
- 隐藏存储:二进制文件为 1.9MB 的静态 Rust 程序(支持 x86-64 和 ARM64),藏匿于 ~/.local/share/.gvfsd/ 等默认隐藏的 dot 目录中。
- 无痕迹持久化:直接修改 /var/spool/cron/crontabs/ 文件而非调用 crontab 命令,系统日志无记录。部分受害站点发现同一 cron 任务被重复写入上千次,实现秒级重生。
- 通信隐匿:新版后门将进程名改为 fc-cache,C2 通信伪装成 NTP 协议(UDP 123 端口),数据载荷模拟 NTP 应答包,极易绕过网络过滤。
- 内网横向移动:部分案例显示,攻击者不对外发起连接,而是通过内网 Redis 实例读取 Magento Session 数据,使网络层监控完全盲视。
紧急应对指南
鉴于 Adobe 预计 9 月 8 日才可能发布补丁,当前窗口期需采取以下减面措施:
1. 收敛攻击面:若非 Headless 或 PWA 架构,建议立即禁用 GraphQL 功能(对经典主题通常无业务影响)。若必须保留,需在 WAF 层面拦截含 styles[ 特征的 POST /graphql 请求,或部署社区发布的临时 DI Scanner 补丁(需先在测试环境验证)。
2. 排查 IOC 指标:执行以下命令检查感染痕迹(注意:Disrex 团队发现植入痕迹不仅限于 var/report/,还需重点检查 var/log/system.log):
crontab -l | grep -i gvfsd
ls -la ~/.local/share/.gvfsd/ /tmp/.kw_* /tmp/.gvfsd-* 2>/dev/null
ps -eo pid,comm,args | grep -iE 'kworker|fc-cache'
grep -ril 'X_TRACE_' var/report/
grep -ril 'X_TRACE_' var/log/system.log
3. 彻底清除:若发现异常进程、隐藏目录或 Redis 异常连接,切勿仅杀死进程。必须清理 cron spool 文件、作废所有 Redis Session 数据,并强制轮换所有 Magento 后台凭据。Sansec 指出“暂无后门被活跃使用的证据”,这意味攻击者可能正在潜伏等待时机。
安全启示
StyleSmuggler 打破了多项传统安全假设:服务端渲染使得“不点击邮件”不再安全;内部接口 GraphQL 已成为关键攻击面;零检出率并不代表系统安全。对于 Magento/Adobe Commerce 用户而言,在官方补丁落地前,主动排查与防御是唯一出路。
信息来源:Sansec 官方 advisory

