开源组件安全风险及应对

news2025/6/17 22:42:17

在软件开发的过程中,为了提升开发效率、软件质量和稳定性,并降低开发成本,使用开源组件是开发人员的不二选择(实际上,所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件)。这里的开源组件指的是以开源许可证发布的软件组件、库、框架和工具等,组件的源代码是公开的,而根据不同的许可协议,版权所有者可以授予用户使用、研究、更改和分发软件及其源代码的权力。软件开发人员可以根据所开发程序的不同,选择提供各种功能的开源组件,如Java的SpringBoot框架、Fastjson库、Log4j库,Python中的NumPy库、TensorFlow库,Javascript中的jQuery库等。

对比闭源组件,由于开源组件的源代码公开,使用者能更加容易发现其中存在的漏洞,部分时候漏洞发现者还会提供修复的手段以加快修复进程。然而,并非所有人发现漏洞都会进行通报,对于攻击者而言,公开的源代码使得发现可利用的漏洞更为简单,他们可能并不会将其上报给开源组件的维护者,而是对使用该开源组件的应用进行攻击。另外,由于使用开源组件的程序开发人员大多数对开源组件的源代码并不熟悉,对其的认知仅停留在函数和功能的使用上,对安全性、合法性并无了解,所以这也造成引入开源组件的同时引入了开源组件自身的漏洞,扩大了软件的攻击面。

Black Duck Audit Services团队2023年分析了1703个代码库,并在其年度审计报告中指出,其中96%包含开源组件,其总代码中有76%是开源代码,84%的代码库包含至少一个已知的开源漏洞,48%的代码库包含高危风险漏洞。

图片

根据新思科技(synopsys)2023年的报告《开源安全与风险分析报告》显示:

1703个代码库中,54%的代码库有开源协议冲突,31%的代码库包含没有协议或自定义协议的开源代码,89%的代码库包含超过4年以上未更新的开源代码,91%的代码库包含过去2年未更新的组件,84%的代码库包含至少一个开源漏洞,5%的代码库包含有漏洞的Log4J版本,11%的Java代码库包含有漏洞的Log4J版本。

Gartner预测:

到2025年,全球将有45%的组织的软件供应链遭受攻击,比2021年增加三倍。

根据Veracode 2022年的报告《软件安全状态》显示:

97%的Java应用是由开源组件库构成,77%的第三方组件库漏洞在三个月后依然未被修复。

从上述的报告和预测中可以预见,未来软件安全中开源组件的安全问题会成为软件安全的聚焦点。引入第三方组件导致的安全问题可能造成严重的后果可以参考下面的三个案例:

1992年,Borland InterBase 数据库软件出现隐藏后门事件,该后门在软件中潜藏了8年之久,是由该软件的开发人员写入的,允许未经授权的用户通过特定的用户名和密码访问数据库,并执行一些特权操作,如修改、删除数据。开发人员的用意可能并非主观恶意,但是该后门如若被攻击者提前知晓,便会造成全球范围内的严重后果。

2014年,Heartbleed(心脏出血)漏洞爆出,造成了加拿大税务局泄露了近900人的社会安全号码(Social Security Number,它被用作个人信用记录、就业背景检查以及金融交易中的身份验证等)以及各大网站的用户敏感信息泄露。

2021年,核弹级Log4j漏洞爆出,该漏洞会让攻击者在受害者主机上执行代码,可造成服务器权限被获取,信息泄露等危害。

这些组件正是由于被广泛使用来提升开发效率,导致一旦爆出漏洞,其对于应用程序的危害最终会波及到世界各地的企业集行业,并最终损害到用户利益。

开源组件产生漏洞的原因有很多,根据我们对于最常出现漏洞的Top 20开源组件中最多遇到的漏洞分析,根本的原因如下:

  • 开发人员编写的代码存在漏洞;

  • 组件引入了其他存在漏洞的组件;

  • 攻击者/受信任的开发人员向该组件源码提交了恶意代码;

  • 开源组件所使用的配置文件存在默认安全问题,且用户使用时没有修改。

在开发软件过程中引入的开源组件漏洞不仅会影响到软件的安全性,也会影响到软件的简洁、健壮和稳定,这些技术债务会进一步影响软件的迭代、交付和运营。

此外,开源组件还存在许可协议的问题,许可协议意味着并非所有的开源组件都可以按照使用者的意愿随意使用,部分采用严格的许可协议的开源组件会要求使用该组件的应用程序也必须公开其源码,并限制其商业模式,或是受到开源社区的约束。如使用以GPL3.0协议开源的组件,自身也必须遵循该协议,需要将源代码保持开源和免费。

