定义类型">类型上游服务器妥协—— Codecov 攻击">上游服务器妥协—— Codecov 攻击中游妥协以传播恶意更新">中游妥协以传播恶意更新依赖项混淆(dependency confusion)攻击">依赖项混淆(dependency confusion)攻击被盗的 SSL 和代码签名证书">被盗的 SSL 和代码签名证书针对开发者的 CI/CD 基础设施">针对开发者的 CI/CD 基础设施使用社会工程学来引入恶意代码">使用社会工程学来引入恶意代码解决办法通知开发人员有关网络攻击的信息">通知开发人员有关网络攻击的信息监控开源项目">监控开源项目零信任">零信任内置数据保护">内置数据保护关注第三方风险">关注第三方风险定义供应链攻击是一种面向软件开发人员和供应商的新兴威胁。 目标是通过感染合法应用分发恶意软件来访问源代码、构建过程或更新机制。 攻击者寻找不安全的网络协议、未受保护的服务器基础结构和不安全的编码做法。 它们将在生成和更新过程中中断、更改源代码以及隐藏恶意软件。 由于软件由受信任的供应商构建和发布, 因此这些应用和更新已签名并经过认证。 在软件供应链攻击中, 供应商可能未意识到他们的应用或更新在发布到公众时受到恶意代码的感染。 然后, 恶意代码将以与应用相同的信任和权限运行。 类型上游服务器妥协—— Codecov 攻击对于大多数软件供应链攻击,攻击者会破坏上游服务器或代码存储库并注入恶意负载(例如,恶意代码行或木马更新)。然后将该有效载荷向下游分发给众多用户。然而,从技术角度来看,情况并非总是如此。 Codecov 供应链攻击就是这样一个例子。尽管该事件与 SolarWinds 攻击存在相似之处,但两次攻击之间却存在明显差异。SolarWinds 供应链漏洞是技能卓越的威胁行为者的 “ 杰作 “,他们更改了合法的更新二进制文件 SolarWinds.Orion.Core.BusinessLayer.dll,其是 SolarWinds IT 性能监控产品 Orion 的一部分。 FireEye 之前分析过,假冒 DLL 的 RefreshInternal ( ) 方法中包含的恶意代码如下所示。当 Orion 加载库存管理器插件时,此方法会调用基于 HTTP 的后门: 带有恶意 RefreshInternal 方法的后门 DLL 版本 2019.4.5200.9083 然而,只有当修改后的二进制文件向下游传播至包括美国政府机构在内的 18,000 多个 SolarWinds Orion 客户时,SolarWinds 上游攻击才算发挥了全部作用。 而在 Codecov 攻击案例中,没有恶意代码分发到下游,但却切切实实地产生了攻击后果。根据官方安全公告指出,黑客利用 Codecov 的 Docker 映像创建过程中出现的错误,非法获得了其 Bash Uploader 脚本的访问权限并且进行了修改,以收集从客户的持续集成 / 持续交付 ( CI/CD ) 环境上传的环境变量: 尽管 Codecov Bash Uploader 脚本在 Codecov [ . ] io/bash 的 Codecov 服务器本身上存在(并继续存在),但数千个存储库已经指向该链接,以将信息从其 CI/CD 环境上游发送到此 BashUploader。因此,恶意代码仅存在于(受损的)上游服务器上,而没有发生任何下游代码分发,因为所谓的下游存储库已经指向托管 Bash Uploader 脚本的 Codecov 服务器。然而,这些下游存储库也受到了此次攻击的影响,因为它们被配置为将数据上传到 Codecov 的 Bash Uploader: 事实上,据报道,Codecov 攻击者使用从受损 Bash Uploader 处收集的凭据破坏了数百个客户网络。最近开源程序工具和保险柜制造商 HashiCorp 也披露称,Codecov 供应链攻击已经致使其 GPG 签名密钥被泄漏。 中游妥协以传播恶意更新术语 “ 中游 “ 在这里主要指攻击者破坏中间软件升级功能或 CI/CD 工具而非原始上游源代码库的实例。今年 4 月,许多《财富》500 强公司使用的 Passwordstate 企业密码管理器的制造商 Click Studios 通知客户称,攻击者破坏了 Passwordstate 的升级机制,并利用它在用户的计算机上安装了一个恶意文件。其文件名为 “moserware.secretsplitter.dll”,其中一小部分如下所示: 在安全公告中,Click Studios 表示,攻击持续了大约 28 小时才被关闭。只有在此时间段内执行一键升级的客户才会受到影响。而 Passwordstate 的手动升级不会受到损害。受影响的客户密码记录可能已被收集。 不出所料地是,Passwordstate 攻击事件后就发生了针对 Click Studios 用户的网络钓鱼攻击,攻击者在这些钓鱼电子邮件中放置了指向更新的恶意软件版本的非法链接。 除了具备技术要素(例如升级过程被篡改)之外,这种供应链攻击还具备社会工程学因素。在一份大小超过 300 MB 的伪造更新 zip 文件中,安全研究人员发现,攻击者已设法更改用户手册、帮助文件和 PowerShell 构建脚本,以指向其恶意内容分发网络(CDN)服务器: 阐明恶意 CDN 服务器为官方的帮助手册文档之一 包含恶意 CDN 服务器链接的 PowerShell 安装脚本 针对此次攻击的社会工程学手段还说明了另一项弱点:人类(尤其是新手开发人员或软件消费者)可能并不总是对内容分发网络(CDN)链接保持怀疑态度,无论这些链接是否真的可疑。这是因为通常情况下,CDN 是被软件应用程序和网站合法同于提供更新、脚本和其他内容的。 Magecart 等在线信用卡窃取攻击就是此类供应链攻击的另一个例子。在某些攻击中,Amazon CloudFront CDN 存储桶已被攻破,以将恶意 JavaScript 代码分发到更多依赖此类 CDN 的网站之中。 依赖项混淆(dependency confusion)攻击2021 年,提及供应链攻击就少不了要提 “ 依赖项混淆 “,特别是因为这种攻击的简单化和自动化特质,使其日渐受到攻击者的青睐。得益于在多个开源生态系统中发现的固有设计缺陷,依赖项混淆能够在攻击者端通过最小的努力甚至是自动化的方式发挥作用。 简而言之,如果您的软件构建使用私有的、内部创建的依赖项,而该依赖项在公共开源存储库中不存在,那么依赖项混淆(或命名空间混淆)就会起作用。攻击者能够在公共存储库上以相同的名称注册具有更高版本号的依赖项。然后,很大的可能是,攻击者创建的具有更高版本号的(公共)依赖项——而非您的内部依赖项——将被拉入您的软件构建中。 依赖项混淆攻击示意图 今年 2 月,通过利用 PyPI、npm 和 RubyGems 等常用生态系统中的这个简单缺陷,道德黑客 Alex Birsan 成功地入侵了 35 家大型科技公司,并为此获得了超过 130,000 美元的漏洞赏金奖励。 在 Birsan 的研究成果披露几天后,数以千计的依赖项混淆模仿包开始涌入 PyPI、npm 和其他生态系统。虽然大多数模仿包都是由其他有抱负的漏洞赏金猎人所创建,但是仍然不乏一些恶意行为者的身影。 解决依赖项混淆的方法有很多,包括在攻击者之前抢先在公共存储库上注册所有(你的)私有依赖项的名称;以及使用自动化解决方案,例如软件开发生命周期(SDLC)防火墙,以防止冲突的依赖项名称进入您的供应链。 此外,开源存储库的所有者可以采用更严格的验证过程并实施命名空间 / 范围界定。例如,如果想要在 “CSO” 命名空间、范围下注册依赖项,那么开源存储库可以先验证注册的开发人员是否有权以 “CSO” 的名义这样做。 Java 组件存储库 Maven Central 采用简单的基于域的验证方式来验证命名空间所有权——这种做法可以很容易地被其他生态系统建模。 被盗的 SSL 和代码签名证书随着 HTTPS 网站的增加,SSL/TLS 证书已经无处不在,它可以保护您的在线通信。因此,SSL 证书私钥的泄露可能会威胁到端到端加密连接为最终用户提供的安全通信和保证。 2021 年 1 月,Mimecast 披露其客户用于建立与 Microsoft 365 Exchange 服务连接的证书遭到破坏,可能影响约 10% 的 Mimecast 用户的通信。虽然 Mimecast 没有明确确认其是否为 SSL 证书,但正如一些研究人员所怀疑的那样,在很大程度上情况似乎确实如此。 虽然受损的 SSL 证书存在影响,但被盗的代码签名证书(即受损的私钥)会对软件安全产生更广泛的影响。获得私有代码签名密钥的攻击者可能会将他们的恶意软件签名为由信誉良好的公司提供的真实软件程序或更新。 尽管 “ 震网 “(Stuxnet)事件时至今日仍然是复杂攻击的一个重要案例——在此次攻击中,攻击者使用了从两家著名公司窃取的私钥将其恶意代码签名为 “ 受信任 “ ——但此类攻击其实早在 Stuxnet 事件前就已经盛行,甚至在 Stuxnet 事件发生后数年的今天仍在盛行。这也解释了前面提到的 Codecov 供应链攻击中 HashiCorp 的 GPG 私钥泄露事件之所以备受关注的原因。虽然目前还没有迹象表明 HashiCorp 的泄露密钥被攻击者滥用来签署恶意软件,但在泄露的密钥被撤销之前,这种事件确实有可能发生。 针对开发者的 CI/CD 基础设施如今,软件供应链攻击盛行,这些攻击不仅依赖于向用户的 GitHub 项目引入恶意拉取请求,还会滥用 GitHub 的 CI/CD 自动化基础设施 GitHub Actions 来挖掘加密货币。GitHub Actions 为开发人员提供了一种为 GitHub 上托管的存储库安排自动化 CI/CD 任务的方法。 攻击方式主要包括攻击者克隆使用 GitHub Actions 的合法 GitHub 存储库,稍微更改存储库中的 GitHub Action 脚本,并向项目所有者提交拉取请求以将此更改合并回原始存储库。 攻击者 ( edgarfox1982 ) 为合法项目所有者提交拉取请求以合并更改的代码 如果项目所有者随意批准更改的拉取请求,那么供应链攻击就会成功,而且后果远不止于此。恶意拉取请求包含对 ci.yml 的修改,一旦攻击者提交拉取请求,GitHub Actions 就会自动运行这些修改。修改后的代码实质上是滥用 GitHub 的服务器来挖掘加密货币。 这种攻击可谓是一举两得:它诱使开发人员接受恶意拉取请求,如果失败,它就会滥用现有的自动化 CI/CD 基础设施进行恶意活动。 2021 年 1 月,Sakura Samurai 安全人员在研究联合国漏洞披露计划范围内的资产安全漏洞时,发现了一个 ilo.org 子域,该子域暴露了大量 Git 账户信息,使得他们能够成功入侵联合国(UN)域并访问超过 100,000 份 联合国环境规划署(UNEP)工作人员记录。这些记录包括姓名、员工 ID 号、员工组、旅行理由、旅行的开始和结束日期、批准状态、停留时间和目的地。 更糟糕的是,获得 Git 凭证访问权限的威胁行为者不仅可以克隆私有 Git 存储库,还可能在上游引入恶意代码以触发供应链攻击,从而产生更严重的后果。 想要阻止此类攻击,开发人员需要践行安全编码或在开发环境中使用 DevSecOps 自动化工具。同时,保护 CI/CD 管道(例如 Jenkins 服务器)、云原生容器以及附加开发人员工具和基础设施现在也变得同样重要。 使用社会工程学来引入恶意代码任何安全专业人员都知道,安全性取决于其最薄弱的环节。由于人为因素仍然是最薄弱的环节,因此泄露往往来自最意想不到的地方。最近,明尼苏达大学的研究人员被踢出了 Linux 贡献群体,Linux 内核社区也撤销了他们之前提交的所有 Linux 内核代码,原因在于他们故意提出有缺陷的 “ 补丁 “,而这些 “ 补丁 “ 又会在 Linux 内核源代码中引入漏洞。 尽管该事件被积极制止,但还是证实了一个结论:开发人员分布广泛,并且没有足够的宽带来审核他们提交的每一个代码,这些代码可能是存在缺陷的或完全是恶意的。 更重要的是,社会工程学可能来自最不受怀疑的来源——在上述案例中,具有 “.edu” 后缀的电子邮件地址就看似来自可信的大学研究人员。 另外一个突出案例是,任何为 GitHub 项目做出贡献的合作者都可以在发布后更改版本。在此需要强调,GitHub 项目所有者的期望是大多数贡献者都能真诚地提交代码到他们的项目之中。但正可谓 “ 一个老鼠坏一锅汤 “,只要一个合作者不规矩就会损害许多人的供应链安全。 在过去一年中,攻击者创建了域名抢注和品牌劫持包,一再针对开源开发人员在其上游构建中引入恶意代码,然后传播给众多消费者。 所有这些真实世界的例子都展示了威胁行为者在成功的供应链攻击中所采用的不同漏洞、攻击媒介和技术。随着这些攻击不断发展演进并带来挑战,在考虑软件安全性时,必须纳入更多创新的解决方案和策略。 解决办法通知开发人员有关网络攻击的信息对于供应链攻击,开发人员是第一线。您可能会想尝试通过一年一度的课程或更频繁的讲座来涵盖所有基础知识。然而,真正最有效的是开发人员持续更新有关新网络攻击和最佳实践的过程。通过使用微培训,例如文本培训或短视频,开发人员既可以获得他们需要的课程,也可以提高他们的意识。 监控开源项目《2020 年软件供应链状况报告》发现,在 2019 年至 2020 年间,针对开源代码的网络攻击增加了 430%。通过使用对手模拟参与,组织可以直接了解他们的软件在攻击期间的表现如何。开发人员还可以通过提高库、包和依赖项的可见性和安全性来减少依赖项混淆问题,从而降低开源开发带来的风险。 零信任由于移动部分——数据、产品、集成,零信任方法对于降低供应链网络攻击风险至关重要。假设任何设备、用户或数据都不安全,除非另有证明。这样,您通常可以减少和消除可能损害供应链的威胁。 内置数据保护供应链网络攻击的一个关键漏洞是应用程序中的敏感数据,这些数据必须双向流动。此外,请确保您遵守代码中的所有数据隐私和保护法律。开发人员应该在他们的应用程序中构建最新的加密技术。他们还应该对供应链使用数字签名、会话中断和多因素身份验证。 关注第三方风险供应链的本质是组织和应用程序协同工作以进行交付。这可能是通过物理产品或软件安全。但是,每个新连接都意味着更多的高风险端点。请务必仔细检查所有集成和风险。毕竟,你无法保护你不知道的东西。下一步是与供应商和合作伙伴合作,以确保所有各方都遵循网络安全最佳实践并提前应对风险。 在不久的将来,供应链攻击不太可能消退。通过在您的应用程序和文化中构建对此类破坏性网络攻击的弹性,您可以降低风险。