一、认识供应链攻击与高危漏洞

在软件开发的世界里,我们经常会用到第三方开源组件。这些组件就像是建房子用的预制模块,能让我们快速搭建出软件的框架,节省时间和精力。然而,这其中也隐藏着不少风险。

1.1 第三方开源组件高危漏洞更新不及时问题

就拿某个热门的电商系统来说吧。开发团队为了快速上线促销活动,引入了一个第三方开源的支付组件。这个组件可以实现各种支付方式,如银行卡支付、第三方支付平台支付等,在开发阶段一切都很顺利,系统成功上线。

可是过了一段时间,安全研究人员发现这个支付组件存在一个高危的漏洞,黑客可以利用这个漏洞篡改支付金额,将客户支付的钱转到自己的账户。这个消息一出,组件的开发者立马着手修复这个漏洞,并发布了更新版本。

但电商系统的开发团队因为工作繁忙,或者没有收到及时的通知,没有第一时间对组件进行更新。这就相当于给黑客留了一扇敞开的门,黑客很容易就可以进入系统,进行恶意操作,给电商平台和客户都带来了巨大的损失。

1.2 供应链攻击之依赖混淆渗透

依赖混淆是供应链攻击的一种常见手段。咱以一个小型的企业管理系统为例。这个系统需要依赖一些外部的库来实现特定的功能,比如文件上传、数据加密等。

开发团队在编写代码的时候,通常会从开源的代码仓库中下载这些依赖库,在下载过程中,黑客会创建一个名字和真实库非常相似的假库。比如说,原本开发团队要下载的库叫 real - data - encryption,黑客创建了一个 real - data - encription,就少了一个字母。

如果开发团队在核查的时候不仔细,很可能就会下载到这个假库。而这个假库里面可能暗藏着恶意代码,一旦运行到生产环境中,黑客就可以通过这些代码获取系统的敏感信息,控制整个系统,造成严重的后果。

二、软件物料清单(SBOM)是什么

软件物料清单就像是一份详细的食材清单,只不过这里的“食材”是软件的各个组成部分。它记录了软件中使用的所有组件、库、模块等信息,包括它们的名称、版本、来源、许可证等。

2.1 SBOM 的基本构成

举个例子,假如我们要开发一个简单的网页应用,它用到了以下几个组件:

// 引入 Express 框架
const express = require('express'); 
// 引入 body - parser 中间件
const bodyParser = require('body - parser'); 
// 引入 EJS 模板引擎
const ejs = require('ejs'); 

const app = express();

// 设置中间件
app.use(bodyParser.json());

// 设置视图引擎
app.set('view engine', 'ejs');

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

对应的 SBOM 可能包括以下内容(用 JSON 格式表示):

{
    "components": [
        {
            "name": "express",
            "version": "4.17.1",
            "source": "npm",
            "license": "MIT"
        },
        {
            "name": "body - parser",
            "version": "1.19.0",
            "source": "npm",
            "license": "MIT"
        },
        {
            "name": "ejs",
            "version": "3.1.6",
            "source": "npm",
            "license": "Apache - 2.0"
        }
    ]
}

这就清晰地列出了这个网页应用所依赖的组件信息,方便后续的管理和审查。

2.2 SBOM 的生成方式

有很多工具可以帮助我们生成 SBOM。以 Node.js 项目为例,我们可以使用 cyclonedx - node - npm 工具。 首先,安装这个工具:

npm install -g @cyclonedx/cyclonedx - node - npm

然后,在项目根目录下运行以下命令生成 SBOM:

cyclonedx - node - npm --output - format xml

这样就会生成一个 XML 格式的 SBOM 文件,详细记录了项目的依赖信息。

三、软件物料清单能做什么

3.1 及时发现高危漏洞

有了 SBOM,开发团队可以及时了解所使用的组件的情况。还是拿前面的电商支付组件漏洞来说,如果有了 SBOM,并且和漏洞数据库进行关联。当安全研究人员发现支付组件的高危漏洞后,漏洞数据库会更新相关信息。

这时,开发团队通过查询 SBOM,就能立刻知道自己的系统中使用了这个有问题的组件,然后及时进行更新。就像我们每天检查食材清单,如果发现有食材变质了,就赶紧把它换掉,保证食品安全一样。

3.2 防范依赖混淆攻击

在面对依赖混淆攻击时,SBOM 也能发挥重要作用。开发团队可以根据 SBOM 中记录的正确组件信息,在下载依赖库的时候进行严格的比对。

比如,在下载之前,先查看 SBOM 中记录的库名称、版本等信息,然后和要下载的库进行仔细核对。如果发现名称有细微差别,就可以判断这可能是一个假库,从而避免下载和使用,有效防范依赖混淆攻击。

3.3 合规性管理