如果违反使用组件的开源协议可能会造成法律风险和后果:

2017年10月,深圳市中级人民法院某判决显示,使用GPL3.0协议开源组件而未遵循其约定公开源代码的某公司罚款50万元。

图片

2021年10月,软件自由保护协会(Software      Freedom Conservancy,SFC)对智能电视制造商Vizio提起了诉讼,指控其未遵守GNU通用公共许可证(GNU General Public License,GPL)和GNU      Lesser General Public License Version 2.1(LGPL      v2.1)的规定。SFC声称Vizio在其智能电视中使用了包含Linux内核和其他代码修改的SmartCast代码,并未按照GPL许可证的要求发布修改后的源代码或提供书面要求提供源代码的声明。诉讼要求Vizio提供完整的源代码,并要求法院裁定GPLv2和LGPLv2.1要求Vizio提供源代码或书面声明的条款。

2009年12月,软件自由保护协会(Software   Freedom Conservancy,SFC)对西数(Western   Digital)提起诉讼,指控将 BusyBox集成到他们自己的产品中违反了 GPL 许可。2018年7月27日,经过裁决,法院禁止西数销售配备BusyBox的产品,同时,要求西数支付90,000美元的损害赔偿金和法律费用(约合47,000美元)。

Black Duck Audit Services团队的数据表明,在2022年审计的代码库中,54%的代码库包含了许可协议冲突,影响最大的行业是物联网,协议冲突比例高达78%。对比2021年,总体的冲突数量在减少,原因可能与经济下行和对供应链安全的焦虑相关。

图片

自20世纪90年代以来,随着开源软件(Open Source Software, OSS)的普及,与OSS相关的风险也被发现和重视,包括:

  • OSS版本变动引入的风险;

  • 组件漏洞的风险;

  • 许可协议带来的法律风险;

  • 现有代码以及OSS的兼容性风险;

  • OSS文档质量差和过时的风险。

在1998年发现该问题后,人们最初是使用电子表格和文档来跟踪开发人员使用的所有开源组件,这是一种SCA(Software Composition Analysis)技术,用于管理开源组件的使用。但是人工的统计效率低下,且没有一个较好的管理标准,于是2002年,第一个手动开源扫描工具诞生,但是这种技术早期仍然误报率高,需要人工干预,不符合敏捷开发环境的需求。到2011年,SCA技术得到进展,能够实时自动检测漏洞和许可问题,这使得软件开发人员能在开发周期的早期就进行开源组件管理。同时,SCA工具也在发展,如今已经能与存储库、构建工具、包管理、CI/CD等软件开发工具集成。

除此以外,美国NIST(National Telecommunications and Information Administration,国家电信和信息管理局)提出了SBOM(Software Bill of Materials)概念,并在2021年7月发布了SBOM所包含的最小必需元素。

  • 数据字段:存储供应商、组件名、组件版本、组件依赖关系、时间戳、其他唯一标识符、SBOM数据作者。

  • 自动化支持:支持自动化,SBOM可通过工具自动生成,并具备机器可读性,以允许在整个软件生态系统中扩展。用于生成和使用SBOM的数据格式包括SPDX,CycloneDX和SWID标签。

  • 实践和流程:定义SBOM的请求、生成、使用操作,包括:频率、深度、已知未知、分发和交付、访问控制、错误调整。

图片

SCA工具的首要功能是进行组件检测,它会分析项目的源代码、配置文件和构建文件,确定项目中使用的外部依赖库版本和组件。这些依赖可以通过各类语言的管理组件以及其版本的包管理文件来进行依赖组件的自动化识别,如package.json,pom.xml,go.mod,.gradle等。这些文件记录了软件开发过程中使用到的第三方组件,以及第三方组件使用到的一些开源组件。

此外还可通过代码片段、组件哈希值来识别组件,代码匹配主要通过文本比较、代码指纹、代码克隆检测、语义分析、语义分析等方式进行匹配。这几种技术各有优劣:

  • 文本比较算法可能无法捕捉到代码结构和语义上的相似性;

  • 语法分析可能会导致相似代码匹配上同一个组件导致判断不准确;

  • 语义分析建立准确的模型较难,并且在大型代码库中进行全面的语义分析可能耗时较久;

  • 代码指纹的生成算法同样会影响匹配的准确性和全面性,并需要规模庞大的指纹库。

