—— 中国软件供应链安全 ——
现状与发展篇
发布机构:奇安信代码安全实验室
01 概述
数字化时代,软件的重要性和软件供应链安全问题的严峻性已成为各方共识。为此,奇安信代码安全实验室去年发布了《2021中国软件供应链安全分析报告》,从多个维度分析了软件供应链的安全风险,并提供了详实的统计数据。【附报告链接:(https://h5.qianxin.com/threat/report/detail/132)】
本报告是该系列年度分析报告的第二期,继续针对国内企业自主开发的源代码、开源软件生态、国内企业软件开发中开源软件应用等的安全状况,以及典型应用系统供应链安全风险实例进行深入分析,并总结趋势和变化。本年度报告相比于去年的报告新增了以下内容:在开源软件生态发展与安全部分新增了关键基础开源软件分析;在企业软件开发中的开源软件应用部分新增了漏洞利用难度的统计分析和开源许可协议风险分析;在典型软件供应链安全风险实例部分,重点分析了利用开源软件“老漏洞”攻破最新主流产品的实例,通过多个实例验证了由于软件供应链的复杂性,开源软件的“老漏洞”也可以起到“0day漏洞”的攻击效果。上述报告内容的变化,感兴趣的读者在阅读时可以重点关注。
1.软件供应链安全攻击事件保持持续高发
在过去的一年中,针对软件供应链的安全攻击事件依然呈现出高发态势,造成的危害也非常严重。
2021年8月,台湾芯片设计厂商Realtek称,其WiFi模块的三款开发包(SDK)中存在4个严重漏洞。攻击者可利用这些漏洞攻陷目标设备并以最高权限执行任意代码。这些SDK用于至少65家厂商制造的近200款物联网设备中。
2021年10月,攻击者劫持了NPM包 ua-parser-js作者的账户约4小时,意图安装恶意软件。ua-parser-js每周下载量超过700万次,广泛应用于Facebook、苹果、亚马逊、微软、IBM等硅谷巨头企业中。
2021年11月,热门NPM包coa和rc连续遭劫持,并被植入恶意代码,影响全球React管道。coa库每周下载量约900万,用于GitHub上近500万个开源库中,rc库每周下载量达1400万。
2021年12月,Apache Log4j2曝出Log4Shell漏洞(CVE-2021-44228),Apache Log4j2是Java应用最广泛的开源日志组件,广泛应用于政府、企业和公共服务机构的平台、应用和业务系统中,该漏洞覆盖范围广而且利用门槛低,对大量系统和机构造成了严重影响。
2022年3月,俄乌冲突中,NPM开源包Node-ipc的作者RIAEvangelist作为反战人士,在代码仓库中进行了“供应链投毒”,添加的恶意js文件能够在包使用者的桌面创建反战标语。Node-ipc使用非常广泛,每周下载量超过100万次。
2022年4月,以色列安全公司发现高通和联发科芯片的音频解码器存在三个漏洞(CVSS评分为9.8、7.8和5.5),来源于11年前苹果公司开发的开源无损音频编解码器Apple Lossless。利用这些漏洞进行攻击,可获取受影响移动设备媒体、音频会话的访问权限及摄像头数据流等,漏洞影响范围包括数百万安卓设备。
2022年5月,安全研究人员在NPM注册表中发现了一些恶意软件包,与大多数恶意软件相比,其危险性更大,攻击者可以通过后门完全控制被感染的机器。分析人员称,这是一次依赖混淆攻击,其目标非常明确,并且掌握了非常机密的内部信息。德国的著名媒体、物流和工业企业等机构受到攻击。
2.开源软件安全风险
奇安信代码安全实验室通过数据对比分析发现,与前一年度相比,国内企业自主开发源代码的安全状况有较明显的改善,千行代码缺陷密度和十类典型安全缺陷的总体检出率均有明显下降,这应该得益于软件源代码安全缺陷分析工具的持续应用,以及程序员编写代码时的安全意识提高。但开源软件安全风险仍然居高不下,开源软件的安全风险管控是当前软件供应链安全保障需要解决的核心焦点问题。
1)国内企业自主开发源代码安全性明显改善
2021年,国内企业自主开发源代码的整体缺陷密度和高危缺陷密度相比2020年均有所下降,其中高危缺陷密度下降较为明显,从1.08个/千行降为0.65个/千行;十类典型安全缺陷的总体检出率从2020年的77.8%下降到59.9%,下降了近18%。
2)开源生态保持蓬勃发展,开源软件自身安全问题更加严峻
2020年底和2021年底,主流开源软件包生态系统中开源项目总量分别为3814194个和4395386个,一年间增长了15.2%,开源生态依然保持蓬勃发展的态势。与此同时,开源软件漏洞数量持续增长,2021年新增的开源软件漏洞达到6346个;不活跃的开源项目占比从去年报告的61.6%提升至69.9%。根据“奇安信开源项目检测计划”的实测数据显示,所检测开源软件的总体缺陷密度和高危缺陷密度略高于去年,依然处于较高的水平;十类典型缺陷的总体检出率为73.5%,远高于去年的56.3%。总体来看,开源软件自身的安全问题日益严峻。
02 国内企业自主开发源代码安全状况
源代码安全是软件供应链安全的基础。2021年全年,奇安信代码安全实验室对2406个国内企业自主开发的软件项目源代码进行了安全缺陷检测,检测的代码总量为550808816行,共发现安全缺陷5427125个,其中高危缺陷359055个,整体缺陷密度为9.85个/千行,高危缺陷密度为0.65个/千行。与2020年相比,整体缺陷密度和高危缺陷密度均有下降,其中高危缺陷密度下降较为明显,从1.08个/千行下降至0.65个/千行。
1.编程语言分布情况
在2406个国内企业自主开发的软件项目中,使用数量排名前3的编程语言为Java、C/C++、PHP,对应的软件项目数量分别为1441个、516个和102个,其中Java语言项目占比达60%。相关国内企业在进行软件开发时,Java语言仍然是首选。编程语言的分布情况如下图所示。
2.典型安全缺陷检出情况
输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类典型安全缺陷的总体检出率(检出率指含有某类缺陷的软件项目数占软件项目总数的比例)为59.9%,低于去年报告的77.8%。
每类典型缺陷的检出率、排名及排名变化情况如下表所示。除API误用类缺陷的检出率从去年报告中的28.7%升至31.5%外,其他缺陷的检出率均有不同程度的下降。
03 开源软件生态发展与安全状况
开源软件是现代软件开发最基础的原材料,其代码自身的安全状况,会直接影响最终软件的安全性。本年度报告从开源软件生态发展状况、开源软件源代码安全状况、开源软件公开报告漏洞状况、开源软件活跃度状况、关键基础开源软件分析等五个方面对2021年开源软件生态发展与安全状况进行综合分析。相比于去年的报告,本章节新增了“关键基础开源软件分析”部分,针对使用广泛的关键性、基础性开源软件进行分析,希望能够初步刻画当前软件世界的“底座”及其安全状况。
1.开源软件生态发展状况分析
据奇安信代码安全实验室监测和统计,2020年底和2021年底,主流开源软件包生态系统中开源项目总量分别为3814194个和4395386个,一年间增长了15.2%;截至2021年底,主流开源软件包生态系统中平均每个开源项目有11.8个版本,较去年报告的10.2个版本有所增加。可以看出,2021年开源软件生态依然繁荣。
对Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift等八个典型开源软件包生态系统的具体分析如下:
NPM包生态项目数量最多,Godoc包生态增速最快。这一状况与去年报告保持一致。八个典型的开源软件包生态系统中开源项目数量和增长率情况如下图所示,其中开源项目数量最多的是NPM包生态系统,截至2021年底,其开源项目数量达到了1892984个;开源项目数量增速最快的是Godoc包生态系统,2021年一年间的项目总量增速达到了39.9%。
Maven、NPM、Nuget三个包生态系统的开源项目开发者仍然是“最勤奋”,开源项目的平均版本数超过12个。截至2021年底,八个典型的开源软件包生态系统的开源项目数量和版本数量如下表所示。其中,Maven包生态系统平均每个开源项目有高达19.9个版本,各包生态系统的开源项目平均版本数较去年均有不同程度的增长。
2.开源软件源代码安全状况分析
2021年全年,“奇安信开源项目检测计划”对1780个开源软件项目的源代码进行了安全检测,代码总量为164414083行,共发现安全缺陷2648242个,其中高危缺陷162959个。2021年检测的1780个开源软件项目整体缺陷密度为16.11个/千行,高危缺陷密度为0.99个/千行,均略高于去年报告的14.96个/千行和0.95个/千行。
1)编程语言分布情况
检测的1780个开源项目中,共涉及7种编程语言,分别是Java、C/C++、Python、OC、Go、JavaScript、Kotlin,编程语言的分布情况如下图所示。
2)典型安全缺陷检出情况
2021年检测的1780个开源软件项目中,输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类典型安全缺陷的总体检出率为73.5%,远高于去年报告的56.3%。每类典型缺陷的检出率、排名及排名变化情况如下表所示。
3.开源软件公开报告漏洞状况分析
据奇安信代码安全实验室监测与统计,截至2021年底,CVE/NVD、CNNVD、CNVD等公开漏洞库中共收录开源软件相关漏洞52716个,其中有6346个漏洞为2021年新增漏洞。
1)大型开源项目漏洞总数及年度增长TOP20
截至2021年底,历史漏洞总数排名前20的大型开源项目信息如下表所示。历史漏洞数排在前三的项目与2020年相同,是Linux Kernel、Chromium (Google Chrome)和Mozilla Firefox。
2021年一年间,公开报告漏洞数量增长排名前20的大型开源项目信息如下表所示,Linux Kernel一年来增加的漏洞最多,达到419个。
2)主流开源软件包生态系统漏洞总数及年度增长TOP20
截至2021年底,主流开源软件包生态系统中历史漏洞总数排名前20的开源软件信息如下表所示。
2021年一年间,主流开源软件包生态系统中公开报告漏洞数量增长排名前20的开源软件信息如下表所示。
4.开源软件活跃度状分析
活跃度也是衡量开源软件安全性的一个重要维度。不活跃的开源软件,一旦出现安全漏洞,难以得到及时的修复;活跃的开源软件中,如果其版本更新发布的频率过高,同样会增加使用者运维的成本和安全风险。
1)7成开源软件项目处于不活跃状态
我们将超过一年未更新发布过版本的开源软件项目定义为不活跃项目。2021年全年,主流开源软件包生态系统中不活跃的开源软件项目数量为3071132个,占比达到69.9%,与去年报告的61.6%相比,有所增加。
对八个典型的开源软件包生态系统进行分析和比较发现,各包生态系统中不活跃项目的占比较去年报告数据均有小幅升高,其中NPM的不活跃项目数量最多,达1318868个,Rubygems的不活跃项目比例最高,占比达到89.6%。具体数据见下表。
2)近2万个开源软件一年内更新发布超过100个版本
2021年全年,主流开源软件包生态系统中,更新发布100个以上版本的开源项目有19265个,高于去年报告的13411个。八个典型的开源软件包生态系统中,一年内更新发布超过100个版本的项目数量见下表。
5.关键基础开源软件分析
现代软件开发的“大厦”可以说构建在开源生态基础之上。在开源生态中,有一些开源软件的地位非常重要,它们被众多其他的开源软件所依赖,被广泛的使用在各种软件系统之中,这些开源软件可以说是现代软件开发的核心基础设施和底座,我们将其称为“关键基础开源软件”。
因为“Log4Shell”漏洞(CVE-2021-44228)而被更多人熟知的Apache Log4j2就是关键基础开源软件中的一员,“Log4Shell”漏洞也让我们认识到,关键基础开源软件一旦出现漏洞,其放大效应非常显著,影响范围巨大且难以消除。本节将分析主流开源生态中的关键基础开源软件及其安全状况,希望通过此分析,可以让我们看到还有哪些开源软件可能会成为下一个Apache Log4j2,也可以启发我们关于开源软件安全更进一步的思考。
1)主流开源生态关键基础开源软件TOP50
关于开源软件重要性的度量,目前并没有被广泛认可的标准,OpenSSF的“关键性评分(Criticality Score)”是可参考的一种方法,但其更像是对软件健康度的度量,不够直观。从安全的视角来看,如果开源软件出现漏洞后,造成的放大效应越大,影响的范围越广,那么这个软件就越重要,这样直接依赖数将是决定一个开源软件重要与否的关键性指标。本报告将使用直接依赖数作为开源软件重要性度量的唯一指标,并且基于经验参考将直接依赖数大于1000的开源软件定义为关键基础开源软件。
分析发现,Maven、NPM、Nuget、Pypi、Packagist、Rubygems等主流开源生态中直接依赖数大于1000的开源软件共有1068款,直接依赖数排名TOP50的软件见下表。从表中可以看出,开源软件junit:junit的直接依赖数高达95614,排名第一,大名鼎鼎的Apache Log4j2并没有出现在TOP50中,其直接依赖数为7233,排在第103名。换句话说,如果TOP50表里的任何一款开源软件曝出严重漏洞,其影响可能都会大过Apache Log4j2 的“Log4Shell”漏洞(CVE-2021-44228)
2)2/3的关键基础开源软件从未公开披露过漏洞
公开披露产品漏洞信息,将漏洞进行编号,相关信息收录到主流漏洞库中,有助于漏洞的消控工作,也是目前软件产品厂商的常规做法,目前国际软件大厂在产品漏洞信息的公开披露方面可以说都做的比较优秀,但是对于开源软件来说,目前的情况参差不齐,既有漏洞披露流程很正规的优秀开源项目,也有很多没有漏洞披露流程的开源项目。分析发现,在上述的1068款关键基础开源软件中,有711款从未公开披露过漏洞,占比高达66.6%。然而,从未公开披露过漏洞并不代表没有漏洞,对于关键基础开源软件来说,如果没有正规的漏洞披露流程,安全风险很大。
造成这种现象的原因主要有两个,一是有很多漏洞被修补但没有公开披露,甚至没有被记录,这种情况在开源社区中比较常见,其隐藏的安全风险很大;二是这些开源软件还没有引起足够的关注,针对其的漏洞挖掘研究不多,还是“一片未开垦的荒地”,而对于漏洞挖掘来说,这种“荒地”可能意味着未来的“产粮大户”,随着软件供应链攻击越来越被攻击者青睐,这些关键基础开源软件将是未来防范的重点和难点。
3)关键基础开源软件的整体运维风险较高
从“版本更新时间”和“周提交频率”两个维度来分析,近一半的关键基础开源软件活跃度很低。其中,半年内没有发布过新版本的关键基础开源软件有428款,占比为40.1%;一年内周平均提交次数小于5的关键基础开源软件数量为503,占比为47.1%;一年内周平均提交次数小于1的关键基础开源软件数量为334,占比为31.3%。
另外,在TOP50的关键基础开源软件中,只有24款软件明确已获得大厂或者基金会的支持,有9款软件的Github贡献者数量小于100,而npm生态中的fs-extra则主要是由JP Richardson个人来维护的。
整体来看,关键基础开源软件的运维状况并不乐观,相关安全风险较大。
04 附录:奇安信代码安全实验室简介
奇安信代码安全实验室是奇安信集团旗下,专注于软件源代码安全分析技术、二进制漏洞挖掘技术研究与开发的团队。实验室支撑国家级漏洞平台的技术工作,多次向国家信息安全漏洞库(CNNVD)和国家信息安全漏洞共享平台(CNVD)报送原创通用型漏洞信息并获得表彰;帮助微软谷歌、苹果、Cisco、Juniper、Red Hat、Ubuntu、Oracle、Adobe、VMware、阿里云、飞塔、华为,施耐德,Mikrotik,Netgear,D-Link,Netis,ThinkPHP,以太坊、Facebook、亚马逊、IBM、SAP、NetFlix、Kubernetes、Apache基金会、腾讯、滴滴等大型厂商和机构的商用产品或开源项目发现了数百个安全缺陷和漏洞,并获得公开致谢。目前,实验室拥有国家信息安全漏洞库(CNNVD)特聘专家一名,多名成员入选微软全球TOP安全研究者、Oracle安全纵深防御计划贡献者等精英榜单。在Pwn2Own 2017世界黑客大赛上,实验室成员还曾获得Master of Pwn破解大师冠军称号。
基于奇安信代码安全实验室多年的技术积累,奇安信集团在国内率先推出了自主可控的软件代码安全分析系统——奇安信代码卫士和奇安信开源卫士。奇安信代码卫士是一套静态应用程序安全测试系统,可检测2600多种源代码安全缺陷,支持C、C++、C#、Objective-C、Swift、Java、JavaScript、PHP、Python、Cobol、Go等20多种编程语言。奇安信开源卫士是一套集开源软件识别与安全管控于一体的软件成分风险分析系统,通过智能化数据收集引擎在全球范围内广泛获取开源软件信息和漏洞信息,帮助客户掌握开源软件资产状况, 及时获取开源软件漏洞情报,降低由开源软件带来的安全风险,奇安信开源卫士目前可识别9000多万个开源软件版本,兼容NVD、CNNVD、CNVD等多个漏洞库。奇安信代码卫士和奇安信开源卫士目前已经在数百家大型企业和机构中应用,帮助客户构建自身的代码安全保障体系,消减软件代码安全隐患,并入选国家发改委数字化转型伙伴行动、工信部中小企业数字化赋能专项行动,为中小企业提供软件代码安全检测平台和服务。
END
往期推荐
在“软件定义一切”的当今世界,人民生活、国家发展,各行各业与软件息息相关。但当前软件供应链安全问题对关键信息基础设施保护、数字产业高质量发展带来巨大挑战。在工业和信息化部网络安全管理局指导下,由六家企事业单位(中国信息通信研究院、中国电信集团有限公司、中国移动通信集团有限公司、中国联合网络通信集团有限公司、中国铁塔股份有限公司、奇安信科技集团股份有限公司)发起筹建的信息通信软件供应链安全社区应运而生。社区致力于软件供给过程的安全生态建设,为产业链、供应链各相关方等提供研讨、研发、协作、共治的平台。

