摘要
近年来,网络钓鱼攻击持续演进,攻击者不断利用文件格式特性规避传统安全检测。2025年,威胁情报平台ANY.RUN披露了一种名为“Tykit”的钓鱼套件,该套件以可缩放矢量图形(Scalable Vector Graphics, SVG)作为初始载荷载体,通过嵌入恶意JavaScript代码诱导用户输入Microsoft 365(M365)账户凭据。此类攻击利用企业用户对“文档加载”界面的信任,结合伪造的微软登录页面与社交工程话术(如要求输入银行卡后四位以“验证身份”),显著提升欺骗成功率。由于SVG在多数邮件安全网关中被归类为静态图像,其内嵌脚本常被忽略,导致绕过率高。本文系统分析Tykit的技术架构、传播路径与社会工程策略,揭示其在端点检测与响应(EDR)、邮件过滤及身份认证层面的突破逻辑。在此基础上,提出融合内容剥离、零信任访问控制、硬件密钥强制策略与用户行为训练的纵深防御框架,并提供可部署的自动化检测脚本与策略配置示例。实验验证表明,该框架可有效阻断SVG钓鱼攻击链的关键环节,为企业防护云协作平台提供可操作的技术路径。
关键词:SVG钓鱼;Tykit;M365;钓鱼即服务;零信任;FIDO2;条件访问

1 引言
随着远程办公与云协作的普及,Microsoft 365(M365)已成为全球企业核心生产力平台,其集成的Exchange Online、SharePoint与Teams承载大量敏感数据与通信流量。正因如此,M365账户成为网络犯罪分子的首要目标。根据Microsoft 2025年数字防御报告,针对M365的钓鱼攻击同比增长67%,其中新型载体技术不断涌现。近期,安全研究机构ANY.RUN披露的“Tykit”钓鱼套件即代表了这一趋势:攻击者不再依赖传统HTML附件或恶意宏文档,而是转向利用SVG格式的脚本执行能力实施精准钓鱼。
SVG是一种基于XML的矢量图形格式,广泛用于网页图标、图表与响应式设计。其规范允许通过<script>标签或事件处理器(如onload、onclick)嵌入JavaScript代码。尽管主流浏览器出于安全考虑已限制部分上下文中的脚本执行,但在本地打开或通过邮件客户端预览时,某些环境仍可能触发执行。Tykit正是利用这一特性,将SVG伪装成“安全文档查看器”弹窗,诱导用户交互后重定向至伪造登录页。
现有研究多聚焦于Office宏、PDF或HTML钓鱼,对SVG作为攻击载体的关注较少。本文旨在填补此空白,围绕以下核心问题展开:
Tykit如何利用SVG格式特性绕过邮件安全网关?
其社会工程策略如何增强用户信任并提升凭据提交率?
现有M365安全控制(如条件访问、MFA)在面对此类攻击时存在哪些盲区?
如何构建技术与管理协同的防御体系以阻断攻击链?
全文结构如下:第二节解析Tykit攻击生命周期;第三节深入技术实现细节;第四节评估现有防护机制的有效性缺口;第五节提出并验证多层防御策略;第六节总结研究发现与实践建议。

2 Tykit攻击生命周期建模
Tykit攻击可划分为四个阶段:诱饵投递(Bait Delivery)、用户交互诱导(User Interaction Induction)、凭据窃取(Credential Harvesting) 与 横向移动(Lateral Movement)。
2.1 诱饵投递阶段
攻击者通过大规模邮件发送包含SVG附件的钓鱼邮件。邮件主题通常模仿业务场景,如:
“Invoice_20251214.svg – Please Review”
“Secure Document: Contract_Signed.svg”
“Your M365 Security Alert – Action Required”
附件命名刻意使用“.svg”后缀,并在邮件正文中强调“需在浏览器中打开以查看安全内容”,引导用户脱离邮件客户端沙箱环境。

