• 近年来,针对软件供应链的安全攻击事件一直呈快速增长态势,造成的危害越来越严重,防范软件供应链安全风险,已经迫在眉睫;

  • 开源软件漏洞频现:截至2020年底,CVE/NVD、CNNVD、CNVD等公开漏洞库中共收录开源软件相关漏洞41342个,其中高达13%(5366个)为2020年度新增漏洞;

  • 研究发现:近9成软件项目存在已知开源软件漏洞;平均每个软件项目存在66个已知开源软件漏洞;影响最广的开源软件漏洞存在于44.3%的软件项目中;15年前开源软件漏洞仍存在于多个软件项目中。

  • 2020年 “奇安信开源项目检测计划”对1364个开源软件项目的源代码安全检测显示:开源软件项目整体缺陷密度为14.96个/千行,高危缺陷密度为0.95个/千行;

近期,奇安信代码安全实验室发布《2021年中国软件供应链安全综合分析报告》。报告主要包括国内企业自主开发源代码安全状况分析、开源软件生态发展与安全状况分析、国内企业软件开发中开源软件应用状况分析、典型应用系统供应链安全风险实例分析、总结及建议等五个方面。

国内企业自主开发源代码安全状况

源代码是软件的原始形态,位于软件供应链的源头。源代码安全是软件供应链安全的基础,其地位非常关键和重要。

2020年全年,奇安信代码安全实验室对2001个国内企业自主开发的软件项目源代码进行了安全缺陷检测,检测的代码总量为335011173行,共发现安全缺陷3387642个,其中高危缺陷361812个,整体缺陷密度为10.11个/千行,高危缺陷密度为1.08个/千行。

1、编程语言分布情况

在被检测的2001个国内企业自主开发的软件项目中,使用数量排名前3的编程语言为Java、PHP、C/C++,对应的软件项目数量分别为1492个、204个和97个。可以看出,相关国内企业在进行软件开发时的首选语言是Java语言,占比高达75%。编程语言的总体分布情况如下图所示。

2、典型安全缺陷检出情况

输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类安全缺陷是程序员在编写软件代码时经常会出现的典型安全缺陷。

典型安全缺陷的检出率可以体现出软件源代码的基本安全状况(检出率指含有某类缺陷的软件项目数占软件项目总数的比例)。在被检测的2001个软件项目中,十类典型安全缺陷的总体检出率为77.8%,每类典型缺陷的检出率及排名如下表所示。

开源软件生态发展与安全状况

Gartner表示,现代软件大多数是被“组装”出来的,不是被“开发”出来的。根据知名研究机构Forrester统计,软件开发中,80~90%的代码来自于开源软件。因此,现代软件的源代码绝大多数是混源代码,由企业自主开发的源代码和开源软件代码共同组成。开源软件是现代软件开发最基础的原材料,与企业自主开发的源代码所处的软件供应链环节相同,也位于软件供应链的源头,其代码自身的安全状况,会直接影响最终软件的安全性。

报告从开源软件生态发展状况、开源软件源代码安全状况、开源软件公开报告漏洞状况、开源软件活跃度状况等四个方面对2020年开源软件生态发展与安全状况进行综合分析。

1、开源软件生态发展状况分析

据奇安信代码安全实验室监测和统计,2019年底和2020年底,主流开源软件包生态系统中开源项目总量分别为2841314个和3814194个,一年间增长了34.2%;截至2020年底,主流开源软件包生态系统中平均每个开源项目有10.2个版本。可以看出,2020年开源软件生态更加繁荣,整体发展非常迅猛。

本报告中对八个典型的开源软件包生态系统进行了进一步的分析和比较,这八个包生态系统为Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift,具体分析如下。

NPM包生态项目数量最多,Godoc包生态增速最快。八个典型的开源软件包生态系统中开源项目数量和增长率情况如下图所示,其中开源项目数量最多的是NPM包生态系统,截至2020年底,其开源项目数量达到了1559835个;开源项目数量增速最快的是Godoc包生态系统,2020年一年间的项目总量增速达到了36.2%。

