研究报告 · 约 33,989 字 · 预计推送 4 部分

软件供应链攻击链拆解:依赖混淆、恶意包、维护者账号被盗与构建系统投毒 —— 横纵综合报告 未开始

目录

题记与说明

课题:软件供应链攻击链拆解:依赖混淆、恶意包、维护者账号被盗与构建系统投毒
报告类型:横纵综合报告(最终稿——已按独立审读意见逐条修订)
成文日期:2026-10-31(初稿);2026-10-31(修订为最终稿)
输入材料:本文由同课题两份章节稿综合而成——纵轴稿(parts/2026-10-31-软件供应链攻击-vertical.md,基于当日 16 组关键词的 WebSearch 调研)与横轴稿(parts/2026-10-31-软件供应链攻击链拆解-依赖混淆-恶意包-维护者账号被盗-构建系统投毒-horizontal.md,基于 WebFetch 直接抓取 + WebSearch 摘要 + 既有知识三级标注的调研)。两稿之间的事实口径差异(事件日期、包数统计、来源层级、分类归属)已按保守口径合并,并在附录 A 逐条记录消解方式。
修订说明:最终稿按 8 条独立审读意见逐条修订(2026-10-31):① 统一 2.4.2 矩阵解读与 3.1 判断二的 A+E/A+E+C 口径;② 微软 2026-05 披露包数按保守口径统一为 33(45 的更新口径检索未见独立来源,见附录 A 第 4 条);③ "CVE/SCA 企业采购最多"降格为判断性表述(未检索到采购占比统计);④ XZ Utils 补"维护者接管×构建产物投毒"跨链归属说明;⑤ 为 @redhat-cloud-services、Unit 42 威胁图景、keyv/ChainDrop、OMB M-26-05、npm 2027 封禁口径、Socket 融资补充来源链接,无来源事实显式标注"既有知识";⑥ 判断三"四起事件/3 个月落地"改为与正文一致的口径;⑦ 修正 npmjs.help 域名表述、SLSA v0.1、刷量识破等病句;⑧ 补附录 B 术语表、时间线类别注、2.5 第 5 条性质注;附录 A 与附录 B 构成附录块,参考来源保持为全文最后一节。
证据边界:初稿写作时未做新的联网检索,事实继承自上述两份章节稿;最终稿修订时为落实审读意见做了少量补充检索,新增来源在正文与"参考来源"末组中以链接标注(主要涉及 @redhat-cloud-services、Unit 42 威胁图景、keyv/ChainDrop、OMB M-26-05、npm 2027 封禁口径、Socket 融资),其余事实仍继承初稿的来源层级,个别无来源事实已显式标注"既有知识"。每条关键事实保留其检索所得的原始来源链接,读者应以所引链接为准。

TL;DR

软件供应链攻击的杠杆始终指向"被信任的自动化":从 Thompson 编译器后门,到 XcodeGhost、event-stream、SolarWinds、XZ Utils,再到 2025 年 Shai-Hulud 自复制蠕虫,攻击面从代码迁移到身份、CI/CD 乃至 AI 工具链。四条攻击链性格迥异:依赖混淆成本最低,恶意包靠数量取胜(2025 年新增 45 万+),账号被盗单点失守即全下游沦陷,构建投毒最难检测且潜伏最深。近两年的关键变化是四链融合为"账号×恶意包×构建"复合体,拆链研究从分类学变为断链点定位学。防御侧没有任何单一路线有效:企业采购中最受倚重的 CVE/SCA(业界普遍观察,属判断性表述而非采购统计)对投毒整体盲视,最优组合是"来源证明+入口与运行时管控+行为分析";行业范式正从声誉信任迁移到密码学可证明。


一、纵轴:发展脉络(1984–2026)

1.1 概念锚点:这个课题"诞生"于何处

软件供应链攻击作为一个技术概念,公认的思想起点是 Ken Thompson 1984 年的图灵奖演讲《Reflections on Trusting Trust》:他在 C 编译器中植入自我复制的后门,证明即使逐行审计源码也无法信任编译产物——这是"构建系统投毒"的理论原型(ACM 原文 DOI)。

但它作为真实世界的大规模威胁被行业正视,通常从三个标志性节点算起:

  1. 2015 年 XcodeGhost:攻击者把带毒的苹果 Xcode 开发工具(安装包约 4GB,官方源在中国下载极慢)散布到中文网盘,开发者用它编译出超过 4000 款含恶意代码的 iOS 应用并通过 App Store 审核,受害应用包括微信、滴滴打车等,波及上亿用户(Threatpost)。
  2. 2018 年 npm 生态连环事件:event-stream 后门与 eslint-scope 维护者令牌失窃,让"开源注册表也能被武器化"成为开发者社区的主流认知。
  3. 2020 年 12 月 SolarWinds SUNBURST:国家级攻击者攻入 Orion 构建系统,在官方签名更新中投放后门,供应链攻击自此进入国家级威胁清单(FireEye 首次披露、SolarWinds 调查、CISA AA20-352A)。

本课题覆盖的四条攻击链——依赖混淆、恶意包投毒、维护者账号被盗、构建系统投毒——在 2021 年前后基本全部"实名化",并在之后五年里持续演化、互相叠加。

1.2 阶段一(1984–2015):理论奠基与第一次实战

这一阶段的驱动因素极具代表性:基础设施(官方下载源)在部分地区体验差 → 开发者自发寻找镜像 → 攻击者恰好填上这个"信任真空"。此后每一个阶段,驱动因素几乎都是同一句反问:开发者最信任什么,就投毒什么。

