网络威胁与对策

供应链攻击

约 4 分钟阅读

什么是供应链攻击

供应链攻击是一种不直接攻击目标组织,而是经由该组织信任并使用的软件、库、服务、硬件等供应链 (supply chain) 进行渗透的攻击方法。由于滥用的是合法的更新机制与依赖关系,它具有容易绕过边界防御与反恶意软件措施这一棘手的性质。

在 2020 年代的软件开发中,一个应用程序要依赖数百到数千个开源库。攻击者只要在这条依赖链的任意一处注入恶意代码,就能影响所有使用该库的组织。一旦与零日攻击相结合,检测将变得更加困难。

常见攻击模式

供应链攻击有几种典型模式。

  • 构建系统入侵:渗透软件的构建与分发基础设施,在合法的二进制文件中嵌入恶意软件。在 2020 年 12 月披露的 SolarWinds 事件中,构建管道被入侵,据该公司的发布,最多有 18,000 家客户组织下载了被篡改的更新。
  • 依赖投毒:向 npm、PyPI 等包注册中心发布恶意包。手法包括域名抢注 (使用与正规包名称相似的名字) ,以及依赖混淆 (Dependency Confusion) ,即利用私有包名与公共包名的解析优先级。
  • 更新劫持:在合法的软件更新中注入恶意代码。信任自动更新的用户会在不知情的情况下安装被篡改的版本。
  • 正规维护者的账户被接管:入侵维护者的账户,或先以协作者的身份取得信任,再把恶意代码混入正规的发布版本。在 2024 年 3 月披露的 xz Utils 后门 (CVE-2024-3094) 中,一名从 2021 年起花费两年以上不断加深对开发参与程度的人物,把针对 SSH 认证的机关埋在了分发用归档一侧,而不是源代码仓库中。
  • CI/CD 流水线的滥用:渗透 GitHub Actions、Jenkins 等 CI/CD 环境,篡改构建产物,或窃取密钥管理中保管的凭证。

无论哪种模式,恶意软件都经由正规的分发渠道扩散,因此接收方难以察觉其中的异常,这是共同的结构性难点。

防御策略与框架

防御供应链攻击时,单一措施并不充分,需要多层次的方法。

依赖管理

  • SBOM (软件物料清单) 的编制:把应用程序所依赖的全部组件列成清单,作为漏洞管理的基础。当发现漏洞时,可以迅速确定受影响的系统。
  • 依赖的固定与哈希验证:用锁文件 (package-lock.json、poetry.lock) 固定版本,并验证包的哈希值以检测篡改。
  • 依赖扫描:使用 Dependabot、Snyk、Trivy 等工具自动检测依赖中的已知漏洞。
  • 私有仓库的运用:不直接引用外部包,而是经由只存放已审查包的私有仓库获取依赖。

构建与分发的保护

  • 可重现构建:保证从相同的源代码始终生成同一个二进制文件,从而使构建环境的篡改可被检测。
  • 签名与验证:为构建产物附加数字签名,并在分发目的地验证该签名。Sigstore 等工具可以用于此。
  • 贯彻容器安全:实施容器镜像的扫描、基础镜像的管理与镜像签名的验证。

组织层面的对策

  • 零信任的适用:不无条件信任供应链中的任何组件,对每一次获取与执行都持续加以验证。
  • 事件响应计划:把供应链被入侵的情景也纳入其中,事先梳理好从检测到隔离的处置流程。
  • SLSA (Supply-chain Levels for Software Artifacts) 的运用:源自 Google 的框架,其规范作为 OpenSSF 的项目公开。它以阶段性的水准定义了构建的来源 (provenance) 能够被保证到何种程度,组织可以一边确认自身的到达阶段,一边逐步积累对策。

IaC 与基础设施供应链风险

供应链攻击不仅限于应用代码,还延伸到 IaC (基础设施即代码) 的领域。如果基础设施定义中使用的第三方组件,例如 Terraform 模块或 CloudFormation 模板被篡改,整个云环境都有可能被入侵。

要降低 IaC 的供应链风险,以下措施是有效的。

  • 固定模块版本:固定 Terraform 模块与 Helm chart 的版本,并用哈希加以验证。避免使用「latest」或未指定版本的引用。
  • 审查第三方模块:在采用第三方模块之前实施代码审查。检查是否存在过度的 IAM 权限、意外的网络配置或数据外泄。
  • 私有模块注册表:把已批准的模块托管在私有注册表中,而不是直接从公共源拉取,从而在模块进入基础设施之前增加一道审查。
  • 变更差异的人工审查:基础设施变更的差异 (plan 或 changeset) 必须由人工审查之后再应用。
  • 执行权限的最小化:依据最小权限原则,把 IaC 流水线的执行权限限制在必要的最小范围。

此外,把所采用模块的来源、版本与审查记录留存下来也很重要。一旦某个模块被发现存在问题,就能立即判断哪些环境使用了它。需要在平时就建立起能够在软件与基础设施两方面验证供应链可信性的体制。

常见误解

来自可信供应商的软件是安全的
正如 SolarWinds 事件所示,即使是大型供应商的正规软件,如果构建过程被入侵也可能包含恶意代码。供应商信任度和软件安全性是不同的问题,接收方也需要进行验证。
开源因为有很多人监督所以安全
许多开源项目依赖少数维护者,并非所有提交都经过充分的审查。在 2024 年 3 月披露的 xz Utils 后门中,攻击者从 2021 年起花费两年以上不断加深对开发的参与,在获得信任之后埋下了机关。

供应链攻击与零日攻击对比

供应链攻击

通过可信供应链渗透。利用合法更新渠道,检测困难。影响范围广,一次入侵可波及数千个组织。

零日攻击

直接利用未知的漏洞。在补丁尚不存在的状态下发动攻击。用于定向攻击的例子较为显眼,但如果是广泛普及的产品中的漏洞,影响也可能变成大规模的。

分享

相关术语

相关文章