Maven、Nuget、NPM包生态系统的开源项目开发者比较“勤奋”,开源项目的平均版本数超过11个。截至2020年底,八个典型的开源软件包生态系统的开源项目数量和版本数量如下表所示。其中,Maven包生态系统平均每个开源项目有18.0个版本,Nuget包生态系统平均每个开源项目有11.7个版本,NPM包生态系统平均每个开源项目有11.0个版本。

2、开源软件源代码安全状况分析

奇安信代码安全实验室于2015年初发起了“奇安信开源项目检测计划”,该计划是一项针对开源软件项目的公益性安全检测计划,旨在让广大开发者关注和了解开源软件的安全问题,提高软件安全开发意识和技能。

2020年全年,“奇安信开源项目检测计划”对1364个开源软件项目的源代码进行了安全检测,代码总量为124296804行,共发现安全缺陷1859129个,其中高危缺陷117738个。2020年检测的1364个开源软件项目整体缺陷密度为14.96个/千行,高危缺陷密度为0.95个/千行。

(1)编程语言分布情况

2020年检测的1364个开源项目中,一共涉及到7种编程语言,分别是Java、C/C++、Python、OC、Go、JavaScript、PHP,编程语言的分布情况如下图所示。

(2)典型安全缺陷检出情况

输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类安全缺陷是程序员在编写软件代码时经常会出现的典型安全缺陷

典型安全缺陷的检出率可以体现出软件源代码的基本安全状况(检出率指含有某类缺陷的软件项目数占软件项目总数的比例)。在2020年检测的1364个开源软件项目中,十类典型安全缺陷的总体检出率为56.3%,每类典型缺陷的检出率及排名如下表所示。

3、开源软件公开报告漏洞状况分析

据奇安信代码安全实验室监测与统计,截至2020年底,CVE/NVD、CNNVD、CNVD等公开漏洞库中共收录开源软件相关漏洞41342个,其中5366个为2020年度新增漏洞。

(1)大型开源项目漏洞总数及年度增长TOP20

截至2020年底,历史漏洞总数排名前20的大型开源项目信息如下表所示。

2020年一年间,公开报告漏洞数量增长排名前20的大型开源项目信息如下表所示。

(2)主流开源软件包生态系统漏洞总数及年度增长TOP20

截至2020年底,主流开源软件包生态系统中历史漏洞总数排名前20的开源软件信息如下表所示。

2020年一年间,主流开源软件包生态系统中公开报告漏洞数量增长排名前20的开源软件信息如下表所示。

4、开源软件活跃度状况分析

活跃度也是衡量开源软件安全性的一个重要维度。不活跃的开源软件,无论是更新频率很低,或者被废弃,一旦出现安全漏洞,难以得到及时的修复,安全风险很高;活跃的开源软件中,如果其版本更新发布的频率过高,同样会增加使用者运维的成本和安全风险。在选择使用开源软件时,应该充分考虑这两个因素。

本报告中分析了2020年主流开源软件包生态系统中开源软件的版本更新情况,可以一定程度上体现当前开源软件活跃度的整体状况。

(1)61.6%的开源软件项目处于不活跃状态

我们将一年内未更新发布过版本的开源软件项目定义为不活跃项目。2020年全年,主流开源软件包生态系统中不活跃的开源软件项目数量为2347794个,占比达到61.6%。

本报告中对八个典型的开源软件包生态系统进行了进一步的分析和比较,这八个包生态系统为Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift,其中NPM的不活跃项目数量最多,达到1018533个,Rubygems的不活跃项目比例最高,占比达到86.5%,具体数据见下表。

(2)13000多个开源软件一年内更新发布超过100个版本

2020年全年,主流开源软件包生态系统中,更新发布100个以上版本的开源项目有13411个。前述八个典型的开源软件包生态系统中,一年内更新发布超过100个版本的项目数量见下表。

国内软件开发中开源软件应用状况

