随着容器、微服务等新技术的快速发展,开源软件已成为业界主流形态,开源和云原生时代的到来导致软件供应链越来越趋于复杂化和多样化,网络攻击者开始采用软件供应链攻击作为击破关键基础设施的的重要突破口,从而导致软件供应链的安全风险日益增加。
——《DevSecOps敏捷安全》
一. 开源风险治理为何如此重要?
《供应链攻击威胁局势报告》显示,预计2021年的供应链攻击数量将增加至上一年的四倍之多。《2021年软件供应链安全报告》显示,425名大型企业的IT、安全和DevOps主管中,64%的人报告称去年受到了供应链攻击的影响。Gartner预测,97%的企业应用程序将依赖于开源的使用,且超过70%的应用程序因使用开源组件而产生缺陷和漏洞。
开源≠安全。市场有观点认为,开源项目使用起来更安全,因为当整个社区参与开发和维护项目时,包括安全漏洞在内的问题常常被更快地识别和修复。虽如此,但并不代表开源没有风险。
开源项目是公开的,且对所有人可见,自然也包括恶意攻击者。在其中发现的任何漏洞都会暴露给潜在的攻击者。开源项目越受欢迎,对应攻击事件的影响面也就越大,因而关键基础开源软件需要被重点关注。
二. OpenSCA技术原理
OpenSCA开源项目建立的初衷是“用开源的方式做开源风险治理”这一理念,将商业级的源鉴OSS开源威胁管控平台部分关键技术开源,为广大企业和开发者提供专业的SCA核心工具与社区生态。
OpenSCA继承了商业级的开源应用安全缺陷检测、多级开源依赖挖掘、纵深代码同源检测等核心能力,通过软件成分分析、依赖分析、特征分析、引用识别、合规分析等方法,深度挖掘组件中潜藏的各类安全漏洞及开源协议风险。支持Java、JavaScript(Node.js)、PHP、Python、Go (Golang)、Rust、Erlang等多种主流编程语言并支持生成软件物料清单(SBOM)。后续会逐步增加更多的语言。
图1 OpenSCA支持的编程语言
1. 轻量级零成本安装使用
开发人员在写代码时需要全面思考、高效设计并快速迭代,因而希望工具易用性好、不拖慢开发节奏。
OpenSCA-cli是OpenSCA的命令行工具,支持在Windows/Linux/MacOS操作系统运行使用,部署简单,命令快捷。
云端在线检测:
可关联最新的漏洞数据,通过将本地解析的组件信息(不包含代码信息)上传至OpenSCA云平台进行漏洞库比对,识别组件的漏洞风险信息。
图2 在线检测命令示例
本地离线检测:
可以按照OpenSCA提供的漏洞库格式准备自己的漏洞库信息,无需将解析的组件信息传输到OpenSCA云平台,就可完成组件漏洞检测。
图3 本地检测命令示例
检测结果格式:
支持将检测结果保存到指定文件,根据后缀生成不同格式的文件,默认为JSON格式;支持以SPDX格式展示SBOM清单,只需更换相应输出文件后缀。支持生成HTML格式的检测报告。
检测结果示例:
图4 检测报告示例
2. 分析应用组件成分
引擎首先会检查项目是否有支持的特征文件,如果有特征文件,把需要的特征文件提取出来。解析jar包内的特征文件,如果包内无特征文件或特征文件解析不到有效数据则会尝试用jar包名检索获取组件名称和版本。如果通过jar包名检索失败则会按照"{组件名}-{版本号}.jar"的格式直接解析jar包名。
3.分析组件依赖关系
开源软件包中80%的漏洞存在于传递依赖关系中,这意味着代码中的大多数漏洞都包含在复杂且正在使用的(嵌套)依赖项中。OpenSCA可以准确地检查代码中的所有依赖项,解析代码中使用的开源包的深度和复杂性,能够确保在各个级别都进行合适有效的漏洞检测。
在项目完整编译环境下,许多语言都会有比较成熟的包管理器,OpenSCA可以基于它的依赖配置文件去识别组件。例如mvn dependency:tree获取完整依赖树的过程,通过解析静态文件就可以获取非常完整的依赖关系。
OpenSCA后续新版本也将支持没有构建之前进行源代码层级的组件成分扫描,通过解析特征文件、组件文件、代码片段来识别成分。通过接入GitHub或Gitee的在线代码仓库,一旦仓库添加了新的组件信息,可以在早期检测并帮助开发人员识别潜在的风险。
但是对于本身组件体系完整而普适度高的语言,比如Java当中频繁使用了依赖引用链,这种引用关系往往可能存在2-3层以上,而这种依赖关系仅从静态的pom.xml中是没办法获取的。OpenSCA间接依赖可以从云平台组件库进行完整深度的递归解析所有层级的子依赖。
图5 OpenSCA检测流程
4.分析实际依赖组件
由于已识别的组件漏洞数量庞大,很快就会掩盖了漏洞的可见性及其对企业构成的真实风险指数。但企业发现的实际漏洞中有70%-85%不是致命漏洞,因为企业的专有软件不会调用存在这些漏洞的组件。
如何检测并判断应用实际使用到的组件是不可或缺的关键能力。OpenSCA在解析文件依赖信息时首先会检查组件是否是生产环境的组件(生产/开发环境的组件一般会在依赖文件中标识)。
通过解析过滤掉并非实际使用到的组件,从源头上减少无效组件和漏洞信息带来的干扰。
5. 组件完整性分析
对于jar包文件,会计算其MD5值后与知识库中记录的组件MD5进行匹配,判断当前组件的完整性。
图6 完整性校验流程
6. 检测组件漏洞风险
OpenSCA-cli提供了云平台漏洞库和离线漏洞库两种关联方式,来满足用户的在线和离线使用需求。
因此,OpenSCA的漏洞库的全面性和实时性可以起到重要的分析作用。依赖分析可以知道哪些项目或应用程序受到了漏洞的影响。
长期对知名开源组件追踪,大量漏洞源收集和独家漏洞的补充使得漏洞库快速全面的更新。
基于海量的组件库、漏洞库、许可证库、开源项目库等知识数据能够最大程度的匹配出正确的组件版本和对应的风险信息。通常,同一个漏洞可能存在于同一个组件的多个版本中,又或者同一个漏洞可能存在于不同的组件中,通过对关键漏洞的验证核实,OpenSCA能够最准确的给出修复推荐组件版本和安全的组件版本范围供用户选择。
7. 推荐修复方案
准确覆盖并识别了漏洞风险和优先级,但是如何进行有效修复?OpenSCA具备完善的漏洞修复方案和安全版本的开源组件推荐。
漏洞运营团队会对漏洞进行复现和修复验证。最大程度地完善漏洞修复信息,包括临时补丁、官方补丁、配置文件、缓解措施等。帮助用户快速评估修复影响和修复时间。
8. 提高许可证合规性
企业开发人员不能只是使用、复制、修改或分发开源依赖项。为了在软件中正确且合法地使用开源组件,必须了解在代码中使用的每个开源依赖项的协议权限、限制与使用条件。这将有助于企业创建定义和实施安全准则的策略。
OpenSCA能够从文件级别和代码级别,帮助企业深入了解开源组件的许可条款和条件,以及许可证的兼容关系。在制定安全策略时,企业可以在软件开发生命周期初期采用许可证合规性的规范。
9. 生成SBOM(软件物料清单)
软件物料清单(SBOM,Software Bills of Materials)是描述软件包依赖树的一系列元数据,包括供应商名称、组件名称、版本号、许可证信息、依赖关系等关键信息,通过SBOM技术和管理手段,可以帮助企业或团队梳理并透明化软件供应链资产。
通过使用OpenSCA自动化构建并生成应用程序的SBOM,在每次添加、删除依赖项或更改组件版本时可自动更新SBOM以确保SBOM的准确性。后续也将支持用户上传SBOM清单分析项目是否使用了存在已知漏洞的组件并构建完整的资产风险视图。当其它组件爆出漏洞时也可根据SBOM快速排查受影响项目,提高供应链的透明度和安全性。
三. OpenSCA开源项目的初心
SCA检测涉及源代码解析,部分使用者可能担心代码泄露,开源后,所有检测过程使用者是可控的,没有泄露风险。
开发语言、开发工具五花八门,这使得SCA工具需要针对不同语言进行适配或兼容,使用者可以通过修改代码开发适合自己使用场景的SCA检测工具,如果有更多的贡献者,有助于OpenSCA覆盖更多的检测场景。在更大的范围帮助更多的企业实现开源风险治理,助力开源生态健康有序发展。
四. OpenSCA的优势
1. 先发优势
作为全球首款开源的企业级SCA技术产品,OpenSCA继承了源鉴OSS大量的企业实践落地技术沉淀,后续也将持续吸取商业实践,不断更新优化OpenSCA的服务能力。
2. 社区优势
依托于社区用户参与友好度以及以产品交付能力驱动的社区运营能力,OpenSCA荣获GVP(Gitee最有价值开源项目)年度荣誉与软博会“全球十大开源软件产品”。
和越来越多参与贡献的开发者一起共建,OpenSCA将会更快速成长。
3. 迁移成本优势
用户可以在初期使用OpenSCA来满足业务需求,后续需要更丰富的功能,可以平滑升级到商业企业版本。用户体验和使用习惯可以得到延续,降低迁移成本。
4. 技术优势
4.1 特征检测
对于包管理器的检测方式,支持两种方案,一种是传统的依赖包管理器环境,另一种支持模拟包管理器解析逻辑,具备高度定制化能力。
如何判断是否有版本冲突时的依赖,可以按照包管理器的排除机制处理(maven会采用依赖路径最短的依赖)。比如maven解析pom中的依赖、属性,需要获取pom时去仓库拉取,版本冲突时按照maven的规则进行处理。
4.2 同源检测
开发者可以直接、完整地引入开源组件,但可能在很多时候,只是发现某一个开源项目中某一个代码片段写得不错就选择copy。这个代码片段可能来自Github,行数不等,变量定义不明。此时传统SCA的依赖分析功能无法完成对这些代码片段的识别,需要更进一步的源代码同源分析。
OpenSCA即将发布版本可以检测不同语言的代码片段,识别代码级别引入的开源组件信息,及其关联的漏洞和许可证信息。通过同源检测,可以识别企业项目的代码自研率、代码溯源相似度分析、许可证风险兼容分析等。
4.3 二进制检测
C/C++这样的语言,没有像maven这样统一的包管理器,使得SCA识别起来会有困难。
OpenSCA即将发布版本通过导入二进制文件的方式引入依赖,能够对二进制文件进行扫描并收集其依赖信息。
OpenSCA二进制检测将拥有丰富的二进制分析经验和漏洞挖掘能力。使用数据流、控制流、污点分析等技术,从常见攻击面出发,提炼漏洞的二进制特征,提高版本匹配、漏洞匹配的准确性。无需源码,上传二进制文件,即可实现软件成分分析,生成完整安全报告,帮助客户快速获取软件风险。
4.4 强大的在线库
OpenSCA在线库集成了漏洞库、组件库、许可证库,并进行小时级别的实施更新和人工运营,既保证了数据的全面覆盖,也保证了风险信息的时效性。在检测过程中,引擎可在线调用云平台丰富的库资源进行比对,降低了系统漏报率,并对漏洞修复方案进行持续完善更新,帮助用户对风险进行有效闭环。
五. 期待参与和贡献,共建开源项目
感谢每一位开源社区成员对OpenSCA的支持和贡献。
Gitee已将OpenSCA扫描能力集成进了Gitee Go流水线中,实现了在流水线中对线上代码仓库的组件安全扫描。
图7 Gitee集成OpenSCA服务
OpenSCA的代码会在GitHub和Gitee持续迭代,欢迎Star和PR,成为我们的开源贡献者。有任何建议都可以发在评论区或者OpenSCA项目的Issues中。我们会参考大家的建议不断完善OpenSCA开源项目,敬请期待更多功能的支持。
OpenSCA官网:
https://opensca.xmirror.cn/
GitHub:
https://github.com/XmirrorSecurity/OpenSCA-cli/
Gitee:
https://gitee.com/XmirrorSecurity/OpenSCA-cli/