跳转到主要内容

供应链攻击的威胁与防范

本文约需 11 分钟阅读

供应链攻击利用软件开发和分发过程中的信任关系,通过正规更新和库分发恶意软件。根据 Sonatype 2024 年报告,开源供应链攻击同比增长 156%,累计发现超过 70 万个恶意包。截至 2025 年,利用 AI 生成恶意代码以及向正规包中巧妙插入后门已成为新的威胁。这种传统恶意软件对策难以检测的威胁不仅影响开发者,还影响所有软件用户。Gartner 预测到 2025 年 45% 的组织将遭受供应链攻击,无论个人还是组织都急需做好防范。本文结合具体案例和数据,从供应链攻击的机制到组织和个人的防御策略进行解说。

供应链攻击的机制

从 SolarWinds 事件看攻击全貌

2020 年曝光的 SolarWinds 事件是向全世界展示供应链攻击严重性的标志性案例。攻击者入侵了 SolarWinds 公司的构建系统,在网络监控软件 Orion 的正规更新中植入了后门(SUNBURST)。该更新被约 18,000 个组织安装,包括美国政府机构在内的约 100 个组织实际遭到入侵。攻击者仅篡改了构建管道的一部分,在源代码仓库中没有留下痕迹,因此通过代码审查无法发现。这一事件揭示了一个结构性脆弱性:软件的"信任链"只要在一处被打破,下游所有用户都会受到影响。

npm / PyPI 依赖关系污染

针对包注册表的攻击是更常见且频繁发生的威胁。2021 年,npm 包 ua-parser-js(每周下载量超过 800 万)的维护者账户被劫持,发布了包含加密货币挖矿程序的恶意版本。在 PyPI 上,2023 年发现了约 450 个误植域名包,利用正规包名的输入错误分发信息窃取代码。

依赖关系污染的手法主要分为三类。第一,通过劫持维护者账户篡改正规包。第二,通过误植域名(例如:将 lodash 写成 lodahs)发布假包。第三,利用依赖混淆(Dependency Confusion),在公共注册表上注册与内部包同名的包。2021 年安全研究员 Alex Birsan 实证 Dependency Confusion 时,成功在包括 Apple、Microsoft、PayPal 在内的 35 家以上企业的构建系统中执行了代码。

入侵 CI/CD 管道

CI/CD 管道是自动化代码构建、测试和部署的开发基础设施,但对攻击者来说是高价值目标。在 2022 年的 Codecov 事件中,CI 工具的 Bash Uploader 脚本被篡改,用户的环境变量(API 密钥、令牌、认证信息)被发送到外部。GitHub Actions 的第三方 Action 被入侵的案例也有报告,2024 年热门 Action tj-actions/changed-files 被篡改,影响了约 23,000 个仓库。CI/CD 管道特别危险,因为它拥有向生产环境部署的权限,一旦被入侵,攻击者就能直接访问生产环境。

到底该怎么做

完全防御供应链攻击虽然困难,但有方法可以大幅降低风险。个人用户应启用操作系统和应用的自动更新,同时大规模更新等待 1-2 天后再应用。浏览器扩展和应用仅从可信来源安装,不需要的及时删除。开发者应为包注册表账户设置 20 个字符以上的唯一密码和基于 TOTP 的两步验证,并将依赖包版本固定到提交哈希。

保护开发者账户

包注册表账户

npm、PyPI、RubyGems 等包注册表的账户是供应链攻击最容易被瞄准的起点。npm 从 2022 年起对前 500 个包的维护者强制要求两步验证,但其他包仍然是可选的。请使用 Passtsuku.com 生成 20 个字符以上的随机密码,并务必设置基于 TOTP 应用或硬件安全密钥的两步验证。不推荐 SMS 验证,因为存在 SIM 卡交换攻击的风险。

拥有包发布权限的账户需要特别严格的管理。对于 npm,使用 `npm access` 命令确认拥有发布权限的用户,及时删除不必要的权限。团队管理时,将拥有发布权限的成员控制在最少,并设置发布操作必须要求两步验证。

保护源代码仓库

GitHub 和 GitLab 的账户不仅可以访问源代码,还可以访问 CI/CD 管道配置和密钥,因此一旦被入侵影响范围极大。根据 GitHub 2024 年安全报告,通过泄露的令牌和密码导致的账户入侵占仓库相关事件的约 40%。

除了使用 Passtsuku.com 生成的强密码外,以下设置对仓库保护至关重要:设置分支保护规则,禁止直接推送到主分支;要求拉取请求至少有 1 名审查者批准;要求签名提交,以便检测提交篡改。

CI/CD 服务安全

GitHub Actions、CircleCI、Jenkins 等 CI/CD 服务存储着部署密钥、API 令牌、云认证信息等高度敏感的密钥。这些密钥一旦泄露,将直接导致对生产环境的未授权访问。务必将密钥存储在 CI/CD 服务的加密密钥存储中,并设置不在日志中输出。对于 GitHub Actions,重要的是将 `GITHUB_TOKEN` 的权限设置为最小,并通过 `permissions` 键仅明确指定所需权限。