很多行业都有相关的法规和标准要求,比如金融行业对数据安全和隐私保护有严格的规定。软件物料清单可以帮助企业证明自己所使用的组件符合相关的合规要求。

例如,某个金融软件使用了一些加密组件,监管机构可能会要求企业提供这些组件的详细信息,包括来源、许可证等。通过 SBOM,企业可以快速提供这些信息,证明自己的软件是合规的,避免因为合规问题而受到处罚。

四、应用场景分析

4.1 企业级软件项目

在大型企业级软件项目中,通常会涉及到大量的第三方开源组件。这些组件来自不同的供应商,版本也各不相同。

比如一个企业的 ERP 系统,可能会使用到数据库连接组件、报表生成组件、工作流引擎等多个第三方组件。通过建立软件物料清单,可以对这些组件进行全面的管理。

开发团队可以根据 SBOM 了解每个组件的使用情况,及时发现潜在的漏洞和风险。同时,在进行系统升级和维护时,也可以根据 SBOM 确定哪些组件需要更新,提高维护效率。

4.2 开源软件贡献

对于开源软件贡献者来说,软件物料清单同样非常重要。当你向一个开源项目贡献代码时,可能会引入新的依赖组件。

通过提供 SBOM,其他开发者可以清楚地了解你引入的组件信息,方便进行审查和集成。例如,你为一个开源的图像处理库贡献了一个新的功能,并且引入了一个新的图像压缩组件。你提供的 SBOM 可以让项目的维护者快速知道这个新组件的情况,判断是否可以安全地集成到项目中。

五、软件物料清单的优缺点

5.1 优点

提高安全性

如前面所提到的,SBOM 可以帮助及时发现高危漏洞和防范供应链攻击,大大提高了软件的安全性。就像在一个城市中建立了详细的人员档案系统,能够快速识别出可疑人员,保障城市的安全。

便于管理

对于复杂的软件项目,SBOM 提供了一个清晰的组件清单,方便开发团队进行管理。开发人员可以根据这个清单了解每个组件的版本、来源等信息,避免在开发和维护过程中出现混乱。

促进合规

在法规和标准日益严格的今天,SBOM 可以帮助企业满足各种合规要求,避免因为合规问题而带来的法律风险和经济损失。

5.2 缺点

生成和维护成本高

生成 SBOM 需要一定的工具和技术,对于一些小型项目来说,可能没有足够的资源和技术能力来生成和维护 SBOM。而且随着项目的不断发展,组件也会不断更新和变化,需要持续投入精力来维护 SBOM 的准确性。

数据准确性问题

如果 SBOM 中的数据不准确,就会影响其发挥作用。例如,组件的版本信息记录错误,可能会导致开发团队无法正确判断是否存在漏洞。而保证数据的准确性需要严格的质量控制和审核机制,这也增加了管理成本。

六、使用软件物料清单的注意事项

6.1 选择合适的工具

在生成和管理 SBOM 时,选择合适的工具非常重要。不同的项目可能适合不同的工具。例如,对于 Java 项目,可以使用 CycloneDX 等工具;对于.NET 项目,可以使用 SPDX - Tooling 等工具。

开发团队需要根据项目的技术栈和实际需求选择合适的工具,确保工具能够准确地生成和更新 SBOM。

6.2 定期更新 SBOM

软件项目是不断发展变化的,新的组件可能会被引入,旧的组件可能会被淘汰或更新。因此,需要定期更新 SBOM,保证其信息的准确性和及时性。

可以制定一个更新计划,比如每周或每月对 SBOM 进行一次更新,同时在进行重大版本更新、引入新组件时,及时更新 SBOM。

6.3 加强数据验证

为了保证 SBOM 中的数据准确可靠,需要加强数据验证。在生成 SBOM 后,可以通过多种方式进行验证,比如与组件的官方信息进行比对,检查版本号、许可证等信息是否正确。

同时,在从外部获取组件信息时,要确保数据源的可靠性,避免引入错误或不准确的数据。

七、文章总结

在软件开发过程中,引入第三方开源组件是提高开发效率的常用方法,但也带来了高危漏洞更新不及时和供应链攻击等风险。软件物料清单(SBOM)作为一种有效工具,可以帮助我们应对这些风险。

它能及时发现高危漏洞,防范依赖混淆攻击,还能帮助企业进行合规性管理。在企业级软件项目和开源软件贡献等场景中有着广泛的应用。

虽然 SBOM 有提高安全性、便于管理等优点,但也存在生成和维护成本高、数据准确性问题等缺点。在使用 SBOM 时,我们需要选择合适的工具,定期更新 SBOM,并加强数据验证。

总之,软件物料清单在保障软件安全和合规方面有着不可或缺的作用,开发团队应该重视并合理运用 SBOM 来提升软件开发的质量和安全性。