1.3 阶段二(2016–2019):注册表生态的"地震期"——恶意包与账号盗取登场

此阶段的结构性矛盾浮出水面:开源维护"单点人格化"(一个邮箱、一个令牌 = 发布权)叠加依赖图的无信任传递;npm 开始收紧下架政策、推动令牌与 2FA 改进,但整体仍是"事后灭火"。攻击端也从 opportunistic 的勒索/挖矿转向金融定向攻击。

1.4 阶段三(2020–2021):国家级警报与"依赖混淆"的命名之年

这是本课题最重要的分水岭:"软件供应链安全"从开发者话题升级为国家议题,四条攻击链全部得到正式命名或定性。

这一阶段的驱动因素:SolarWinds 让"攻击者不需要打穿你的网络,只需要打穿你的供应商"成为共识;赏金经济让高杠杆的供应链漏洞变成职业研究者的主业;远程办公普及放大了 CI 凭据的价值。

1.5 阶段四(2022–2023):投毒工业化、"抗议软件"与防御框架成形

驱动因素:加密货币价格波动驱动窃密恶意包的商业化;地缘战争把开源仓库变成表达与攻击的双重阵地;EO 14028 与 Log4Shell(2021-12)后的 SBOM 热潮让"可证明的构建"成为平台竞相提供的功能。

1.6 阶段五(2024):社会工程学登顶之年

驱动因素:关键开源项目"一个人的图书馆"模式难以为继(Lasse Collin 的倦怠正是 Jia Tan 的切入点);npm 2024 年公开披露维护者邮箱泄露事件,钓鱼情报在地下市场明码标价(来源层级注:既有知识,本次修订检索未见直接来源链接)——攻击者开始系统化地经营"人",而不是"代码"。

1.7 阶段六(2025):蠕虫元年与 AI 武器化

驱动因素:AI 编程助手普及 = 每台开发机上都有能读懂代码、有权限遍历文件的新攻击面;令牌长期驻留 CI 使一条钓鱼足以引发生态级连锁;蠕虫证明"供应链攻击可以像蠕虫病毒一样自增殖",倒逼平台把安全从建议改为强制。

1.8 阶段七(2026–当下):蠕虫常态化与平台强制安全(截至 2026-10-31)

驱动因素:攻击重心从"发布一次性毒包"转向"攻占 CI/CD 执行层(Actions 漏洞链、缓存投毒、扩展投毒)+ 蠕虫化自增殖";防御重心从"开发者自觉"转向"平台默认强制"(2FA/passkey、OIDC trusted publishing、安装脚本默认禁用)。

1.9 时间线速查表

时间事件攻击链类型来源
1984Thompson《Trusting Trust》理论奠基ACM
2015-09XcodeGhost(4000+ 应用)构建工具链投毒Threatpost
2016-03left-pad 下架风波生态脆弱性The New Stack
2017-08crossenv 等 38 个仿冒包恶意包/typosquattingnpm 博客
2018-07eslint-scope 令牌窃取维护者账号被盗ESLint
2018-11event-stream 后门维护者接管+定向攻击取证文章
2019-01PEAR 安装器被替换注册站投毒The Hacker News
2020-12SolarWinds SUNBURST构建系统投毒(国家级)FireEye
2021-02Birsan 依赖混淆披露(赏金 13 万美元+)依赖混淆原文
2021-04Codecov 脚本被篡改(潜伏约 2 个月)CI 管道投毒Codecov
2021-05EO 14028 / SBOM政策里程碑NIST
2021-10/11ua-parser-js;coa/rc账号接管连环案CISA
2022-03node-ipc/peacenotwar维护者自投毒(抗议)Snyk
2022-05PyPI ctx账号冒充接管Sonatype
2022-12torchtriton 依赖混淆依赖混淆PyTorch issue
2023-04SLSA v1.0(规范现已演进至 v1.2)防御框架slsa.dev
2024-03XZ Utils 后门项目/维护者接管(国家级)*跨链注:后门本体注入发布 tarball 构建产物,同时属构建产物投毒,见 2.2.3oss-security
2024-06polyfill.io资产转手+CDN 投毒Sonatype
2024-11PyPI attestation 上线(PEP 740)防御里程碑PyPI
2025-08Nx s1ngularity(AI CLI 滥用)CI 漏洞→发布令牌被盗Wiz
2025-09-08chalk/debug 钓鱼(20 亿周下载,连 TOTP 一并被钓走)钓鱼接管Wiz
2025-09-14Shai-Hulud 蠕虫(100–500+ 包)自复制蠕虫CISA
2025-09-23npm 安全计划;10-13 token 限寿;12-09 classic 吊销平台强制安全GitHub、Socket
2025-11-23Shai-Hulud 2.0(约 40 万密钥外泄)蠕虫第二波StepSecurity
2026-03TeamPCP 级联;axios RAT;LiteLLMCI 链投毒/账号接管Zscaler
2026-05TanStack/Mini Shai-Hulud(150+ 版本,320+ 包波次);微软两份披露;RHSB-2026-006Actions 漏洞链+缓存投毒/依赖混淆侦察/扩展投毒Wiz、Microsoft、Red Hat
类别注:本表"攻击链类型"列采用宽口径标注,与 2.2 节的四链分类体系(依赖混淆、恶意包、维护者账号被盗、构建系统投毒)不完全对齐。其中"依赖混淆/恶意包/维护者账号被盗/构建系统投毒/构建工具链投毒"属四链及其近义标注;"理论奠基/生态脆弱性/政策里程碑/防御框架/防御里程碑/平台强制安全"属背景与防御侧里程碑,不是攻击链;"CI 管道投毒/注册站投毒/资产转手+CDN 投毒/自复制蠕虫/钓鱼接管/账号接管连环案/维护者自投毒"属跨链或派生形态。非四链标注仅为保留事件语境,不参与 2.4.2 的防御覆盖矩阵。

