软件已经成为支撑社会正常运转的基本元素,软件行业的蓬勃发展得益于大范围的分工合作以及由此产生的软件供应链,其中开源软件在软件供应链体系中扮演着重要角色。随着软件供应链的复杂性增加,开源安全成为更大的挑战。针对开源软件供应链的安全攻击事件一直呈快速增长态势,造成的危害也越来越严重。因此,《2023软件供应链安全研究报告》被列为软件供应链安全推进工作组(以下简称“工作组”)的年度工作目标之一。
在工作组指导下,由苏州棱镜七彩信息科技有限公司主笔,联合行业研究、应用单位,在前期与国家互联网应急中心(CERT)长期联合开展的相关研究及报告的基础上,充分参考现行国家标准,在充分吸收联合单位研究成果和实践经验基础上,编写了《2023软件供应链安全研究报告》。
本报告参与编制单位
苏州棱镜七彩信息科技有限公司
北京航空航天大学 | 北京中科微澜科技有限公司 |
复旦大学 | 国泰君安证券股份有限公司 |
华能招采数字科技有限公司 | 麒麟软件有限公司 |
统信软件技术有限公司 | 中国联通软件研究院 |
(以拼音首字母为序) |
报告紧扣国标体系,对需方、供方以及开源社区环境进行了全面分析,展现了当前软件供应链安全的整体面貌,对了解当前国内软件供应链安全发展现状具有重要作用。由于报告中涉及方面较多,我们通过连载方式对报告内容进行发布,该系列共分为三篇,本文为第一篇,主要内容为软件供应链安全相关内容与风险现状。
软件供应链安全问题严重,亟待系统解决
(一)软件供应链安全事件频发
- 2022年3月,俄乌热战背景下node-ipc包以反战为名,开发者向自己维护的项目源代码中主动投毒,周下载量100万+。node-ipc是vue-cli的依赖组件,是一个主流的开源包,作者出于个人政治立场投毒,添加恶意js文件,还曾在仓库中加入将俄罗斯与白俄罗斯区域用户数据抹除的恶意代码。
- 2022年3月,全球最大独立开源软件公司SUSE、开源软件巨头红帽、主流云开源容器引擎Docker宣布停止对俄罗斯提供服务。
- 2022年7月,攻击者通过在 NPM 上发布包时绕过双因子认证(2FA),创建了1000多个用户账号,攻击者利用这些账号自动投放1283个包含挖矿脚本 eazyminer的恶意模块,利用数据库、Web等所在服务器的机器闲置资源进行挖矿,如果开发者安装了这些包,则会在被调用时挖掘门罗币。
- 2023年5月,网络安全研究员对适用于Linux和Unix平台的热门开源互联网路由协议套件FRRouting中网关协议BGP的7种不同实现软件进行了分析,发现存在三个漏洞,它们的CVSS 评分均为6.5,可被用于在易受攻击的BGP对等体上实现拒绝服务条件。目前FRRouting用于多家厂商如NVIDIA Cumulus、DENT和SONiC中。
- 2023年7月27日在瑞士日内瓦举办的Open Source Congress,会议讨论的一篇OSI的博客《Meta的LLaMa 2许可证不是开源许可证》,文中认为Llama 2 实际上没有使用OSI(开放源码计划)批准的许可证,也不符合OSD(开放源码定义)。
软件供应链安全直接关系着关键基础设施和重要信息系统安全,软件供应链安全事件频发,对用户隐私、财产安全乃至国家安全造成重大威胁。保障软件供应链安全成为业界关注焦点。
(二)软件供应链安全制约我国网信事业高质量发展
现代软件已经从单体模式演进到以开源软件为代表的规模化协作模式。组织规模庞大、组成复杂、来源多样的开源软件,为用户提供高质量、低风险、可持续演进的软件供应,关注和管控软件供应的全过程,在采购、开发、获取、交付、运维、废止等环节进行全流程管理,关系到我国信息技术产业的核心竞争力、我国新质生产力发展、当前和未来的网信安全。
(三)软件供应链安全风险问题目前解决方式单一
目前软件供应链安全风险问题的解决方式单一,主要体现在以下几个方面:
- 侧重于软件本身的安全性:目前很多安全措施更侧重于软件本身的安全性,比如静态和动态代码分析、漏洞扫描等。这些措施主要是针对软件内部的漏洞和问题,而对于软件供应链整体的安全性考虑相对较少。
- 局限于特定环节的安全措施:一些安全措施更关注软件开发或部署阶段的安全,比如源代码审查、持续集成/持续交付(CI/CD)的安全性等。这种局限性可能会忽略软件供应链其他环节的安全风险。
- 缺乏对开源组件的全面管理:开源组件在软件供应链中占据重要地位,但对于开源组件的安全管理往往较为薄弱,缺乏全面的安全审查和管理措施。
- 安全责任的单一性:当前安全责任往往落在软件开发者或供应商身上,缺乏整个供应链参与的共同责任感和协作机制。
软件供应链安全简介及三大类风险概述
(一)软件供应链安全简介
软件供应链(Software Supply Chain),是指需方和供方基于供应关系,开展并完成软件采购、开发、交付、获取、运维和废止等供应活动而形成的网链结构。软件供应链安全是保护软件供应链各环节免受攻击和其他安全威胁的过程。
(二)软件供应链安全与开源软件的关系
软件供应链安全与开源软件之间存在密切的关系,并且在软件供应链中扮演多个关键角色。主要包括以下方面:
- 依赖关系:许多软件项目依赖于开源软件的库、框架或工具。这些开源组件构成了软件供应链的基础,对于开源软件的安全性和可靠性要求逐渐提高。
- 漏洞和威胁:开源软件中可能存在漏洞和安全威胁,这些问题如果未能及时发现和修复,可能会影响整个软件供应链的安全性。对开源软件的安全性进行评估和管理至关重要。
- 补丁和更新:开源社区通常会及时发布补丁和更新,修复已知漏洞并改进软件功能。软件供应链的安全性需要依赖于开发者及时应用这些更新,以保持软件的安全性和稳定性。
- 社区参与和合规性:参与开源社区可以增进对软件供应链安全的认识和理解,并且有助于确保软件的合规性和法律责任。
(三)软件供应链安全三大类风险简介
在软件供应链各个环节均可能引入安全风险,特别是开发、交付和使用环节更易受到风险攻击。软件供应链安全风险主要分为技术风险、知识产权风险和供应关系风险三类。其中,技术风险主要指软件漏洞、软件后门、恶意篡改和信息泄露等,针对开源软件表现为漏洞安全风险、投毒风险。知识产权风险主要指假冒伪劣、不合规等许可证安全风险。供应关系风险主要是指供应中断导致的断供安全风险。
1技术风险
漏洞安全风险,主要是指开发人员在软件的设计和开发过程中,程序员可能会犯下各种编码错误,例如缓冲区溢出、空指针引用、整数溢出、逻辑设计存在漏洞或者不完善等。这些错误可能导致软件在特定条件下出现不可预料的行为,从而引发安全漏洞。根据其性质和威胁程度进行分类,主要有以下几类 :
- 代码执行漏洞:攻击者可以远程执行恶意代码,控制目标系统。
- 身份认证与授权漏洞:未正确配置或实施访问控制机制,导致攻击者获得未授权的访问权限。
- 信息泄露漏洞:攻击者获取敏感信息,如用户凭证、个人身份信息等
- 拒绝服务(DoS)攻击漏洞:攻击者利用应用程序漏洞,耗尽目标系统的资源,导致服务不可用。
- 逻辑错误导致的漏洞:程序逻辑设计缺陷导致安全漏洞,如0元购物等。
投毒风险,主要是指攻击者在开源软件的供应链中植入恶意程序或代码,从而在用户安装或使用这些软件时造成损害。从攻击复杂度看,有在更新过程中替换相关补丁文件的简单攻击,有在入侵代码库插入恶意代码的复杂攻击。从攻击对象看,有针对开发环境、开发工具、镜像仓库以及软件运行环境的多种攻击方式。
2知识产权风险
知识产权风险主要是指开源可证合规风险,企业或个人使用、修改、再分发开源软件时,由于未能正确理解、遵守或管理相关开源软件许可证,可能导致合规性问题和法律风险的情况。常见开源软件许可证合规风险有:
- 未保留版权声明和许可证信息:一些开源许可证要求用户在使用或分发开源软件时保留原作者的版权声明和许可证信息,如果未能做到这一点,可能违反许可证要求,导致版权问题和法律纠纷。
- 修改和分发许可证不一致:某些开源许可证要求在分发修改后的开源软件时,必须采用相同或兼容的开源许可证,如果采用了不一致的许可证,可能违反了原始许可证的规定,导致合规性问题和法律风险。
- 闭源化开源软件:某些开源许可证要求对基于开源软件的修改或衍生作品开放源代码,如果企业将开源软件闭源化或者未按照许可证要求开放源代码,可能侵犯了开源社区的权益,面临合规性问题和法律风险。
- 未遵循开源软件的分发要求:某些开源许可证要求在分发开源软件时提供原始代码或者链接到原始代码的位置,如果未能遵循这些要求,可能违反了许可证的规定,导致合规性问题和法律风险。
- 混合使用不同许可证的开源软件:在项目中同时使用了多个开源软件,但这些软件采用了不同的许可证,如果未能正确处理这种混合使用的情况,可能导致许可证冲突和合规性问题。
3供应关系风险
企业或个人在使用开源软件时,由于开发者或维护者停止维护、更新或提供支持,导致软件无法得到及时修复漏洞、升级或解决问题的情况。具体包括:
- 安全漏洞无法及时修复:如果开源软件停止维护或更新,新发现的安全漏洞将无法得到及时修复,给攻击者利用的机会。
- 功能缺陷无法解决:停止维护的开源软件将无法解决已知的功能缺陷或问题,可能影响系统正常运行或业务功能实现。
- 不兼容性问题:随着系统或环境的变化,停止维护的开源软件可能出现与新环境不兼容的问题,导致系统不稳定或无法正常运行。
- 法律合规性问题:某些开源软件可能包含特定的许可证或依赖于其他组件,停止维护可能导致合规性问题或侵权风险。
软件供应链安全三大类风险现状及详析
(一)技术风险分析
1、漏洞安全风险分布分析
开源软件是软件供应链的一个重要组成部分,开源项目中包含一个或者多个开源软件,研究团队依托开源漏洞知识库,梳理出16.6万余条开源漏洞。通过分析开源漏洞所关联的厂商和产品信息,经合并去重后最终得到了15.3万余个开源项目;知识库中收录的开源项目总数为2439万余个,存在漏洞的开源项目占比为0.627%。通过对存在漏洞的开源项目厂商、产品、Star数量等维度进行分析,得出以下结论:
知名的开源项目更易受到漏洞挖掘人员的关注,超1/3开源漏洞集中于100个知名的开源项目。如Android、Linux kernel、Firefox等。
图1 Top 500开源漏洞分布图
2023年新增开源漏洞21,236条,相较于2015年翻了5.45倍,近9年的开源漏洞数量整体上呈增长态势。
图2 项目漏洞数量变化趋势图
2、开源漏洞的生态影响力
开源漏洞的生态影响力是衡量其传播和危害指数的一个重要维度。软件开发中经常引用组件来实现某些功能,组件之间存在层层引用的依赖关系,其中,仅考虑直接依赖,影响力最大的开源组件 http://golang.org/x/net被240,733个开源组件所直接依赖。此类基础开源组件一旦爆发漏洞,那么将被广泛传染并对整个开源软件供应链造成巨大影响力,如Apache Log4j2 远程代码执行漏洞对整个Java Web软件供应链造成了巨大的安全影响。
图3 开源组件漏洞影响力排序
随着漏洞数量的增加和传染范围的扩大,供应链的攻击面也随之扩大,攻击者可以通过攻击供应链中的任何一个环节来影响整个供应链的安全性。
3、开源漏洞的挖掘与发现
为了验证开源项目安全漏洞的普遍性,同时探索挖掘开源安全漏洞的难易程度,研究团队依据star数降序随机选取了国际知名开源基金会Apache中的10个顶级项目,使用FossEye等工具开展了近6个月的安全研究工作。
图4 开源项目排序
经深度研究分析与安全测试,累计发现了40余个新漏洞,目前已获得CNVD原创证书20余篇,部分展示在下表中。
图5 开源漏洞成果
本次针对开源项目开展的漏洞挖掘实战受时间限制仅挑选了特定具有代表性的项目,就已发现众多安全漏洞。
4、投毒风险
投毒是一种典型的开源软件供应链攻击方式,通过将恶意代码注入到托管在软件包仓库中的软件包来达到攻击效果。目前投毒攻击手法和动机也日趋多样,投毒攻击手法由单一方式向多种方式转变,投毒者开始利用编译预设条件、代码混淆等安全对抗技术来躲避安全检测。
开源软件攻击呈现爆炸增长态势,开源软件供应链攻击在过去三年中平均年增长率达到了惊人的742%。检测发现2023年发现了超过245,032个恶意软件包,是2019年至2022年间数量的两倍。
2024年发生了引起广泛震动的XZ开源项目投毒事件。有开发人员在安全邮件列表上发帖称,他在调查SSH性能问题时发现了涉及XZ包中的供应链攻击,进一步溯源发现SSH使用的上游liblzma库被植入了后门代码,影响版本为5.6.0、5.6.1,恶意代码可能允许攻击者通过后门版本的SSH非授权获取系统的访问权限。
图6 攻击活动时间线
XZ库的编译脚本会在特定条件下从bad-3-corrput_lzma2.xz、
good-large_compressed.lzma文件中读取恶意payload对编译结果进行修改,其利用glibc的IFUNC特性劫持系统OpenSSH 服务的RSA_public_decrypt函数,使得认证过程中当RSA公钥n满足一定条件时触发恶意代码,解密流量里的C2命令并执行,需要特定私钥才能触发,但由于私钥未公开,目前无法获取后门利用的流量。该后门漏洞已被CVE漏洞库收录,编号为:CVE-2024-3094。
(二)许可证合规风险
开源许可证(Open Source License)是用于规范受著作权保护的软件在规定条款、条件下被使用或分发等行为的许可证。一般指具备广泛认可性的、具有法律性质的协议,也称开源协议,目的是减少作者及用户针对开源软件权责的法律解释成本。常见开源许可证有通用公共许可证(GNU General Publie license, GPL),Mozila公共许可证(Mozilla Public License, MPL),BSD许可证(Berkeley Software Distribution license, BSD License)等。
开发人员经常在软件开发中引入开源的代码片段、函数、方法等,使得所开发的软件代码中经常会包含各种不同开源许可证的子组件。这些子组件许可证条款与开源项目整体主许可证的条款冲突时,就会产生许可证合规风险。
(三)断供风险
开源软件的使用者应该只使用那些有着强大社区支持的组件。每天有来自数百个组织的成千上万名开发者改进Linux,但较小的项目就不会有功能升级、代码改进或者已知安全问题的修复。
我们将2023年度未发布新版本的开源软件项目定义为不活跃项目。根据托管组件数排序,我们对top10开源软件包生态系统进行分析和比较发现,go语言生态不活跃项目占比最高为97.7%。
图7 不活跃的开源组件占比
由于开源组件不再维护,一旦出现安全漏洞,可能会对企业或个人的业务运作和安全造成影响:
- 安全漏洞无法及时修复:如果开源软件停止维护或更新,新发现的安全漏洞将无法得到及时修复,给攻击者利用的机会。
- 功能缺陷无法解决:停止维护的开源软件将无法解决已知的功能缺陷或问题,可能影响系统正常运行或业务功能实现。
- 不兼容性问题:随着系统或环境的变化,停止维护的开源软件可能出现与新环境不兼容的问题,导致系统不稳定或无法正常运行。
- 法律合规性问题:某些开源软件可能包含特定的许可证或依赖于其他组件,停止维护可能导致合规性问题或侵权风险。