攻击窗口: 2026-03-04 ~ 2026-03-22 (18天) 影响范围: 所有在此期间启动过 Apifox 桌面版的用户 (Windows / macOS / Linux) 风险等级: 🔴 严重 (Critical)
2026年3月4日至22日,API 协作平台 Apifox 的 CDN 资源遭到供应链投毒攻击。攻击者篡改了 CDN 上的 apifox-app-event-tracking.min.js 文件(从 34KB 膨胀至 77KB),在合法代码后追加了约 42KB 的混淆恶意代码。
由于 Apifox 桌面版基于 Electron,恶意脚本在 Node.js 环境中运行,具备完整的文件系统和网络访问权限,可以窃取 SSH 密钥、Git 凭据、Shell 历史、K8s 配置等敏感信息,并通过远程代码执行机制运行攻击者下发的任意代码。
恶意脚本会在 Electron 的 localStorage(LevelDB)中写入 _rl_mc(机器指纹)和 _rl_headers(采集信息缓存)。即使你已更新 Apifox 到最新版本,这些标记仍然存在,是最可靠的历史感染指标。
grep -arlE "rl_mc|rl_headers" ~/Library/Application\ Support/apifox/Local\ Storage/leveldbSelect-String -Path "$env:APPDATA\apifox\Local Storage\leveldb\*" -Pattern "rl_mc","rl_headers" -List | Select-Object Path如果以上命令输出了具体文件路径 → 确认中招,请立即按下方指引处理。
如果无输出,则表示未发现感染标记。但若你确信在攻击窗口期间使用过 Apifox 桌面版,仍建议运行本仓库的完整检测脚本进行深度排查。
├── payload/ # 恶意代码样本 (仅供安全分析,请勿执行)
│ ├── 01-deobfuscated-malicious-payload.js # C2 beacon 还原代码 (持久化远控)
│ ├── 02-apifox-event.js # Stage-1 加载器 (344字节)
│ └── 03-02ab429d.js # Stage-2 v1 信息窃取 (~3400字节)
│
├── macOS/
│ ├── check_compromised.sh # 中招检测脚本
│ └── check_leaked_info.sh # 泄露信息评估脚本
│
├── Windows/
│ ├── check_compromised.ps1 # 中招检测脚本
│ └── check_leaked_info.ps1 # 泄露信息评估脚本
│
├── LICENSE
└── README.md
# 1. 检测是否中招
chmod +x macOS/check_compromised.sh
sudo bash macOS/check_compromised.sh
# 2. 如果中招,评估泄露范围
chmod +x macOS/check_leaked_info.sh
bash macOS/check_leaked_info.sh以管理员权限打开 PowerShell:
# 允许执行脚本 (仅当前会话)
Set-ExecutionPolicy -Scope Process Bypass
# 1. 检测是否中招
.\Windows\check_compromised.ps1
# 2. 如果中招,评估泄露范围
.\Windows\check_leaked_info.ps1CDN 投毒 (篡改 JS 文件)
│
▼
Apifox 桌面版启动时加载恶意脚本
│
├── 采集机器指纹 (MAC/CPU/主机名/用户名/OS → SHA-256)
├── 窃取 Apifox accessToken → 调用官方 API 获取用户邮箱/用户名
│
▼
向 C2 服务器 (apifox.it.com) 发送指纹信息
│
▼
C2 返回 RSA 加密的 Stage-1 加载器 (344字节)
│
▼
Stage-1 动态加载一次性 Stage-2 脚本 (随机路径,加载后自删除)
│
├── [Stage-2 v1] 窃取 SSH密钥 / Shell历史 / Git凭据 / 进程列表
├── [Stage-2 v2] 额外窃取 K8s配置 / npm凭据 / SVN配置 / 目录结构
│
▼
数据加密外传: JSON → Gzip → AES-256-GCM(密码:apifox/盐值:foxapi) → Base64
│
▼
上传至 C2: /event/0/log (v1) 或 /event/2/log (v2)
│
▼
每 30分钟~3小时 轮询 C2,支持远程下发并执行任意代码
入口恶意代码采用了 7 层混淆保护:
- 字符串数组旋转 — 所有字符串抽取到数组并随机旋转
- Base64 + RC4 双层解密 — 字符串运行时解密
- 代理函数 — 间接调用隐藏真实逻辑
- 十六进制算术混淆 — 数值运算替换为十六进制表达式
- 控制流扁平化 —
switch-case打乱执行顺序 - 死代码注入 — 插入无效分支干扰分析
- 反调试陷阱 — 检测 DevTools 和调试器
| 特征 | 说明 |
|---|---|
| 域名伪装 | apifox.it.com — .it.com 并非意大利 ccTLD,而是商业二级域名服务,无公开 WHOIS 信息,易被误认为官方域名 |
| 一次性载荷 | Stage-2 URL 为随机 8 位 hex 路径,加载后 DOM 标签自动删除,增加取证难度 |
| RSA 私钥外泄 | 攻击者将 RSA-2048 私钥硬编码在客户端,使安全研究人员能解密全部 C2 通信 (设计失误) |
| 多版本迭代 | 攻击期间观察到至少 10 次不同 Stage-2 载荷下发 (v1→v2 功能持续增强) |
| 代码矛盾 | 入口 7 层混淆 + 反调试,但 Stage-2 保留完整中文注释,暗示可能非同一开发者编写 |
| 目标 | macOS/Linux | Windows |
|---|---|---|
~/.ssh/ 全部文件 (含私钥) |
✅ | ✅ |
.zsh_history / .bash_history |
✅ | - |
.git-credentials |
✅ | - |
ps aux 进程列表 |
✅ | - |
tasklist 进程列表 |
- | ✅ |
| 目标 | macOS/Linux | Windows |
|---|---|---|
~/.kube/ (K8s 配置) |
✅ | ✅ |
~/.npmrc (npm token) |
✅ | ✅ |
| SVN 凭据 | ✅ | ✅ |
| 目录树结构 | ✅ | ✅ |
| 目标 | 全平台 |
|---|---|
| Apifox accessToken | ✅ |
| Apifox 用户邮箱/用户名 | ✅ |
| 系统指纹 (MAC/CPU/主机名/用户名/OS) | ✅ |
| C2 远程代码执行 | ✅ |
| 类型 | 值 |
|---|---|
| C2 域名 | apifox[.]it[.]com |
| C2 IP (Cloudflare) | 104.21.2.104, 172.67.129.21 |
| 被篡改文件 | hxxps://cdn[.]apifox[.]com/www/assets/js/apifox-app-event-tracking.min.js |
| Stage-1 URL | hxxps://apifox[.]it[.]com/public/apifox-event.js |
| Stage-2 URL | hxxps://apifox[.]it[.]com/<随机8位hex>.js |
| 数据回传 (v1) | hxxps://apifox[.]it[.]com/event/0/log |
| 数据回传 (v2) | hxxps://apifox[.]it[.]com/event/2/log |
| 被滥用的合法 API | hxxps://api[.]apifox[.]com/api/v1/user |
| 类型 | 值 |
|---|---|
| localStorage 标记 | _rl_headers, _rl_mc |
| 异常 HTTP 头 | af_uuid, af_os, af_user, af_name, af_apifox_user, af_apifox_name |
| AES 加密参数 | 密码: apifox, 盐值: foxapi, 算法: AES-256-GCM, IV: 12字节随机 |
| 密钥派生 | crypto.scryptSync("apifox", "foxapi", 32) |
| 被篡改文件大小 | 77KB (正常: 34KB) |
投毒版本已被存档,可用于比对分析:
https://web.archive.org/web/20260305160602/https://cdn.apifox.com/www/assets/js/user-tracking.min.js
如果确认中招,请按优先级依次执行:
-
轮换所有 SSH 密钥
# 生成新密钥 ssh-keygen -t ed25519 -C "your_email@example.com" # 在所有平台更新公钥 (GitHub/GitLab/服务器) # 检查服务器 authorized_keys 是否被注入后门密钥
-
撤销所有 Git Token
- GitHub: Settings → Developer settings → Personal access tokens → 全部 Revoke
- GitLab: Preferences → Access Tokens → 全部 Revoke
- 删除明文凭据:
rm -f ~/.git-credentials
-
轮换 K8s 凭据 (如果使用 Kubernetes)
- 重置
~/.kube/config中的 OIDC token 和客户端证书 - 审计集群操作日志
- 重置
-
轮换 npm Token (如果使用 npm 私有包)
npm token revoke <token> npm login
-
在 Apifox 中注销并重新登录 (刷新 accessToken)
- 检查 GitHub/GitLab 安全日志 (异常 Deploy Key / OAuth 授权 / 异常地区登录 / 异常 Push)
- 检查服务器 SSH 登录日志:
last -i/grep sshd /var/log/auth.log - 轮换 Shell 历史中暴露的所有密码/Token/API Key
- 清除 SVN 缓存凭据:
rm -rf ~/.subversion/auth/
- 更新 Apifox 到最新版本
- 清理 Apifox 历史数据:
rm -rf ~/Library/Application\ Support/apifox/(macOS) 或删除%APPDATA%\apifox\(Windows) - 清理 Shell 历史:
rm -f ~/.zsh_history ~/.bash_history - 启用所有平台的两步验证 (2FA)
- 对 SSH 私钥添加密码保护:
ssh-keygen -p -f ~/.ssh/id_ed25519
已捕获的 Stage-2 v1/v2 仅为侦察阶段。该攻击架构支持任意后续攻击,包括后门植入、横向移动和定制化精准打击。
高价值目标(拥有生产集群权限、npm 发包权限、大型仓库管理权限的开发者)可能已遭受远超凭据窃取的深度入侵,应按**"已失陷"最高级别**进行应急响应。
本仓库中的恶意代码样本(payload/ 目录)仅供安全研究和分析使用,请勿执行。检测脚本仅在本地运行,不会上传任何数据。使用者应自行承担使用风险。