1.10 纵轴贯穿性规律

  1. 攻击杠杆永远指向"被信任的自动化":编译器(1984)→ 开发工具(2015)→ 安装脚本(2017)→ 维护者身份(2018–2024)→ CI/CD(2021–2026)→ AI CLI(2025)。每次防御补上一环,攻击就移向信任链的下一环。
  2. 命名催生防御:依赖混淆在 2021 年被命名后,各生态的混淆面在 1–2 年内快速收敛;蠕虫在 2025 年被命名后,npm 的强制安全(trusted publishing/2FA/脚本默认禁用)在 3 个月内公布并启动执行(纯令牌发布封禁要到 2027 年初才完成)——公开披露本身就是最强的防御催化剂。
  3. 成本不对称在恶化:一次 TOTP 钓鱼可换取 20 亿周下载的分发权;一条被蠕虫偷走的令牌可自增殖到数百个包。防御必须默认"单点身份必然失守"。
  4. 防御的终点是"可证明"而非"可信任":从 npm 博客式的"请及时改密码"(2018),到 SLSA/attestation/trusted publishing 的"密码学证明这条包是谁在哪条流水线上构建的"(2023–2026),行业完成了从声誉信任到证据信任的范式迁移。

二、横轴:横向对比(时间截面 2026-10-31)

2.1 威胁量级:为什么防御路线必须换

2025 年 9 月之前,"软件供应链攻击"通常被当作单一话题讨论;2025 年 9 月至 2026 年 6 月,npm/PyPI 生态连续爆发了一组可明确归类到四条不同攻击链的事件(Shai-Hulud 蠕虫、chalk/debug 钓鱼入侵、TanStack CI 缓存投毒、微软披露的依赖混淆侦察包等),使得在当下时间截面做横向对比有了难得的同期样本。

宏观量级(Sonatype 2026 年报告,覆盖 2025 全年):新发现恶意开源包 454,600+ 个,同比增长 75%,累计已识别/拦截恶意包超过 123.3 万个(覆盖 npm、PyPI、Maven、NuGet、Hugging Face);其中约 99% 集中在 npm;2026 年一季度又新增 21,764 个,平均每六分钟一个(Sonatype State of the Software Supply Chain 2026)。这个量级决定了:任何只依赖"事后下架 + CVE 库匹配"的防御路线都已不够用——这是下面三层对比的现实约束。

2.2 层一:四条攻击链横向对比

2.2.1 对比总表

维度依赖混淆恶意包(typosquat/伪装)维护者账号被盗构建系统投毒
攻击入口包管理器的版本解析规则开发者/CI 的搜索与引入行为维护者本人的凭证与身份CI/CD 流水线、构建节点、构建脚本
前置条件目标内部包名在公共源未注册;配置未锁定私有源优先存在可被模仿的知名包名或可蹭的热点维护者开启弱 2FA/被钓鱼;注册商/邮箱侧失守Actions 可被 fork 触发、缓存可写、秘密暴露于 runner 内存
攻击成本低(注册包名即可),侦察型成本极低中低(批量自动化),规模化依赖脚本中(钓鱼基础设施 + 域名注册)高(需理解目标 CI 细节),但蠕虫化后边际成本递减
潜伏与持续性一次性触发型(install 即执行)可长期潜伏,靠量取胜发布恶意版本后依赖版本残留最深:可回溯篡改历史 tag/缓存,或如 XZ 般经营两年
典型影响面开发者终端、构建网络(内网横向)终端用户与 CI,量大面广单包背后全部下游(可达 20 亿周下载)全部信任该构建产物的下游,含发行版/企业产品
检测难度低-中(版本号异常、来源异常易发现)中(量大、混淆强时难)中高(发布走合法凭证,pip hash 校验都能通过)高(XZ 藏在编译产物中;TanStack 用合法 OIDC 令牌发布)
代表事件Birsan 2021(13 万美元赏金);微软 2026-05 披露的 33 包侦察活动Sonatype 2025 年统计的 45.46 万新恶意包;crossenv 2017chalk/debug 2025-09;axios 2026-03;eslint-scope 2018SolarWinds 2020;XZ Utils 2024(跨链样本,见 2.2.3);tj-actions 2025-03;TanStack 2026-05

2.2.2 逐项说明(事件细节见纵轴对应年份,此处只补对比所需增量事实)

(1)依赖混淆:规则漏洞型,成本最低、最"自动化"。 奠基事件是 Birsan 2021(纵轴 1.4 节)。五年后这条链并未消失反而升级:微软 2026-05-29 披露的 33 个恶意 npm 包是典型新形态——伪造企业命名空间 + 超高版本号 + 带"侦察/完全利用"远程开关的载荷,说明攻击者已把依赖混淆从"一次性进入内网"进化为"长期驻留的可切换侦察桩"(Microsoft Security Blog)。

