随着容器、微服务等新技术的疾速迭代,开源软件已成为业界支流状态,开源和云原生时代的到来导致软件供应链越来越趋于复杂化和多样化,网络攻击者开始采纳软件供应链攻打作为击破要害基础设施的的重要突破口,从而导致软件供应链的平安危险日益减少。
——《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-cli 是 OpenSCA 的命令行工具,反对在 Windows/Linux/MacOS 操作系统运行应用,部署简略,命令快捷。
云端在线检测:
可关联最新的破绽数据,通过将本地解析的组件信息(不蕴含代码信息)上传至 OpenSCA 云平台进行破绽库比对,辨认组件的破绽危险信息。
本地离线检测:
能够依照 OpenSCA 提供的破绽库格局筹备本人的破绽库信息,无需将解析的组件信息传输到 OpenSCA 云平台,就可实现组件破绽检测。
检测后果格局:
反对将检测后果保留到指定文件,依据后缀生成不同格局的文件,默认为 JSON 格局;反对以 SPDX 格局展现 SBOM 清单,只需更换相应输入文件后缀。反对生成 HTML 格局的检测报告。
检测后果示例:
2. 剖析利用组件成分
引擎首先会查看我的项目是否有反对的特色文件,如果有特色文件,把须要的特色文件提取进去。解析 jar 包内的特色文件,如果包内无特色文件或特色文件解析不到无效数据则会尝试用 jar 包名检索获取组件名称和版本。如果通过 jar 包名检索失败则会依照 ”{组件名}-{版本号}.jar” 的格局间接解析 jar 包名。
3. 剖析组件依赖关系
开源软件包中 80% 的破绽存在于传递依赖关系中,这意味着代码中的大多数破绽都蕴含在简单且正在应用的(嵌套)依赖项中。OpenSCA 能够精确地查看代码中的所有依赖项,解析代码中应用的开源包的深度和复杂性,可能确保在各个级别都进行适合无效的破绽检测。
在我的项目残缺编译环境下,许多语言都会有比拟成熟的包管理器,OpenSCA 能够基于它的依赖配置文件去辨认组件。例如 mvn dependency:tree 获取残缺依赖树的过程,通过解析动态文件就能够获取十分残缺的依赖关系。
OpenSCA 后续新版本也将反对没有构建之前进行源代码层级的组件成分扫描,通过解析特色文件、组件文件、代码片段来辨认成分。通过接入 GitHub 或 Gitee 的在线代码仓库,一旦仓库增加了新的组件信息,能够在晚期检测并帮忙开发人员辨认潜在的危险。
然而对于自身组件体系残缺而普适度高的语言,比方 Java 当中频繁应用了依赖援用链,这种援用关系往往可能存在 2 - 3 层以上,而这种依赖关系仅从动态的 pom.xml 中是没方法获取的。OpenSCA 间接依赖能够从云平台组件库进行残缺深度的递归解析所有层级的子依赖。
4. 剖析理论依赖组件
因为已辨认的组件破绽数量宏大,很快就会覆盖了破绽的可见性及其对企业形成的实在危险指数。但企业发现的理论破绽中有 70%-85% 不是致命破绽,因为企业的专有软件不会调用存在这些破绽的组件。
如何检测并判断利用理论应用到的组件是不可或缺的要害能力。OpenSCA 在解析文件依赖信息时首先会查看组件是否是生产环境的组件(生产 / 开发环境的组件个别会在依赖文件中标识)。
通过解析过滤掉并非理论应用到的组件,从源头上缩小有效组件和破绽信息带来的烦扰。
5. 组件完整性剖析
对于 jar 包文件,会计算其 MD5 值后与知识库中记录的组件 MD5 进行匹配,判断以后组件的完整性。
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 流水线中,实现了在流水线中对线上代码仓库的组件平安扫描。
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/