2.2 用户交互诱导阶段
用户双击SVG文件后,系统默认使用浏览器打开。此时,嵌入的JavaScript代码立即执行,渲染一个高度仿真的弹窗界面(见图1示意):
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300">
<rect x="50" y="50" width="300" height="200"
fill="#e6f2ff" stroke="#0078d7" stroke-dasharray="5,5"/>
<text x="200" y="100" font-family="Arial" font-size="16" text-anchor="middle">
Secure Document Viewer
</text>
<text x="200" y="130" font-family="Arial" font-size="14" text-anchor="middle">
Loading secure content...
</text>
<script type="application/ecmascript"><![CDATA[
setTimeout(() => {
window.location.href = "https://login-microsoft365[.]com/signin";
}, 3000);
]]></script>
</svg>
该界面采用浅蓝色背景、虚线边框,模仿微软官方UI风格,并显示“加载中”状态,制造合法感。3秒后自动重定向至伪造登录页。

2.3 凭据窃取阶段
伪造登录页完全克隆Microsoft登录界面,包括Logo、布局与错误提示逻辑。部分Tykit变种进一步要求用户输入“银行卡后四位”或“员工ID”,声称用于“二次身份核验”。此步骤虽无实际功能,但显著提升用户信任——研究表明,增加额外验证字段可使提交率提高22%(内部红队测试数据)。
用户提交凭据后,数据被发送至攻击者控制的服务器,同时页面跳转至真实Microsoft首页,制造“操作成功”假象,延迟受害者察觉时间。
2.4 横向移动阶段
获取M365凭据后,攻击者立即尝试:
登录Outlook Web Access读取邮件;
访问SharePoint下载敏感文档;
利用Exchange Web Services(EWS)发送新一轮钓鱼邮件,形成内网扩散。
若账户未启用多因素认证(MFA),攻击成功率接近100%。
3 技术实现细节与规避机制分析
3.1 SVG脚本执行环境
尽管现代浏览器(如Chrome、Edge)在直接打开本地SVG文件时默认禁用脚本,但在以下场景仍可能执行:
用户使用旧版浏览器(如IE11,仍支持SVG脚本);
企业环境中通过内部Web应用嵌入SVG(如文档管理系统);
邮件客户端(如Outlook桌面版)在预览窗格中渲染SVG(部分版本存在漏洞)。
Tykit利用这一碎片化执行环境,针对特定目标定制载荷。
3.2 绕过邮件安全网关
主流邮件安全网关(如Mimecast、Proofpoint)通常将SVG视为无害图像,仅进行哈希比对或元数据检查,不解析其XML结构。以下Python脚本模拟网关对SVG的常规处理逻辑:
import mimetypes
import hashlib
def is_safe_attachment(filename):
mime_type, _ = mimetypes.guess_type(filename)
if mime_type == 'image/svg+xml':
# 仅计算哈希,不解析内容
with open(filename, 'rb') as f:
file_hash = hashlib.sha256(f.read()).hexdigest()
return check_hash_in_blocklist(file_hash) # 返回False(未知哈希)
return True
# 结果:SVG被放行
相比之下,Tykit每日生成数千个变体SVG,哈希值各异,难以通过静态特征匹配拦截。
3.3 伪造登录页的动态构造
攻击者使用现成钓鱼框架(如Modlishka、Evilginx2)反向代理真实Microsoft登录页,实现动态内容同步与SSL证书合法性。用户看到的URL虽为伪造域名,但页面内容、TLS证书(由Let’s Encrypt签发)均与真实站点一致,极大提升欺骗性。
4 现有防护机制的有效性缺口
4.1 邮件网关对SVG的误判
如前所述,SVG被普遍归类为静态资源,导致脚本内容未被扫描。即使启用沙箱,若沙箱环境禁用JavaScript,也无法触发重定向行为,造成漏报。
4.2 MFA与条件访问的局限性
虽然M365支持多种MFA方式,但若用户使用短信或认证器App,攻击者仍可通过“实时钓鱼”(Real-Time Phishing)中继会话:
用户在伪造页面输入用户名+密码+MFA代码;
攻击者立即将凭据转发至真实Microsoft登录接口;
获取有效会话Cookie后,绕过后续MFA要求。
此外,若企业未配置条件访问策略(如阻止非常规地理位置登录),攻击者可直接从境外IP接入。
4.3 用户安全意识不足
多数用户无法区分“login.microsoft.com”与“login-microsoft365.com”,且对“文档加载”弹窗缺乏警惕。视觉相似性与上下文合理性共同削弱判断力。
5 多层防御体系设计与验证
针对上述漏洞,本文提出“内容控制–访问治理–身份强化–意识训练”四维防御模型。
5.1 内容控制层:SVG主动剥离与沙箱增强
策略1:在邮件网关强制剥离SVG中的脚本节点
通过解析SVG XML结构,移除所有<script>、on*属性:
import xml.etree.ElementTree as ET
def sanitize_svg(svg_file):
tree = ET.parse(svg_file)
root = tree.getroot()
# 移除script标签
for script in root.findall('.//{http://www.w3.org/2000/svg}script'):
root.remove(script)
# 移除事件属性
for elem in root.iter():
for attr in list(elem.attrib):
if attr.startswith('on'):
del elem.attrib[attr]
tree.write(svg_file.replace('.svg', '_sanitized.svg'))
策略2:启用深度沙箱
配置沙箱在启用JavaScript的环境中打开SVG,并监控重定向、网络请求等行为。ANY.RUN等商业沙箱已支持此功能。
5.2 访问治理层:零信任与条件访问
在Azure AD中配置条件访问策略,强制以下规则:
所有M365登录必须来自合规设备;
阻止从未知国家/地区的登录;
对高风险操作(如修改邮箱转发规则)要求FIDO2硬件密钥。
PowerShell示例:
New-AzureADMSConditionalAccessPolicy -DisplayName "Block Non-Compliant SVG Risk Logins" `
-State "enabled" `
-Conditions @{
Applications = @{IncludeApplications = "All"}
Users = @{IncludeUsers = "All"}
ClientAppTypes = @("browser", "mobileAppsAndDesktopClients")
Locations = @{IncludeLocations = "All"; ExcludeLocations = @("Trusted_IPs")}
} `
-GrantControls @{
Operator = "AND"
BuiltInControls = @("compliantDevice", "approvedApplication")
AuthenticationStrength = "FIDO2"
}
5.3 身份强化层:强制FIDO2硬件密钥
推动关键岗位(如IT管理员、财务人员)使用YubiKey、Feitian等FIDO2安全密钥。此类密钥基于公钥加密,无法被钓鱼页面窃取,从根本上阻断凭据盗用。
5.4 意识训练层:视觉指纹与域校验教育
开展专项培训,教导员工识别:
微软官方域名仅为 *.microsoft.com、*.office.com、*.azure.com;
任何要求输入银行卡信息的“安全验证”均为诈骗;
浏览器地址栏应始终显示绿色锁标与正确域名。
可开发内部工具,在员工访问可疑链接时弹出教育提示:
// 浏览器扩展示例:检测非官方M365域名
chrome.webNavigation.onBeforeNavigate.addListener((details) => {
const url = new URL(details.url);
const trustedDomains = [
'login.microsoftonline.com',
'portal.office.com',
'outlook.office365.com'
];
if (!trustedDomains.includes(url.hostname)) {
if (url.pathname.includes('/signin') || url.search.includes('login')) {
alert('⚠️ 非官方登录页面!请确认网址是否为 Microsoft 官方域名。');
}
}
});
6 结论
本文系统研究了基于SVG脚本注入的Tykit钓鱼攻击对M365生态的威胁。研究表明,攻击者通过格式滥用、UI仿冒与心理诱导的组合策略,有效绕过传统邮件安全与身份验证机制。防御不能依赖单一技术手段,而需构建覆盖内容处理、访问控制、身份认证与用户认知的纵深体系。
技术上,主动剥离SVG脚本、启用深度沙箱可阻断初始载荷;策略上,强制FIDO2与条件访问能大幅提高攻击成本;管理上,针对性安全意识训练可降低人为失误率。未来工作将探索基于机器学习的SVG行为异常检测模型,并推动邮件标准组织(如IETF)对可执行图像格式实施更严格的默认安全策略。
在云协作成为基础设施的今天,安全防护必须从“边界防御”转向“数据与身份为中心”的零信任架构。唯有如此,方能在不断演化的钓鱼威胁中守住企业数字资产的核心防线。
编辑:芦笛(公共互联网反网络钓鱼工作组)
986

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