(2)恶意包:数量型,防御重心在"引入前行为分析"。 这是规模最大的一条链(Sonatype 口径见 2.1 节);报告同时指出攻击者正从简单 typosquatting 转向"多阶段载荷链、自传播蠕虫、滥用仓库平台功能"(Sonatype 2026)。Shai-Hulud 既是恶意包链的巅峰,也是账号被盗链的放大器——两链融合的标志性样本(见 2.2.3 小结)。

(3)维护者账号被盗:身份型,单点失守即全下游沦陷。 代表事件 chalk/debug(纵轴 1.7 节)的最初失守点不是 npm 本身,而是注册商/邮箱侧的钓鱼;axios(2026-03)则展示了"改邮箱→直发"的绕道打法。两案共同点:发布走合法凭证,传统校验全部失效。

(4)构建系统投毒:纵深型,最难检测、影响面最深。 除 SolarWinds(国家级、构建服务器注入)与 XZ(两年社会工程)外,2025–2026 年出现了 CI 层面的两条新变体:tj-actions/changed-files(CVE-2025-30066,2025-03-14)——该 GitHub Action 的全部历史版本 tag(v1–v45.0.7)被回溯改指向恶意提交,转储 runner 内存中的 GITHUB_TOKEN 与云密钥到构建日志,波及约 2.3 万个仓库,源头可能是关联 Action reviewdog/action-setup 被入侵,由 StepSecurity Harden-Runner 的出网遥测发现(GitHub Advisory GHSA-mrrh-fwg8-r2c3、Wiz 分析、CISA);以及 TanStack/Mini Shai-Hulud(2026-05)——不偷任何凭证,纯靠 Actions 漏洞链(fork 改名规避检测、pull_request_target 执行 fork 代码、Actions 缓存投毒)+ runner 内存提取 OIDC 令牌完成投毒(Wiz、Snyk、OpenAI 响应)。这条链正在从"人力经营两年"(XZ)进化为"自动化漏洞链 + 蠕虫化"(TanStack/TeamPCP)。

2.2.3 层一小结:成本-纵深光谱与链式融合

四条链构成一个"成本-纵深"光谱:依赖混淆最便宜、最易检测;恶意包靠数量取胜;账号被盗单点影响最大且检测窗口极短;构建系统投毒最难检测、潜伏最深。2025–2026 年的最重要变化是四条链开始融合:Shai-Hulud 本质上是"账号被盗→恶意包→窃取令牌→再发布"的链式组合;TanStack 是"构建投毒→OIDC 令牌→恶意发布"的组合。拆链研究的价值因此从"分类学"变成了"断链点定位学"。

跨链样本说明(XZ Utils 的归属):XZ Utils 在 1.9 时间线中归入"项目/维护者接管",而在 2.2.1/2.2.2(4) 又被列作构建投毒的代表事件——因为它是一个典型的跨链样本:入口是维护者接管("Jia Tan" 以两年社会工程取得共同维护者身份与发布权),落点是构建产物投毒(后门只注入发布 tarball 而非 git 主干)。本报告把它列作构建投毒代表事件时,取的是"构建产物被污染"这一环节,不否认其账号/身份侧入口;时间线表已加注对应说明。同理,TanStack 是"构建投毒×恶意发布"、Shai-Hulud 是"账号被盗×恶意包×蠕虫自增殖"的跨链样本。

2.3 层二:与相邻/替代研究课题的横向对比

相邻课题关注对象核心问题与本课题的关系立足 2026 截面的评价
CVE 漏洞利用链(Log4Shell 式)已发布组件中的非故意缺陷漏洞如何被发现与武器化同属"上游引入风险",但漏洞是意外、供应链攻击是蓄意,检测逻辑完全不同传统 SCA 以 CVE 库为核心,对"没有 CVE 的恶意版本"(如 LiteLLM 1.82.8)完全盲视;本课题与其互补而非替代
提示注入与 Agent 安全LLM/Agent 的运行时输入面不可信内容如何劫持 agent交互面在"运行时",本课题在"引入时"两课题在 AI 时代交汇:恶意包开始针对 .claude/、.vscode/ 目录下手(TanStack 事件中 Wiz 明确建议审计这两个目录),Agent 自动安装依赖又反向放大恶意包面
身份与凭证安全PAT/令牌/OAuth 全生命周期凭证如何泄露与滥用是本课题第 3、4 条链的"因"2025–2026 事件几乎都终结于"凭证被偷/令牌滥用";npm 2025-10-13 起 granular token 最长 90 天(默认 7 天)、2025-12-09 吊销全部 classic token,正是两个课题的交叉产物
AI 模型供应链(Hugging Face 投毒)模型权重、数据集、MCP/Skill 资产模型文件与提示层被植入恶意行为同构问题在新介质上的迁移Sonatype 2026 报告已把 Hugging Face 纳入统计范围;方法论高度可迁移(来源证明、行为扫描),属于本课题的自然外延
容器镜像/制品仓库安全镜像层、基础镜像、制品库制品被篡改或投毒本课题第 4 条链在容器场景的投影逻辑同构(谁来证明制品出自可信构建),防御工具同源(签名 + 准入策略),可合并治理

层二结论:本课题的不可替代定位是——它研究的是"信任的入口":其他课题研究"已经进来的东西如何作恶/出洞",本课题研究"那个东西凭什么被允许进来"。2026 年的攻击者已经把主战场从"利用软件缺陷"转向"滥用软件的信任结构"(版本解析规则、维护者身份、CI 缓存),因此该课题处于威胁演化的主轴上,而非相邻课题的子集。