现代软件的源代码绝大多数是混源代码,由企业自主开发的源代码和开源软件代码共同组成。本章内容将针对国内企业在进行软件开发工作时,使用开源软件的具体情况进行分析。主要回答两个问题:一是国内企业在软件开发中是否使用以及使用了多少开源软件?二是其使用的开源软件是否存在安全问题?

2020年全年,奇安信代码安全实验室对2557个国内企业软件项目中使用开源软件的情况进行了分析,这些软件项目的应用领域涉及政府、金融、能源等重要行业。分析发现,国内企业在软件开发中普遍使用存在已知漏洞的开源软件,存在巨大的软件供应链安全风险。具体分析数据如下。

1、开源软件总体使用情况分析

(1)国内企业软件项目100%使用开源软件

在被分析的2557个国内企业软件项目中,无一例外,均使用了开源软件。最多的项目使用了3878个开源软件,平均每个项目使用126个开源软件。使用开源软件最多的5个项目情况如下表所示。

经过后续的调研和访谈,我们还发现,软件项目中使用的开源软件数量大大超出了软件项目管理者和程序员自身的认知。由于开源软件之间的依赖关系错综复杂,且软件开发中依赖包的管理通常通过包管理器程序自动管理,软件开发者常常意识不到自己使用了数量巨大的开源软件,因此当某个开源软件曝出安全漏洞时,软件开发者常常“躺枪”而不自知,这中间隐含了巨大的软件供应链安全风险。

(2)流行开源软件被近1/4的软件项目使用

一些流行开源软件会被很多软件项目所使用,这些开源软件一旦出现安全漏洞,影响面将会非常巨大。对于大型企业来说,企业内部可能就有数以百计的软件开发项目,更加需要对流行开源软件保持足够的关注和重视,应该做到对其在本单位内的使用情况心中有数。经统计,在我们分析的2557个国内企业软件项目中,被使用最多的开源软件为Apache Commons Lang,被622个项目所使用,占比达24.3%。被使用最多的前5名开源软件如下表所示。

2、开源软件漏洞风险分析

(1)近9成软件项目存在已知开源软件漏洞

分析发现,在2557个国内企业软件项目中,存在已知开源软件漏洞的项目有2280个,占比高达89.2%;存在已知高危开源软件漏洞的项目有2062个,占比为80.6%;存在已知超危开源软件漏洞的项目有1802个,占比为70.5%。

(2)平均每个软件项目存在66个已知开源软件漏洞

在2557个国内企业软件项目中,共检出168604个已知开源软件漏洞(涉及到4166个唯一CVE漏洞编号),平均每个软件项目存在66个已知开源软件漏洞,最多的软件项目存在1200个已知开源软件漏洞。存在已知开源软件漏洞数量排名前5的项目情况如下表所示。

(3)影响最广的开源软件漏洞存在于44.3%的软件项目中

从漏洞的影响度来分析,影响范围最大的开源软件漏洞为CVE-2020-5421,影响了44.3%的软件项目。影响度排名前5的开源软件漏洞情况如下表所示。

(4)15年前开源软件漏洞仍然存在于多个软件项目中

分析发现,部分软件项目中存在十几年前公开的古老开源软件漏洞,最古老的漏洞是2005年11月公开的CVE-2005-3510,仍然存在于31个项目中。部分古老开源软件漏洞的影响情况如下表所示。

3、开源软件运维风险分析

开源软件运维风险复杂多样,本报告主要从老旧开源软件的使用和开源软件多版本的使用角度进行分析。

(1)18年前的老旧开源软件版本仍在被使用

分析发现,许多软件项目中使用了十几年前发布的开源软件版本,存在很大的运维风险。被使用的老旧开源软件版本中,最老旧的一个是2003年3月3日发布的Apache Xalan 2.5.D1,已经有18年之久,但仍然被7个软件项目所使用。按老旧程度排名前5的开源软件如下表所示。

(2)开源软件各版本使用非常混乱

分析发现,各个项目中开源软件使用的版本非常混乱,并非使用的都是最新版本。Spring Data是被使用版本最多的开源软件,有162个版本在被使用。按照被使用版本的数量排序,排名前5的开源软件情况如下表所示。