随后,SCA工具会解析项目的依赖关系,包括依赖库之间的版本关系和传递依赖关系,传递依赖关系指的是所引入的开源组件自身也引入了其他组件。

最后,SCA工具将所得的组件依赖关系与已知的组件漏洞库进行比对,检查项目所使用的开源组件是否存在已知漏洞,如若存在则进行漏洞报告。另外,SCA工具还会对组件的许可协议信息进行分析和解释,它会确定哪些许可协议是兼容的,哪些是不兼容或有商业使用的潜在风险的,并给出相应的建议和措施。当前的SCA工具往往也能够生成SBOM,帮助开发团队更好地了解和管理软件项目中的组件及其相关许可风险,从而确保合规性和安全性。

SCA工具属于一种静态分析工具,可以帮助开发团队识别和追踪应用程序中的开源组件信息和漏洞信息,以便及时发现和解决与这些组件相关的潜在安全漏洞和许可证合规性问题。但是其使用中也会存在一些问题:

  • 检测的组件可能会出现误报,或者版本不对的情况,这源于包管理文件的识别错误或是代码匹配的匹配错误。

  • 漏洞库更新的滞后性以及其解决方案并不符合实际场景,大多数企业并没有精力维护开源组件漏洞库,而SCA漏洞数据通常源于一些公开漏洞库,如CISA (US-CERT)、NIST (NVD)、MITRE (CVE)。不对外联网的情况下,会造成对于新漏洞更新不及时以及解决方法不存在的情况。

  • 对于冷门语言的支持性不足,部分语言SCA工具不支持开源组件的识别。

  • 扫描的安全漏洞实际可能并不存在,如所引入的组件被包括在了包管理相关文件中,但实际上项目并没有使用组件的漏洞函数,这时的漏洞实际是误报。

  • 工具虽然提供漏洞的检测和报告,但最终的漏洞修复依然需要人工执行。修复过程可能涉及代码修改、组件配置、升级(依赖)组件版本等操作,其中不同的修复方式对开发项目会带来不同的修复成本(如架构重构),因此会让开发团队对于漏洞修复望而却步。

为了解决以上的问题,提前规避和降低软件开发过程中的风险,需要结合其他的方法。如在开发过程中引入第三方组件时,提前过滤和筛选较为活跃的开源组件项目,具体可以从项目上一次合并的提交时间、提交频率、维护团队人数、社区活跃度多维度评估该组件的活跃性,活跃的项目被攻击者关注的同时,也会被安全人员关注,因此其修复漏洞的效率也会因此变快。

例如下图中的Gitee指数:

图片

并且经常对漏洞库进行更新,对自身所使用组件的漏洞进行订阅,对出现组件误报的情况进行人工验证,同时搭配诸如WAF、RASP等安全防护工具,配置其防御规则,对尚未提供更新版本的组件漏洞利用进行拦截。对于一些行业,如航空航天,汽车,交通和物流等行业,由于其特殊的运行环境和系统结构,可以通过其他措施来降低漏洞的风险,而不是仅仅依靠更新组件到未出现漏洞的办法。这些措施可能是网络隔离,访问控制和监测等操作。当然这并非是说在封闭的系统中,漏洞修复不重要,因为如果封闭环境中漏洞普遍存在,一旦攻击者进入内网,内网可能很快瘫痪。

此外,SCA工具也应当集成到开发人员工具中,如将其作为Atlassian Bamboo,AWS CodeBuild 等CI/CD工具管道中的自动化任务,以便将识别和修复漏洞成为软件开发和构建过程中的第一部分活动这样不仅可以让开发人员适应代码安全,还可以防止后续检测出安全漏洞时做代码重写。

综上,虽然SCA工具能帮助企业管理所开发应用的依赖关系,检测所使用组件的安全问题以及合规性问题,但真正的安全防护以及漏洞治理还是需要多方面的结合来实现。

作者: hu1y40

2024年3月5日 

洞源实验室  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络原理】使用Java基于UDP实现简单客户端与服务器通信

目录 🎄API介绍🌸DatagramSocket🌸DatagramPacket🌸InetSocketAddress 🌳回显客户端与服务器🌸建立回显服务器🌸回显客户端 ⭕总结 我们用Java实现UDP数据报套接字编程,需要借用以下…

深度学习相关概念及术语总结