2.4 层三:防御方案体系横向对比

2.4.1 五类防御路线

路线代表方案能力(防什么)成本成熟度主要局限
A. 来源证明/签名类SLSA(现 v1.2,构建轨道 L1–L3)、Sigstore/cosign、npm/PyPI Trusted Publishing(OIDC)、PyPI PEP 740 attestations证明"产物出自可信构建/可信发布者",防凭证滥用与构建篡改中高:需改造发布流程与验证端高:npm 已吊销 classic token 强制迁移;SLSA 规范已到 v1.2(slsa.dev FAQ)不证明"代码本身无害"(合法凭证也能发恶意版本——LiteLLM);验证端落地率仍低
B. 组件清单类(SBOM)CycloneDX / SPDX,签署的 SBOM + SLSA attestation事件响应时快速定位波及面;合规(美 EO 14028 脉络)中:生成自动化程度高,消费端弱高(生成)/中(消费与执行)事后盘点型,不能阻止引入;对"运行时才显现"的恶意行为无感
C. 行为分析类Socket(行为检测 install 脚本/网络/子进程,覆盖 9 生态,2026-05 完成 6000 万美元 C 轮融资、估值 10 亿美元,Thrive Capital 领投(Socket 官方公告))、OpenSSF Package Analysis抓"没有 CVE 的新恶意包",正是恶意包链的主武器低-中(开源项目免费)快速成熟中误报治理成本;对深度混淆(AI 生成载荷)与构建期投毒覆盖有限
D. CVE/SCA 类Snyk、GitHub Dependabot、OWASP Dependency-Check已知漏洞跟踪、许可证合规、升级引导低-中最高(十年成熟度)对四条攻击链整体几乎"零覆盖"——它们防的是缺陷不是投毒
E. 入口与运行时管控类Sonatype Firewall(入口策略门禁)、私有/代理源 + allowlist、CI 出网管控、StepSecurity Harden-Runner(egress 遥测,tj-actions 事件的实际发现者)、Action pin 到 commit SHA在引入与执行两点建立闸门;提供取证数据中-高(策略运营负担)高(企业侧标配)需要组织级纪律;对开发者本机(最常失守处)覆盖最弱

2.4.2 防御 × 攻击链覆盖矩阵(关键交叉洞察)

防御路线依赖混淆恶意包账号被盗构建投毒
A 来源证明/签名◐(源配置校验辅助)◐(证明发布者≠证明安全)●(Trusted Publishing 直击令牌钓鱼收益)●(SLSA L3 隔离 + 证明)
B SBOM○◐(快速止血)◐(快速止血)◐(波及面定位)
C 行为分析◐●◐(发版行为异常可标)◐(缓存/依赖变更可标)
D CVE/SCA○○(恶意包多数无 CVE)○○
E 入口/运行时管控●(私有源优先+锁版本)●(引入闸门+出网管控)◐(发布策略异常告警)●(egress 遥测 + pin SHA)

(● 直接有效 ◐ 部分有效 ○ 基本无效)

矩阵揭示两个事实:第一,没有任何单一路线能同时压住四条链。 CVE/SCA 类(业界普遍观察中企业采购最倚重的一类——判断性表述,本次修订未检索到采购占比统计)对供应链攻击几乎整体无效——这正是 LiteLLM 带毒版本"通过 pip 哈希校验"能成立的原因:哈希校验验证的是"你拿到的是仓库里那份",而仓库里那份本身就是恶意的。第二,A+E(来源证明 + 入口/运行时管控)是唯一在四条链上都有直接有效成分的双路线组合——A 行在账号被盗、构建投毒两列为 ●,E 行在依赖混淆、恶意包、构建投毒三列为 ●,两线合并后四条链上均有 ●,且是唯一做到这一点的两线组合;C 作为恶意包链的前置补充——这与业界 2025 年后收敛出的"SBOM(清单)+ Sigstore(来源)+ SLSA(构建完整性)+ policy-as-code(强制执行)"分层模型一致。

2.5 按事件反推的防御点清单(两章节合并版)

