应急响应篇写的是主机侧排查,这篇是一次供应链投毒事件的完整应急复盘(2026 年 3 月,安全团队报告)——样本分析、威胁情报、C2 定位的全套流程都在,方法论价值极高。
0x01 事件概述
| 项 | 内容 |
|---|---|
| 事件 | Apifox 官方 CDN 上的埋点 JS 被投毒 |
| 受影响 | Apifox 桌面版(Electron)< 2.8.19 |
| 载体 | cdn.apifox.com/www/assets/js/apifox-app-event-tracking.min.js(34KB → 投毒后 77KB) |
| 危害 | 三阶段攻击链,窃取 SSH 私钥、Git 凭据、Shell 历史 |
| 放大器 | Electron 未严格启用 sandbox 且暴露 Node.js 接口——JS 直接获得文件读取/命令执行/网络通信能力 |
供应链投毒的可怕之处:恶意代码跟着”合法更新”分发到每一个客户端,不需要任何 0day。
0x02 第一步:样本已消失?去 Wayback 挖
应急时的第一个障碍:事件披露时 CDN 上的投毒文件已被替换,所有恶意链接失效。
解法是Internet Archive(Wayback Machine):按投毒时间窗搜归档快照,成功拿到 2026-03-05 的完整投毒版本。文件结构一目了然:
- 前半 ~34KB:Apifox 合法的埋点代码(原样保留,掩护);
- 后半 ~43KB:以
_0x10e4()开头的高度混淆代码(恶意载荷)。
经验:投毒样本的取证不必依赖攻击者基础设施存活,Web Archive 是被严重低估的样本库。
0x03 第二步:反混淆——AI 时代的标准作业
载荷混淆五件套:字符串数组+旋转洗牌、RC4 字符串加密(运行时解密)、代理函数包装运算调用、十六进制数字常量、反调试自检(检测代码被格式化/修改即死循环)。
人工硬啃成本极高,报告的做法是AI 辅助完整反混淆与语义还原,提取出的关键情报:
| 项 | 值 |
|---|---|
| C2 | https://apifox.it.com/public/apifox-event.js |
| 滥用的合法接口 | api.apifox.com/api/v1/user |
| 轮询间隔 | 30 分钟 ~ 3 小时随机(避开流量基线) |
| 数据外传 | RSA 2048(PKCS8,256 字节块)加密 |
| 指纹缓存 | localStorage _rl_headers / _rl_mc |
0x04 第三步:C2 已下线?空间测绘 + 证书搜索
C2 域名 apifox.it.com 已无法解析。社区师傅的思路:Quake 空间测绘搜证书——cert:"apifox.it.com" 直接命中存活资产:
- IP:
13.192.121.27(AWS 东京 EC2,nginx + Express); - 直接访问 IP 返回 404:C2 对未绑定域名的请求做了过滤;
- 绑定 hosts 后访问返回 200 但响应体为空:C2 校验请求中的自定义 HTTP 头(反混淆代码里挖出的
_rl_headers等字段),缺头不响应。
于是复现攻击的最后一步:按恶意代码的构造逻辑补齐请求头,成功让 C2 返回第二阶段载荷。整套”反混淆拿协议 → 测绘找基础设施 → 构造请求要样本”的流程闭环了。
0x05 可复用的方法论清单
- 样本取证:CDN/链接死了先查 Wayback,投毒文件几乎都有归档窗口;
- 反混淆:字符串加密类混淆交给 AI 还原语义,重点提取 C2/协议头/加密方案三类信息;
- C2 定位:域名死≠基础设施死,证书搜索(Quake/Censys/Shodan)是第一抓手;
- 对抗”沉默 C2”:C2 校验自定义头才响应——答案就在反混淆出的代码里,逐字段复刻即可;
- 防守侧:Electron 应用必须开 sandbox、收敛 Node 接口暴露面;企业侧对第三方 JS 资源做完整性监控(哈希基线),埋点文件体积翻倍这种异常值得一条告警。
相关旧文
- 应急响应实战与项目复盘
- AI Agent 渗透测试(AI 辅助分析的同一方法论)