目录 1.CNN2.RNN3.LSTM4.NLP5.CV6.正向传播7.反向传播8.sigmoid 函数9.ReLU函数10.假设函数11.损失函数12.代价函数 1.CNN CNN 是卷积神经网络(Convolutional Neural Network)的缩写。卷积神经网络是一种深度学习模型,专门用于处理具有网格状…

数据可视化基础篇-图形语法

当我们在制作仪表盘或其他数据可视化时离不开对图表的选择,不同的数据信息该怎么选择图表可能是不少人会遇到的问题。 要解决这个问题我们首先需要理解数据可视化的生成规律或者说是“语法”,目前主流的数据可视化理论认为,可视化是由基础标…

存储引擎的简介

简介: 1.在mysql存储引擎可以说就是指表的类型,可以称为表处理器,以表的形式存储。 2.他的功能就是接收上层传下来的指令,然后对表中的数据进行提取写入操作。 目的: 为了管理方便,我们把连接管理&#xf…

生成对抗网络 (GAN)

生成对抗网络(Generative Adversarial Networks,GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成:一个生成器(Generator)和一个判别器(Discriminator)&…

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II 24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成…

创建数据表

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型:表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后,ES就会自动判断其类型,而且当参数发生变…

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子&#xff0c;会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

洞悉 Kubernetes 高阶奥秘:掌控资源、网络、存储,玩转容器化应用!

昨天我们已经入门了K8S&#xff0c;今天带大家学习一下资源、网络、存储这几个进阶的知识点模块内容。这几天陆陆续续会把K8S从头到尾讲一遍&#xff0c;最后会带大家实战一下&#xff0c;下面就开始今天的学习吧。 高级资源和控制器 Kubernetes 提供了一系列高级资源和控制器…

Toyota Programming Contest 2024#3(AtCoder Beginner Contest 344)(A~C)

A - Spoiler 竖线里面的不要输出&#xff0c;竖线只有一对&#xff0c;且出现一次。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);--(i)) #define debug(a) cou…

【自动化】PyoutuGUI操作键鼠

自动化之PyoutuGUI操作键鼠 文章目录 自动化之PyoutuGUI操作键鼠  &#x1f449;引言&#x1f48e;一、初始化环境二、键盘鼠标事件三、消息框功能四、案例实战自动登录WPS 五、问题解决 &#x1f449;引言&#x1f48e; 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一…

CSS基础知识

font-family: "Trebuchet MS", Verdana, sans-serif; 字体栈&#xff0c;浏览器会一个一个试过去看下哪个可以用 font-size16px; font-size1em; font-size100%;//相对于16px 字体大小&#xff0c;需要进行单位换算16px1em font-weightnormal;//400font-weight属性…

STM32CubeMX学习笔记17--- FSMC

1.1 TFTLCD简介 TFT-LCD&#xff08;thin film transistor-liquid crystal display&#xff09;即薄膜晶体管液晶显示器。液晶显示屏的每一个像素上都设置有一个薄膜晶体管&#xff08;TFT&#xff09;&#xff0c;每个像素都可以通过点脉冲直接控制&#xff0c;因而每个节点都…

2024年3月10日 十二生肖 今日运势

小运播报&#xff1a;2024年3月10日&#xff0c;星期日&#xff0c;农历二月初一 &#xff08;甲辰年丁卯月癸酉日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;龙、牛、蛇 需要注意&#xff1a;鸡、狗、兔 喜神方位&#xff1a;东南方 财神方位&#xff1a;…

Linux——文件重定向

目录 前言 一、重定向 二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符&#xff0c;直到close可以使用文件标识符进行关闭&#xff0c;但是当我们关闭1号&#xff08;stdout&#xff09;时&#xff0c;无法往显…

基于springboot实现图书推荐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0c;比…

软件测试自学和报班学习的区别,各有各的优势和缺点,大家看完之后自己选择喔

时代在进步&#xff0c;人们汲取知识的方式不再是单一的在书本上面&#xff0c;现在网络发达&#xff0c;只需要上网就能找到相关的好多知识&#xff0c;慢慢的大家越来越觉得有了这些知识&#xff0c;只要自己有自制力就完全能够自学到一定的程度。 在自学氛围的影响下&#…

深度学习+感知机

深度学习感知机 1感知机总结 2多层感知机1XOR2激活函数3多类分类总结 3代码实现 1感知机 是个很简单的模型,是个二分类的问题。 感知机&#xff08;perceptron&#xff09;是Frank Rosenblatt在1957年提出的一种人工神经网络&#xff0c;被视为一种最简单形式的前馈神经网络&…