以下清单合并了纵轴稿"结合真实事件总结的防御点"与横轴稿"按事件反推的防御清单",去掉重复项后的完整版本:

  1. Birsan 2021 / torchtriton 2022 → 私有源优先与命名占位:私有包一律使用明确的 registry scope 并逐包显式指定源(npm 的 .npmrc per-scope registry、Artifacts upstream、pip 仅用可信 index);内部包在公共源预防性占位(PyTorch 官方事后做法);锁文件锁定精确版本并 review 新增依赖;CI 中禁用"自动取更高版本"。这是四条链中防御最成熟的一条。
  2. crossenv 2017 / ctx 2022 / 微软 2026-05 typosquat → 让安装动作默认不可信:以 Socket/StepSecurity/Datadog 等行为检测替代纯漏洞库匹配(对 postinstall、网络外传、环境变量读取告警);npm 12 起默认禁用安装脚本、显式审批;锁文件 + 依赖白名单 + 新依赖人工准入;对周下载量异常低的"新包"保持怀疑(刷量制造的虚假流行度同样可被识别);CI 出口流量管控。
  3. eslint-scope 2018 / chalk-debug 2025 / axios 2026 → 身份防线必须"抗钓鱼",且注册商与邮箱治理等同包安全:passkey/WebAuthn 级抗钓鱼 MFA 取代 TOTP/短信(chalk/debug 连 TOTP 都被钓走,社区已有共识);发布走 trusted publishing(OIDC 短时效令牌),CI 中不再存长效 npm/PyPI token;令牌最小权限 + 90 天强制轮换;对"维护者邮箱被改""绕过 CI 直发"设策略告警(axios 的实际路径);发布走组织化双人文审;对"npm 支持"类钓鱼做常态化演练。仿冒支持域名 npmjs.help 在事发前三天(2025-09-05)注册,说明域名注册监控本可预警。
  4. SolarWinds 2020 / Codecov 2021 / tj-actions 2025 / TanStack 2026 → 构建与 CI 全链最小权限 + 可证明构建:GitHub Actions 一律 pin 到完整 commit SHA(tag 可回溯改写);GITHUB_TOKEN 最小权限、对 fork PR 限制 secrets、pull_request_target 收敛;把 Actions 缓存、第三方 CI 组件(coverage 上传脚本、action、扩展)视为可被投毒的代码而非工具;构建密封化(hermetic build)并产出 SLSA provenance / Sigstore 签名 / PyPI attestation / npm provenance,让"这个产物由哪条可信流水线构建"可验证。
  5. TanStack 2026 的响应顺序警告:OIDC 令牌提取自 runner 内存,需要 runner 加固与令牌短时效;事件响应必须先清除 wiper 守护进程、再轮换 GitHub 令牌(Wiz 明确警告顺序颠倒会触发 rm -rf ~/ 毁盘)。(注:本条是事件响应的顺序警示而非事前防御点,与清单其余条目性质不同,故单独保留并加注。)
  6. event-stream 2018 / XZ 2024 → 人的可持续性:关键依赖(尤其个人维护的底层库)纳入 OpenSSF/Alpha-Omega 类资助与关键性评分监护;多名维护者 + 组织背书降低单点接管价值;对突然高频提交、急于接管发布权的贡献者保留警惕与隔离验证;下游采用 vendor/锁文件降低对上游突变的暴露;发行版从源码/非上游渠道构建。
  7. Shai-Hulud 2025 两波 → 蠕虫化要求"令牌最小权限 + 环境隔离":蠕虫靠开发者环境里的长期 npm 令牌自我传播;CI 与本机凭证分离、发布令牌限定到单包、lockfile 审计发布窗口,是切断传播的三个点。
  8. Codecov 2021 / Shai-Hulud / polyfill.io → 假设已沦陷时的止损能力:CI/发布审计日志实时告警(异常发布、异常 tag 移动);订阅 CISA/厂商 IoC 并预设"知名包带毒版本"的应急清单(chalk/debug 的 2 小时止损靠的就是这类监测);密钥自动轮换(短时效 OIDC 本质上把"泄露半径"压到分钟级);SBOM + provenance 让"我是否中招"能在小时级回答,而不是像 Codecov 那样靠两个月的追溯。

三、交叉洞察:两轴结合说明了什么

3.1 五个判断

判断一:主战场已经从"软件缺陷"迁移到"信任结构",本课题位于威胁演化的主轴。 纵轴显示攻击杠杆的迁移路径(编译器→工具→脚本→身份→CI→AI CLI),横轴则显示被利用的全是"信任机制"而非"内存错误":版本解析规则(依赖混淆)、维护者身份(钓鱼)、CI 缓存与 OIDC(构建投毒)。两轴互证:这不是同一战场的不同打法,而是不同战场——它决定了传统漏洞管理范式(扫 CVE、打补丁)对本课题整体失配。

判断二:攻击链已从"分类"走向"融合",防御必须从"单点工具"走向"断链组合"。 2021 年四条链还是四个独立话题;2025–2026 年 Shai-Hulud 是"账号被盗→恶意包→窃取令牌→再发布"的复合体,TanStack 是"构建投毒→OIDC 令牌→恶意发布"的复合体。横轴覆盖矩阵进一步证明单一路线(尤其业界普遍观察中企业采购最倚重的 CVE/SCA 类,判断性表述)对供应链攻击整体盲视;A+E 是唯一在四条链上都有直接有效成分的双路线组合(矩阵口径见 2.4.2),再加上 C 对恶意包链的前置补充,构成当前截面下的最优覆盖(A+E+C)。

判断三:命名催生防御,公开披露是最强的防御催化剂——但窗口期正在缩短。 纵轴的两个时间差是最好的证据:依赖混淆 2021 年被命名后 1–2 年内混淆面快速收敛;Shai-Hulud 2025 年 9 月被命名后,npm 强制安全 3 个月内公布并启动执行(纯令牌发布封禁预计 2027 年初才完成)。但横轴同时显示,2026 年一季度的重大事件至少已有三起(TeamPCP 级联、axios、LiteLLM,见 1.8),加上 4 月 GitGuardian 记录的 48 小时内三起独立投毒,说明转型尚未完成——新防线(未配置 Trusted Publishing 的团队、验证端缺失)与旧手段并存,正是当下最脆弱的窗口期。

判断四:成本不对称仍在恶化,且攻击者的"产品化"程度超过防御者的组织化。 攻击侧出现 AI 生成混淆载荷(chalk/debug、Nx)、蠕虫自增殖(Shai-Hulud 两波)、报复性 wiper(TanStack)、可远程翻转的侦察桩(微软 2026-05 披露);防御侧虽完成了"token 革命",但本质都是把攻击收益降回均值,而非结构性反超。防御必须默认"单点身份必然失守",把重心放在泄露半径与止损速度上。