使用第三方 CI/CD Action 和插件时,请将版本固定到提交哈希。通过标签或分支名指定存在标签替换导致篡改的风险。关于 CI/CD 管道中 API 密钥和令牌的管理,请参阅API 密钥管理最佳实践。要系统地学习开发者账户保护,开发者账户保护与注册表安全解说书 (Amazon)可供参考。

组织层面的防御策略

利用 SBOM(软件物料清单)

SBOM(Software Bill of Materials,软件物料清单)是列出软件中包含的所有组件及其依赖关系的文档。在美国,2021 年的第 14028 号行政命令要求向联邦政府交付的软件必须提供 SBOM。通过创建和管理 SBOM,当使用中的库发现漏洞时,可以快速确定受影响的系统。

SBOM 的标准格式有 SPDX(Linux Foundation)和 CycloneDX(OWASP)两种。在 npm 中,可以使用 npm sbom --sbom-format cyclonedx 命令生成 CycloneDX 格式的 SBOM。建议定期将生成的 SBOM 与漏洞数据库(NVD、OSV)进行比对,检测包含已知漏洞的组件。结合开源安全审计可以更系统地管理依赖关系的安全性。需要注意的是,SBOM 是静态快照,需要每次构建时重新生成以保持最新状态。

代码签名与验证

代码签名是验证软件作者身份和是否被篡改的机制。Sigstore 项目作为为开源软件提供免费签名的基础设施而备受关注。npm 从 2023 年开始支持基于 Sigstore 的来源信息(provenance),可以密码学地验证包是从哪个仓库的哪个提交构建的。可以使用 `npm audit signatures` 命令验证已安装包的签名。

cosign(Sigstore)被广泛用于容器镜像签名。通过对发布到 Docker Hub 或 GitHub Container Registry 的镜像进行签名,并在部署时验证签名,可以防止执行被篡改的镜像。在 Kubernetes 环境中,结合 Kyverno 或 OPA Gatekeeper 等策略引擎,可以自动阻止未签名镜像的部署。

最小权限原则

为了最小化供应链攻击的损害,对每个组件仅授予必要最小权限的原则非常重要。CI/CD 管道的服务账户仅授予部署所需的权限,不要给予管理员权限。对于 AWS,在 IAM 策略中指定具体的资源 ARN 和操作,避免使用通配符。

依赖包的权限也应该限制。在 Node.js 中,从 v20 开始可以使用 `--experimental-permission` 标志在运行时限制网络访问和文件系统访问。Deno 默认是沙箱化的,访问网络和文件系统需要明确的许可。利用这些机制,即使混入了恶意包,也可以限制损害范围。

个人用户可以采取的对策

供应链攻击不仅仅是开发者和组织的问题。所有使用软件的用户都可能受到影响。以下总结了个人用户可以实践的对策。

首先,请启用操作系统和应用程序的自动更新。但是,大规模更新不要在发布后立即应用,需要谨慎地等待 1-2 天后再应用。过去曾有正规更新中混入恶意代码的案例,发布后不久发现问题并发布修正版。请养成在应用更新前备份重要数据的习惯。

避免安装数量少或评价少的浏览器扩展和智能手机应用,安装前请确认开发者的可信度。2023 年 Chrome Web Store 删除了约 34,000 个恶意扩展,即使是官方商店也不一定安全。请同时确认浏览器扩展安全。及时删除不再使用的扩展和应用,缩小攻击面。

使用 Passtsuku.com 为每个服务设置唯一的强密码并启用两步验证,也是对供应链攻击的间接防御。这与零信任安全"不信任任何事物,始终验证"的原则一脉相承。即使攻击者入侵服务提供商的系统窃取了密码哈希,足够长的随机密码在离线状态下也极难破解。请设置在 Passtsuku.com 强度计上显示 100 位以上熵的密码。要了解供应链攻击的全貌,供应链攻击案例分析与防御策略书籍 (Amazon)可供参考。

供应链攻击是动摇软件信任模型本身的威胁。虽然完全防御很困难,但通过 SBOM 可视化、代码签名验证、彻底的最小权限以及个人层面的账户保护相结合,可以大幅降低风险。正因为软件的依赖关系难以看见,才需要有意识地管理并定期审查。

现在就能做的事

  1. 启用操作系统和应用的自动更新,及时应用安全补丁(大规模更新等待 1-2 天)
  2. 审查浏览器扩展,删除不需要的(Chrome:在 chrome://extensions 确认)
  3. 开发者:使用 Passtsuku.com 为 npm / PyPI / GitHub 账户设置 20 个字符以上的唯一密码,并启用基于 TOTP 的两步验证
  4. 使用 Passtsuku.com 为每个服务设置唯一密码,以防万一供应链攻击导致密码哈希被窃取

常见问题

什么是供应链攻击?
这是一种通过渗透软件或硬件的开发和分发过程,在合法产品或更新中植入恶意软件的攻击方式。由于用户信任来源,因此极难检测。
如何保护自己免受供应链攻击?
确认软件更新来自正规来源,养成验证数字签名的习惯。尽量减少使用的工具和库的数量,并定期查看安全公告。
有没有造成重大损失的供应链攻击案例?
2020年的SolarWinds事件是典型案例。网络管理软件的正规更新被植入后门,影响了包括美国政府机构在内的数千个组织。

这篇文章对您有帮助吗?

相关术语

XHatena