随着容器、微服务等新技术的快速迭代,开源软件已成为业界主流形态,开源和云原生时代的到来导致软件供应链越来越趋于复杂化和多样化,网络攻击者开始采用软件供应链攻击作为击破关键基础设施的的重要突破口,从而导致软件供应链的安全风险日益增加。                                                                                                   ——《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/

OpenSCA用开源的方式做开源风险治理:Why? What? How?的更多相关文章

  1. 从热爱到深耕,全国Top10开源软件出品人手把手教你如何做开源

    摘要:DTT直播邀请到管雷鸣与广大开发者分享"如何在开源领域找到适合自己的路". "想象一下,你写的代码被越来越多的人使用,并极大地帮助他们提高了开发效率和稳定性.&qu ...

  2. 使用开源软件 enfuse 做照片的曝光合成

    使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...

  3. 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区

    不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是 ...

  4. [转载]一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    本文转载自:http://blog.csdn.net/testcs_dn/article/details/38496107 开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区 ...

  5. 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    一张图看懂开源许可协议,开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 首先借用有心人士的一张相当直观清晰的图来划分各种协议:开源许可证GPL.BSD.MIT.Mozi ...

  6. 【转】 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    原文:http://blog.csdn.net/testcs_dn/article/details/38496107 ----------------------------------------- ...

  7. 科通芯城:用B2C的方式做B2B

    上线两年,科通芯城的年收入有望突破50亿,一个传统分销商用2c的方式做b2b,也能进行自我革命. 文 | 王海天 这个网站的名字叫科通芯城,于2011年下半年在深圳正式上线,卖的商品是IC元器件,包括 ...

  8. Atitit.一些公司的开源项目 重大知名开源项目attilax总结

    Atitit.一些公司的开源项目 重大知名开源项目attilax总结 1. Twitter--Bootstrap:1 2. Google2 2.1. Gson2 2.2. Angular.Js2 2. ...

  9. The Data Way Vol.1|风口下的开源市场:如何看待开源与商业的关系?

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  10. DolphinScheduler 荣获 2021 中国开源云联盟优秀开源项目奖!

    点击上方 蓝字关注我们 好消息,中国开源云联盟(China Open Source Cloud League,简称"COSCL")于近日公布 2021 杰出开源贡献者.优秀开源项目 ...

随机推荐

  1. python的列表、元组

    列表(list):是Python中最常用的数据类型之一,字符串里面包含元素的是 一个个的字符,并且字符串是不可能更改的,然而列表不一样,他的每个元素都 可以是任何python类型,而且是可以被更改的 ...

  2. Optional源码分析(涉及Objects源码和Stream源码)

    研究Optional源码之前先谈一谈Objects源码. 主要代码: @ForceInline public static <T> T requireNonNull(T obj) { if ...

  3. 数字孪生和GIS的融合能够为智慧水务带来什么帮助?

    数字孪生和地理信息系统(GIS)的融合在智慧水务领域有着重要的应用前景.让我们一起探讨数字孪生和GIS如何合作,为智慧水务系统带来了哪些帮助. GIS系统提供了准确的地理数据,包括水资源.管道网络.水 ...

  4. STM32CubeMX教程4 EXTI 按键外部中断

    1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...

  5. Pytest07-pytest.ini配置文件

    1.pytest配置文件 固定名称:pytest.ini 作用域:当前目录及子目录 具体配置功能见下: [pytest] # 01 把命令行参数自动添加到这里 addopts = -s -v --ht ...

  6. bash命令的使用

    bash的工作特性之命令执行状态返回值和命令展开所涉及的内容及其示例演出 !脚本执行与调试 1.绝对路径执行,要求文件有执行权限 2.以sh命令执行,不要求文件有执行权限 3..加空格或source命 ...

  7. 2023-06-01:讲一讲Redis常见数据结构以及使用场景。

    2023-06-01:讲一讲Redis常见数据结构以及使用场景. 答案2023-06-01: 字符串(String) 适合场景 缓存功能 Redis 作为缓存层,MySQL 作为存储层,在大部分请求中 ...

  8. 一文让你彻底掌握ThreadLocal

    本文分享自华为云社区<[高并发]一文带你彻底搞懂ThreadLocal>,作者: 冰 河. 我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往 ...

  9. WSDM Cup 2020大赛金牌参赛方案全解析

    近日,在美国休斯敦闭幕的第13届网络搜索与数据挖掘国际会议(WSDM 2020)上,华为云语音语义创新Lab带领来自华南理工大学.华中科技大学.江南大学.武汉大学的四位学生组成的联合团队"X ...

  10. 几款Java开发者必备常用的工具,准点下班不在话下

    摘要:一问一答的形式轻松学习掌握java工具. 以一问一答的形式学习java工具 Q:检查内存泄露的工具有?A: jmap生成dump转储文件,jhat可视化查看. Q:某进程CPU使用率一直占满,用 ...