判断五:防御的终点是"可证明"而非"可信任",且本课题的结论有效期只有 6–12 个月。 从 2018 年"请及时改密码"到 2023–2026 年"密码学证明这条包是谁在哪条流水线上构建的",行业完成了从声誉信任到证据信任的范式迁移(SLSA v1.2、PEP 740、trusted publishing)。同时,与横轴层二中多数相邻课题(漏洞、身份、容器)方法论相对稳定不同,本课题的事件样本在 12 个月内全部刷新过一轮——本报告的对比结论需要以事件为锚点滚动更新。

3.2 对读者的判断与建议

优先级排序(如果只做三件事):第一,把发布凭证换成 OIDC trusted publishing + passkey(直击账号被盗链的全部收益);第二,把 CI 里的 Action pin 到 commit SHA 并把 Actions 缓存纳入威胁模型(直击构建投毒链的新入口);第三,为私有依赖配置 per-scope 源锁定并在公共源占位(成本最低、收益确定的一条)。

分角色建议:

一个反直觉的提醒:防御投入不要按"事件热度"分配,按覆盖矩阵的缺口分配。依赖混淆的防御(per-scope 源锁定)几乎零成本且已被验证,却仍是最常见缺口;而按业界普遍观察(判断性表述,非采购统计),最多的预算往往花在对四条链整体无效的 CVE/SCA 工具上。

3.3 本报告的已知局限


附录 A:两章节矛盾消解记录

综合两份章节稿时发现并按以下方式消解的口径差异:

  1. chalk/debug 涉事包数:纵轴 25 个 vs 横轴 18 个(JFrog 口径)。→ 取"18 个(JFrog 口径;其他统计达 25 个)",两者均为检索所得,无法进一步仲裁。
  2. Shai-Hulud 发现日期与包数:纵轴 2025-09-14、500+ 包 vs 横轴"9 月 15–16 日发现、各家口径 100+ 至 500+"。→ 取"2025-09-14(9 月 15–16 日间被各家发现,口径不一),各家口径 100+ 至 500+ 包"。
  3. Birsan 赏金数额:纵轴"合计数十万美元" vs 横轴"超过 13 万美元"。→ 取更精确的"超过 13 万美元"。
  4. 微软 2026 年 5 月披露:纵轴引 05-28《typosquatted npm packages used to steal cloud CI/CD secrets》(typosquatting 窃凭据),横轴引 05-29《33 恶意 npm 包滥用依赖混淆》。→ 判定为两条独立披露的活动,正文分别列出并保留两个链接,不做合并。包数口径:纵轴稿曾记"后更新至 45 个",最终稿修订检索未见 45 的独立来源(对应链接标题与检索所得口径均为 33),按报告保守口径原则统一取 33。
  5. axios 事件来源层级:纵轴"仅二手来源、细节待一手验证" vs 横轴 Zscaler 直接抓取(含 DPRK 归因、改邮箱、绕开 CI、plain-crypto-js 细节)。→ 采用横轴的直接抓取内容为主线,保留纵轴的"约 89 秒自删"与"1.4 亿周下载"说法并注明出处层级,归因加"据 Zscaler"限定。
  6. SLSA 版本:纵轴"2023-04 v1.0" vs 横轴"现 v1.2"。→ 非矛盾:v1.0 为 2023-04 定稿版本,规范现已演进至 v1.2,正文按时间序表述。
  7. TanStack 事件日期与规模:纵轴"5 月 20 日前后报道的 Mini Shai-Hulud 波及 320+ 包、42 个 TanStack 包" vs 横轴"5 月 11 日事件曝光、150+ 版本(Snyk 口径 42 个 @tanstack 包 / 84 个产物)"。→ 取"5 月 11 日 TanStack 事件曝光(Wiz),5 月 20 日前后 The Hacker News 报道更广波次 320+ 包";规模两种口径并存(150+ 版本 / 42 包 84 产物)。
  8. npm token 政策日期:纵轴仅提 2025-09-23 计划 vs 横轴给出 2025-10-13 granular 限寿、2025-12-09 classic 吊销的具体执行日期。→ 合并两者(计划 + 执行),并标注 Socket 博客为搜索摘要来源(直接抓取 403)。
  9. XZ Utils 的链归属:1.9 时间线表归"项目/维护者接管",2.2.1/2.2.2(4) 又列为"构建系统投毒"代表事件,初稿未作跨链解释。→ 定性为跨链样本:入口是维护者接管(两年社会工程取得发布权),落点是构建产物投毒(后门只注入发布 tarball 而非 git 主干)。正文 2.2.3 已补"跨链样本说明",时间线表已加注,不强行归入单链。

附录 B:术语表

正文涉及、但对非本领域读者可能构成门槛的术语,按首次出现顺序(审读意见要求补注的 SCA、OIDC、TOTP、attestation、egress 等均在内):