总结及建议

软件供应链已经成为网络空间攻防对抗的焦点,直接影响关键基础设施和重要信息系统安全。为了应对软件供应链安全挑战,美国总统拜登在2021年5月12日签署了“加强国家网络安全的行政命令”,明确提出要增强美国联邦政府的软件供应链安全,要求向美国联邦政府出售软件的任何企业,不仅要提供软件本身,还必须提供软件物料清单(SBOM),明确该软件的组成成分。行政命令中还要求美国国家标准与技术研究院(NIST)在6个月内发布软件供应链安全指南,并在1年内发布最终指南。该行政命令被认为是迄今为止美国联邦政府为保护美国软件供应链安全采取的最强劲措施。

当前,我国在软件供应链安全方面的基础比较薄弱,亟需从国家、行业、机构、企业各个层面建立软件供应链安全风险的发现能力、分析能力、处置能力、防护能力,整体提升软件供应链安全管理的水平。现代软件的供应链非常复杂,软件供应链安全管理是一个系统工程,需要长期持续的建设。基于奇安信代码安全实验室的研究和实践,我们建议可从以下方面入手开展软件供应链安全相关工作,并在此基础之上不断增强和完善。

1、对国家与行业监管层面的建议:

  • 制定软件供应链安全相关的政策要求、标准规范和实施指南,建立长效工作机制。

  • 建立国家级/行业级软件供应链安全风险分析平台,具备系统化、规模化的软件源代码缺陷和后门分析、软件漏洞分析、开源软件成分及风险分析等能力,为关键基础设施、重要信息系统用户提供日常的自查服务,及时发现和处置软件供应链安全风险。

  • 在产品测评、系统测评等工作中纳入软件供应链安全的内容,针对软件的源代码、制成品、运行中的软件系统等进行软件供应链安全的测试和评估。

2、对软件最终用户层面的建议:

  • 参照监管要求及业内优秀实践,明确本单位内部软件供应链安全管理的目标、工作流程、检查内容、责任部门,并赋予责任部门足够的权力。

  • 在采购商业货架软件时,应充分评估供应商的安全能力,并与供应商签署安全责任协议,要求供应商提供其软件产品中所使用的第三方组件/开源组件的清单,并明确要求,一旦这些第三方组件/开源组件出现安全漏洞,供应商需同样承担安全责任,提供必要的技术支持。

  • 在自行开发软件系统或委托第三方定制开发软件系统时,应遵循软件安全开发生命周期管理流程,针对软件源代码进行安全缺陷检测和修复,同时要重点管控开源软件的使用,建立开源软件资产台账,持续监测和消减所使用的开源软件的安全风险。

3、对软件厂商层面的建议:

  • 提高安全责任意识,将安全作为产品的基础属性来对待,严控产品的安全质量。

  • 建立清晰的软件供应链安全策略,明确本单位内部软件供应链安全管理的目标、工作流程、检查内容、责任部门,并赋予责任部门足够的权力。

  • 严格管控上游,尤其重点管控开源软件的使用,建立开源软件资产台账,建议采用可融入软件开发流程的开源安全治理工具,持续监测和消减所使用的开源软件的安全风险。

  • 严控自主开发的代码质量,建议采用可融入软件开发流程的软件源代码安全分析工具,持续检测和修复软件源代码中的安全缺陷和漏洞。

  • 建立完善的产品漏洞响应机制,包括产品漏洞信息的收集、漏洞报告渠道的建立和维护、漏洞补丁的开发和发布、客户侧漏洞应急响应和修复支持等。

关注公众号,回复关键词 “ 供应链”,下载《2021年中国软件供应链安全综合分析报告》

关于作者

奇安信代码安全实验室是奇安信集团旗下,专注于软件源代码安全分析技术、二进制漏洞挖掘技术研究与开发的团队,所推出的软件代码安全分析系统——奇安信代码卫士和奇安信开源卫士,目前已在数百家大型企业和机构中应用,帮助客户构建自身的代码安全保障体系。

声明:本文来自安全内参,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。