01 · 供应链攻击的本质与生命周期映射
1.1 定义与判定标准
软件供应链攻击是指攻击者在软件的生产、交付或更新链路中植入恶意代码、篡改制品或劫持可信分发通道,使恶意内容随合法软件进入下游环境的攻击形态。MITRE ATT&CK将其归入战术T1195(Supply Chain Compromise),并按侵入点细分为T1195.001(软件依赖与开发工具)、T1195.002(硬件/软件附加组件)、T1195.003(产品采购与交付渠道)三个子技术。判定一起事件是否属于供应链攻击的核心标准是:恶意或有害内容的引入点位于受害者组织的安全边界之外、且借助了既有的信任关系(上游维护者、官方构建系统、签名发布包等)。
1.2 生命周期五环节映射
| 环节 | 典型攻击手法 | 代表性事件 |
|---|---|---|
| 源代码 | 维护者账号劫持(凭证钓鱼、弱口令)、长期“养号”骗取提交权限、恶意PR合并 | event-stream(2018)、XZ Utils后门(2024) |
| 依赖 | 恶意包/仿冒包投毒、依赖混淆、命名空间抢注(typosquatting) | eslint-scope(2018)、ua-parser-js(2021)、ctx(2022)、Cicada3301系列npm包(2024) |
| 构建 | 构建服务器入侵、构建脚本投毒、编译器/工具链污染、PPE毒化流水线执行 | SolarWinds SUNBURST(2020)、Codecov(2021)、tj-actions(2025) |
| 分发 | 下载站点/镜像源劫持、包注册中心账户接管、更新通道篡改 | 3CX桌面客户端(2023)、MOVEit(2023,利用SQL注入污染更新链)、Octopus Scanner(2020,借IDE构建产物扩散) |
| 运行 | 恶意镜像投毒(挖矿/后门)、镜像层篡改、运行时依赖拉取 | Docker Hub恶意镜像系列、Docker Hub账户泄露(2019) |
纵深防御含义:五环节中任何单点防护都无法根除风险——对“依赖”环节的漏洞扫描无法发现“构建”环节被篡改的构建脚本(SolarWinds形态),对“分发”环节的签名验证也无法覆盖“源代码”环节的恶意提交(XZ形态)。这正是后续第3—7页按“透明—证明—验证—治理”分层布防的根本原因。
02 · 攻击谱系分类学与事件档案
2.1 攻击谱系分类学(按初始侵入点)
| 谱系 | 机制 | 攻击成本与潜伏周期 | 核心缓解措施 |
|---|---|---|---|
| A. 维护权劫持 | 钓鱼窃取维护者凭证;长期贡献博取信任后取得发布权 | 低—中成本;潜伏周期可数周(event-stream)至数年(XZ) | 维护者2FA强制(PyPI关键项目2022年7月起强制)、发布双人复核、Sigstore密钥绑定身份 |
| B. 依赖投毒 | 向npm/PyPI等上传恶意包或仿冒包;利用依赖混淆覆盖私有包名 | 极低成本;潜伏周期短(数小时—数天),依靠下载量快速扩散 | 私有源隔离与命名空间保留、锁文件+哈希校验、依赖来源固定、OpenSSF Scorecard评估 |
| C. 构建系统入侵 | 攻陷构建服务器或篡改构建流程,在官方制品中植入后门 | 高成本(目标价值高);潜伏周期可达数月(SUNBURST约14个月) | SLSA L3隔离构建、构建provenance验证、制品哈希与来源交叉核对 |
| D. 更新通道滥用 | 污染自动更新机制或托管下载页面,下发篡改安装包 | 中—高成本;依赖供应链上游单点 | 签名安装包验证(如cosign签名的发布物)、更新通道HTTPS+签名双重校验 |
| E. 分发端账户/仓库泄露 | 凭证泄露导致仓库内容或令牌被盗用 | 低成本;影响面取决于泄露令牌权限范围 | 令牌最小权限+短期化(OIDC)、Secret Scanning、泄露后快速轮换 |
| F. 恶意镜像投毒 | 在公共镜像仓库发布带挖矿/后门程序的热门镜像或名称仿冒镜像 | 低成本;依赖用户误拉取 | 仅允许私有镜像仓库、digest固定、来源签名验证、镜像扫描+运行时行为检测 |
2.2 事件档案(本页收录15起公开披露事件)
| 首次披露 | 事件 | 谱系 | 关键事实(以官方披露/权威研究为准) |
|---|---|---|---|
| 2018.11 | event-stream / flatmap-stream | A 维护权劫持 | 原维护者将包转让给攻击者控制账号,后者在依赖flatmap-stream中植入针对Copay比特币钱包的窃取代码。npm随后删除相关恶意版本;GitHub报告确认事件由比特币钱包定向攻击驱动。 |
| 2019.4 | Docker Hub数据泄露 | E 凭证泄露 | Docker官方通报数据库未授权访问,涉及约19万个账户的用户名、哈希密码,以及部分自动化构建用户的GitHub/Bitbucket令牌,迫使相关流水线凭证全面轮换。 |
| 2020.5 | Octopus Scanner | D 更新通道滥用 | GitHub Security Lab披露:攻击者诱导开发者下载带毒NetBeans项目构建脚本,项目被构建后植入后门并回传构建产物,形成自传播循环;26个开源仓库被感染。 |
| 2020.12 | SolarWinds SUNBURST | C 构建系统入侵 | FireEye(现Mandiant)2020年12月8日披露其被入侵并归因于APT组织;SolarWinds于12月14日向SEC披露其Orion平台构建系统被入侵,约1.8万客户收到含SUNBURST后门的更新。攻击者在构建环境中植入恶意代码,经正规签名与更新通道分发。 |
| 2021.2 | 依赖混淆研究 | B 依赖投毒 | 安全研究员Alex Birsan公开研究:向npm/PyPI/RubyGems上传与多家公司私有包同名的公开包,成功在35家以上企业内部解析执行,获得超过13万美元漏洞赏金(各公司致谢记录可查)。该研究直接推动“命名空间保留/私有源隔离”成为行业基线。 |
| 2021.4 | Codecov | C 构建系统入侵 | 攻击者通过修改Codecov的Docker镜像创建脚本获取其bash uploader的导出凭证,进而窃取使用CI环境变量的客户机密。Codecov于2021年4月15日披露,影响其Bash Uploader用户。 |
| 2021.10 | ua-parser-js | B 依赖投毒 | npm流行UA解析库ua-parser-js的0.7.29/0.8.0/1.0.0版本被植入窃取密码与安装挖矿程序的恶意代码;维护者账号遭钓鱼接管,npm下架恶意版本并建议用户轮换凭证。 |
| 2021.12 | Log4Shell(CVE-2021-44228) | B 依赖投毒(非恶意投毒,属“脆弱依赖放大”) | 阿里云安全工程师Chen Zhaojun于2021年11月24日向Apache报告,12月9—10日公开。Log4j2 2.0-beta9—2.14.1受影响,CVSS 10.0;JNDI查找功能允许攻击者加载远程代码。Apache连续发布2.15.0、2.16.0、2.17.0、2.17.1修复,成为各国监管机构紧急通报的标志性事件。 |
| 2022.5 | PyPI ctx与phpass | B 依赖投毒 | ctx维护者邮箱过期后被接管,新版本加入环境变量窃取代码;同类手法波及PHP库phpass。事件显示“邮箱域名过期→包所有权转移→投毒”的低成本接管链。 |
| 2023.3 | 3CX桌面客户端 | D 更新通道滥用 | Mandiant(2023年3月29日报告)披露:3CX桌面客户端的合法更新被注入恶意代码,进一步归因于朝鲜相关攻击者利用Trading Technologies的X_Trader软件先前入侵(UNC4736)。这是“供应链中的供应链”级联攻击样本。 |
| 2023.5 | MOVEit Transfer(CVE-2023-34362) | D 更新通道滥用(漏洞滥用型) | Progress MOVEit Transfer的SQL注入漏洞被Cl0p勒索组织大规模利用,波及全球数千家机构、数千万级个人数据(多家监管机构通报口径合计)。属“软件漏洞+供应链批量利用”的混合型事件。 |
| 2024.3 | XZ Utils后门(CVE-2024-3094) | A 维护权劫持 | 微软工程师Andres Freund于2024年3月29日披露:xz 5.6.0/5.6.1的发布压缩包中,构建脚本经多层混淆(IFUNC重定向+RSA公钥校验)在liblzma中植入后门,可通过sshd经systemd链路触发(条件苛刻)。攻击者“Jia Tan”以数年贡献取得维护权。CVSS 10.0,CWE-506(嵌入恶意代码)。 |
| 2024.9 | Cicada3301系列npm包 | B 依赖投毒 | Check Point Research披露:攻击者在npm发布约30个携带执行器与勒索组件的包,伪装成常见工具(如json-web-token等仿冒名),通过preinstall脚本执行,Windows/Linux双平台投递。 |
| 2025.3 | tj-actions/changed-files(CVE-2025-30066) | C 构建系统入侵(第三方Action) | 2025年3月14—15日,该Action的v1—v45.0.7标签被重指向含恶意提交的提交(哈希0e58ed8),在开启debug日志的流水线中将密钥等敏感值打印进可公开访问的运行日志;约2.3万个仓库使用该Action。CISA于3月18日将其纳入KEV目录;关联事件reviewdog/action-setup(CVE-2025-30154)采用同手法。 |
| 2026.3 | aquasecurity/trivy-action标签劫持 | C 构建系统入侵(第三方Action) | 安全社区归因于TeamPCP攻击活动:公开记录显示该Action的77个版本标签中76个被强制指向恶意提交(GitHub安全公告GHSA-69fq-xp46-6x23跟踪),恶意代码读取运行进程内存(/proc/PID/mem)并将CI密钥经多层base64编码后写入日志。这是tj-actions手法在一年后的同构再现,印证“固定commit SHA+运行内存防护”基线的持续有效性。 |
03 · MITRE ATT&CK 战术映射
供应链攻击在ATT&CK中的主线归属为TA0043(Reconnaissance,侦察)→ TA0001(Initial Access,初始访问)阶段,核心子技术是T1195系列。将其映射到战术框架的价值在于:把“供应链”从抽象风险转化为可检测、可编排防御的战术阶段,并与T1059(命令与脚本解释器)、T1078(有效账户)、T1525(植入内部镜像/根镜像)等后续战术串联成完整攻击链。
| ATT&CK子技术 | 名称 | 供应链语境 | 对应防御层(本子课题) |
|---|---|---|---|
| T1195.001 | Compromise Software Dependencies and Development Tools | 依赖投毒、仿冒包、依赖混淆、构建工具污染(SolarWinds、Codecov、tj-actions) | 第3页SBOM成分审计、第7页流水线第三方Action管控、锁定依赖版本与来源 |
| T1195.002 | Compromise Software Supply Chain | 软件附加组件与升级机制的篡改(3CX、MOVEit更新链) | 第5页签名验证、更新通道完整性校验 |
| T1195.003 | Compromise Hardware Supply Chain | 硬件/固件供应链(本子课题不展开,保留映射完整性) | — |
| T1525 | Implant Internal Image | 向私有镜像仓库/基础镜像注入后门,随CI构建扩散 | 第6页私有仓库治理、准入扫描+digest固定 |
| T1078 / T1550 | Valid Accounts / Use Alternate Authentication Material | 窃取的CI/CD令牌、云凭证被用于后续横向移动(Docker Hub 2019、Codecov) | 第7页OIDC短期凭证、泄露检测与轮换 |
| T1059 | Command and Scripting Interpreter | 恶意包preinstall脚本、构建脚本、Action注入代码执行 | 脚本执行审计、沙箱化构建(第4、6、7页) |
注:子技术编号与描述以MITRE ATT&CK官方知识库为准(attack.mitre.org),不同版本间名称可能微调,引用时以访问日期版本为准。
04 · 威胁建模方法与攻击树示例
4.1 建模方法选择
- 攻击树(Attack Tree):以“在下游环境执行恶意代码”为根节点,逐层展开侵入路径,适合对单一制品做穷尽式路径分析(如下例)。
- STRIDE-LM映射:将供应链各环节资产映射至Spoofing/Tampering/Repudiation/Information Disclosure/Denial of Service/Elevation of Privilege六类威胁,适合流水线级架构评审。
- 威胁情报驱动的画像:对XZ式“长期养号”与tj-actions式“标签劫持”分别建立攻击者行为指标(时间投入、身份一致性、发布模式突变),纳入供应商准入评估。
4.2 攻击树示例:恶意的容器镜像如何进入生产集群(简化)
| 层级 | 节点 | 对应真实事件锚点 |
|---|---|---|
| 根 | 生产集群运行攻击者控制的容器镜像 | — |
| L1 | A. 镜像来自公共仓库(Docker Hub等) | 恶意挖矿镜像系列(安全厂商持续披露) |
| L1 | B. 镜像来自私有仓库但推送环节被突破 | Docker Hub 2019凭证泄露→自动化构建令牌滥用 |
| L1 | C. 镜像内容在构建环节被篡改 | SolarWinds(构建脚本投毒)、Codecov(导出凭证泄露) |
| L2-A | 攻击者发布仿冒名/热门名镜像 | 名称仿冒镜像(k8s.gcr.io等历史仿冒域名/镜像) |
| L2-B | 开发者误用latest标签或未固定digest | 依赖混淆研究揭示的解析逻辑滥用 |
| L2-C | 流水线第三方Action被篡改(标签重指) | tj-actions/changed-files(2025.3,CVE-2025-30066) |
| 缓解 | L2-A/L2-B→第6页“仅私有仓库+digest固定”;L2-C→第7页“Action固定commit SHA+最小权限”;C→第4—5页“provenance+签名验证”;全路径兜底→运行时行为检测(子课题02) | |
4.3 建模产出要求
- 每个关键制品(基础镜像、发布包、Agent安装包)应有一份带版本号的威胁模型文档,随架构变更复审;
- 攻击树叶子节点必须关联至少一条可执行的检测或缓解措施,避免“纸面建模”;
- 对上游组件引入建立供应商/组件风险评估清单:维护者身份可信度、发布频率、是否启用2FA与签名、历史安全事件。
05 · 检测启示小结(衔接后续各页)
本节参考来源(第2页)
MITRE ATT&CK T1195(Supply Chain Compromise)及子技术官方条目:attack.mitre.org/techniques/T1195。
Alex Birsan《Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies》(2021年2月):medium.com/@alex.birsan。
GitHub Security Lab《Octopus Scanner malware spreads through NetBeans projects》(2020年5月):securitylab.github.com。
Mandiant《3CX Software Supply Chain Compromise》报告(2023年3月):mandiant.com。
Andres Freund关于xz后门的披露邮件(openwall oss-security,2024年3月29日)与NVD CVE-2024-3094条目:nvd.nist.gov。
Step Security《tj-actions/changed-files is compromised》事件分析(2025年3月)与CISA KEV收录记录:cisa.gov/kev;Apache Log4j安全页:logging.apache.org。
Check Point Research《Who is Cicada3301?》(2024年9月)与Codecov官方披露(2021年4月):research.checkpoint.com、about.codecov.io/security-update。
Cycode《GitHub Actions Supply Chain Attacks Explained》(2026年6月,含trivy-action/TeamPCP事件梳理):cycode.com/blog/github-actions-supply-chain-attacks-explained。
event-stream事件技术还原(GitHub issue #116与npm公告,2018年11月):github.com/dominictarr/event-stream/issues/116。