术语释义
CVE公开漏洞编号库。供应链投毒投放的是"恶意版本"而非"有缺陷版本",多数没有 CVE 编号,这是 SCA 对其盲视的根源
SCA(Software Composition Analysis,软件成分分析)扫描项目依赖树、对照 CVE 库给出已知漏洞告警的工具类别(代表:Snyk、Dependabot、OWASP Dependency-Check),同时承担许可证合规
SBOM(Software Bill of Materials,软件物料清单)机器可读的"本产品包含哪些组件与版本"清单(CycloneDX/SPDX 格式),用于事件响应时定位波及面;不能阻止引入
2FA / MFA双因素 / 多因素认证
TOTP基于时间同步的一次性验证码(认证器 App 生成的 6 位数字)。可被实时钓鱼中继窃取——chalk/debug 事件中连 TOTP 都被钓走,故社区转向 passkey
passkey / WebAuthn基于公私钥对、绑定站点 Origin 的抗钓鱼登录凭证;钓鱼站点拿不到可重放的凭证
OIDC(OpenID Connect)基于 OAuth2 的身份联合协议。npm/PyPI 的 trusted publishing 用它在 CI 中换取短时效发布凭证,避免在 CI 中存放长效令牌
trusted publishingnpm/PyPI 的"可信发布"机制总称:发布凭证由 OIDC 短时效签发、绑定指定仓库与工作流,而非长期令牌
attestation(PEP 740)PyPI 的"数字证明":随上传产物附带的签名声明(谁、在哪条流水线、如何构建),可被消费端验证
provenance(来源证明)泛指"产物出自哪条可信流水线"的密码学证明;npm 2023-04 上线基于 Sigstore 的发布 provenance,内容标准由 SLSA 定义
Sigstore / cosignLinux 基金会旗下的制品签名与透明日志体系,为"可验证的来源"提供基础设施
SLSA(Supply-chain Levels for Software Artifacts)构建完整性分级框架(构建轨道 L1–L3),核心要求是可信构建平台 + 隔离 + 产出可验证 provenance,现为 v1.2
egress(出网)遥测对构建/CI 节点对外网络连接的记录与告警;tj-actions 事件即由 StepSecurity Harden-Runner 的 egress 遥测发现
policy-as-code把"只允许带有效签名/provenance 的制品进入下一环节"这类策略写成可自动执行的校验,在引入点强制执行
hermetic build(密封构建)构建过程除声明输入外不接触网络与外部状态,使"产物 = 输入的确定性函数",是构建投毒防御的基石
typosquatting抢注与热门包名形近的包名(如 crossenv 仿 cross-env)诱骗安装
wiper毁盘型破坏载荷;TanStack 事件中"令牌被吊销即 rm -rf ~/"的守护进程即属此类

四、参考来源

以下链接合并自两份章节稿并去重,按主题分组:

理论与早期事件(1984–2019)

国家级警报与命名之年(2020–2021)

投毒工业化与防御成形(2022–2023)

社会工程登顶(2024)

蠕虫元年(2025)

蠕虫常态化(2026)

修订补充检索(2026-10-31,审读意见落实时新增)

思考题(读完后想一想,参考答案可展开)

  1. 报告的核心论点之一是“软件供应链攻击的杠杆始终指向被信任的自动化”,且主战场已从“软件缺陷”迁移到“信任结构”。请结合不同年代的事件说明这条迁移路径,并解释为什么传统“扫CVE、打补丁”的漏洞管理范式在该课题上整体失配?
    参考答案

    攻击杠杆不断迁移:编译器(1984 Thompson)→开发工具(2015 XcodeGhost)→安装脚本(2017 crossenv)→维护者身份(2018–2024)→CI/CD(2021–2026)→AI CLI(2025 Nx用它找密钥)。被利用的全是信任机制而非内存错误:版本解析规则、维护者身份、CI缓存与OIDC。攻击是蓄意滥用信任结构而非意外缺陷,扫CVE、打补丁的范式整体失配。

  2. 报告对比了五类防御路线后,判断“A+E(来源证明+入口与运行时管控)是唯一在四条链上都有直接有效成分的双路线组合”。请说明这一判断在覆盖矩阵中的依据,以及企业最常倚重的CVE/SCA类工具为何对四条攻击链几乎零覆盖?
    参考答案

    矩阵中A(来源证明)行在账号被盗、构建投毒列为●——Trusted Publishing直击令牌钓鱼收益;E(入口/运行时管控)行在依赖混淆、恶意包、构建投毒列为●。两线合并后四条链均有●,是唯一这样的双路线组合,辅以C即A+E+C。CVE/SCA防缺陷不防投毒:恶意版本多数没有CVE编号,LiteLLM带毒版本甚至通过pip哈希校验——哈希只证明拿到的是仓库里那份,而那份本身就是恶意的。

  3. 报告在“本报告的已知局限”一节承认了哪些证据边界与统计口径问题?其中“没有新事件≠没有事件”的警告,其依据是什么?
    参考答案

    四点局限:①axios归因保留“据Zscaler”限定,一手通告未见;②口径不一——Shai-Hulud包数各家口径100+至500+,chalk/debug为18至25个,40万密钥外泄是Datadog估计;③未检索到2026年9–10月经多家机构确认的新标志事件,但沉默窗口以月计(Codecov潜伏约2个月),平静不能外推为趋势;④个别事实来自搜索摘要或“既有知识”,引用前应回溯原始链接。

  4. 如果时间和精力有限、只做三件事,报告给开发者与团队的优先级排序是什么?报告还给出了哪个关于防御投入分配的“反直觉提醒”?
    参考答案

    排序是:①发布凭证换成OIDC trusted publishing加passkey;②CI的Action pin到commit SHA,Actions缓存纳入威胁模型;③私有依赖per-scope源锁定并占位公共源(成本最低、收益确定)。反直觉提醒:投入按覆盖矩阵缺口分配,而非事件热度——per-scope源锁定近零成本且已验证,却仍是最常见缺口,而最多预算花在对四链无效的CVE/SCA上。

← 资料库今日播报 →