数字化时代,软件无处不在。软件已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的根本性、基础性问题。随着软件产业的快速发展,软件供应链也越发复杂多元,复杂的软件供应链会引入一系列的安全问题,导致信息系统的整体安全防护难度越来越大。

一、软件供应链安全现状

近年来,针对软件供应链的安全攻击事件一直呈快速增长态势,造成的危害也越来越严重,其中,开源软件的安全问题尤其值得关注。

(一) 供应链安全事件持续高发

软件供应链安全事件愈演愈烈,下表归纳了最近一年的典型事件,但这只是冰山一角。不难看出,供应链攻击可谓无处不在,在软件生命周期的各个环节中、软件产品的各种元素上都可能发生。

表 1 近一年主要软件供应链安全事件

(二)主要软件供应链攻击类型

软件产品的生命周期包括设计、生产、交付、部署、使用及运营、停止等阶段。面向此生命周期所涉及的分工协作、联合攻关、平台环境等就是软件供应链的主要内容,软件供应链的主要攻击类型也与这些环节密切相关。

生产阶段涉及软件产品的开发、集成、构建等,此阶段的供应链安全问题主要包括三类:第一类是针对软件生产要素的攻击,即攻击者利用安全漏洞、后门等修改编码环境、源码库等开发工具或软件自身,植入恶意代码,并经网络、存储介质等进行传播,用户下载使用后,引入风险;第二类是开发者对所使用的第三方软件,特别是开源组件未经安全测试而直接使用,不了解其中的安全漏洞和法律风险;第三类是软件产品构建时,在编译和链接、产品容器化、打包等过程中,使用的工具或产品对象本身被污染或恶意修改而带来的安全风险,如 Codecov事件。

交付和运营阶段涉及软件产品的发布、传输、下载、安装、补丁升级等,互联网或移动传输介质是其重要手段。在发布和下载方面,发布渠道或商城如对软件安全性缺乏分析和测试则会存在潜在风险;攻击者可通过捆绑攻击,在常用软件中捆绑额外功能,如果这些功能涉及用户隐私、信息的收集,则后患无穷;针对发布站点的攻击,如域名劫持(DNS)、内容分发系统(CDN)缓存节点篡改等,会使用户下载存在恶意代码或后门的软件。在软件更新和升级方面,攻击者可能通过中间人攻击替换升级软件或补丁包,或诱导用户从非官方发布渠道下载,以达到攻击的目的,也可能使用捆绑攻击在升级包中增加额外软件功能。

(三)开源安全问题应特别关注

Gartner 报告曾指出,在当前 DevOps 之类的开发模式下,应用程序中大部分代码是被“组装”而不是“开发”出来的。据其统计,超过 95% 的组织在业务关键 IT 系统中都主动或被动地使用了重要的开源软件(OSS)资产;Forrester Research 研究也表明,应用软件 80%~90% 的代码来自开源组件。因此,开源组件的安全性直接关系到信息系统基础设施的安全,但从前表中可以看出,开源安全性不容乐观,它已成为软件供应链安全问题增长的重要因素。

今年 6 月,代码安全实验室发布了《2021中国软件供应链安全分析报告》。报告通过对 2188个企业软件项目的检测结果进行分析,得出了开源使用的安全状况:所有软件项目均使用了开源软件,平均每个项目使用开源软件数量达 135 个,使用最多的开源软件出现在 581 个项目中,渗透率达到了26.6%;平均每个软件项目存在 52.5 个开源软件漏洞,存在开源软件漏洞、高危开源软件漏洞和超危开源软件漏洞的项目分别为 1695 个、1559 个、1319个,占比分别为 77.5%、71.3%、60.3%;影响面最大的开源软件漏洞(Spring FrameWork 漏洞)出现在973 个项目中,渗透率高达 44.5%,一旦该漏洞被攻击者利用,将影响近半数的企业软件,波及的企业数量更加不计其数。

此外,根据代码安全实验室另一项针对联网设备固件的安全检测表明,摄像头、路由器等智能联网设备的开源软件安全问题也很突出:许多多年之前的老旧漏洞未进行及时修复,86.4% 的设备的最新固件存在至少一个老旧开源软件漏洞,漏洞最多的固件存在 74 个老旧开源软件漏洞,甚至2014 年曝出的“心脏滴血”漏洞,仍然存在于 5.3%的最新设备中。

(四)供应链攻击频发原因分析

生产模式的变化。用户对软件功能、应用实效等方面的需求越来越高,这就要求开发者在短时间内实现相应功能,还要持续不断地进行迭代更新。软件系统往往由自主研发的、开源获取的、外包开发的、商业购买的等多种来源的部件组合而成,为了响应快速开发的需求,软件供应链中第三方来源的如开源、外包、商业等成分软件的占比会增加,从而引入更多“不可控”成分,增加了软件安全评估的难度,也提高了软件供应链风险。

软件自身的变化。软件系统规模越来越大,程序逻辑越来越复杂,因此对软件的理解和分析也越来越难,这也造成了对软件把关和分析技术的门槛越来越高。另外,开源、库文件等提高了代码复用性,但在算法、结构、逻辑、特性等复用的同时,也带来了缺陷、漏洞等风险的复制,极大增加了供应链的攻击面,会造成某一点问题的大面积爆发,利用Struts2 等开源漏洞攻击的影响面之广就是个很好的例子。

环境渠道的多样。软件产品开发、构建、部署、交付等环节的生产线环境和发布渠道越来越多样化、多元化,IDE、代码管理系统、Bug 管理系统、构建工具、CI/CD 工具、云平台部署、交付方式等的选择越来越多,这些辅助工具或渠道的不安全因素会作为“基因”传导至软件产品中,也会增加软件供应链的攻击面。

二、美国和我国的相关举措分析

(一) 美国加快供应链风险管理步伐

早在 2013 年,美国就发布了第一部 ICT 供应链安全方面的标准《供应商关系的信息安全(ISO/IEC 27036)》,针对客户和供应商之间的购买与供应关系,规定了信息安全管理框架;又于 2015 年发布了《联邦信息系统和组织供应链风险管理方法(NIST SP800-161)》,用于指导美国联邦政府机构管理 ICT 供应链的安全风险,包括识别、评估和缓解 ICT 供应链风险等。2020 年底爆发的“太阳风”(SolarWinds)供应链攻击事件,使得美国政府对供应链安全的重视进一步提升。下表列举了 2021 年以来其在供应链安全风险管理方面的一些行动,可以看出,步伐明显加快。

表 2 美国供应链安全风险管理举措

(二) 我国相关法规和标准日趋完善

近年来,我国在网络安全领域的重要法规频频出台,对供应链安全的要求也多有涉及。《网络安全法》规定了网络产品和服务提供者的职责,包括严禁的行为、及时采取补救措施、告知报告义务、维护的延续性等;《网络安全法》《网络安全审查办法》和《关键信息基础设施安全保护条例》针对关键信息基础设施的供应链安全提出了要求,包括对可能影响国家安全的设施进行安全审查、网络产品和服务提供者应配合审查并承诺避免危及供应链安全的行为、安全审查时考虑供应链风险方面的因素、优先采购安全可信的网络产品和服务、与提供者签署协议等。

我国在供应链安全方面的标准体系也日趋完善。《信息安全技术 信息技术产品供应方行为安全准则》(GB/T 32921-2016)从供应商角度入手,规定了信息技术产品供应方的行为安全准则;《信息安全技术 ICT 供应链安全风险管理指南》(GB/T 36637-2018)规定了信息通信技术(ICT)供应链的安全风险管理过程和控制措施,适用于 ICT 供方和需方、第三方测评机构等;国标《信息安全技术 信息技术产品供应链安全要求》针对关键信息基础设施,规定了信息技术产品供应方和需求方应满足的供应链安全要求,该标准已完成征求意见,即将发布;中国信息安全测评中心牵头的国标《信息安全技术 软件供应链安全要求》也在编制中,将对软件供应链所涉及的相关方应满足的安全要求进行规范。此外,国内有些标准虽并非专门针对供应链安全,但也包含一些具体要求:《信息安全技术 网络安全等级保护基本要求》(GB/T 22239-2019)在通用要求里,给出了产品采购与使用、外包软件开发、服务供应商选择等方面的要求;《信息安全技术 云计算服务安全能力要求》(GB/T 31168-2014)对云服务商的供应链从采购过程、外部服务提供商、开发商、防篡改、组件真实性、不被支持的系统组件、供应链保护等方面提出了安全要求。

三、对策与建议

虽然我国已出台了一系列针对软件供应链安全的法规和标准,但包括风险的发现、分析、处置、防护等能力在内的软件供应链安全管理水平仍有待继续提升。建议从三个方面开展相关工作。

(一) 政策层面

建议国家和行业监管部门继续完善和制定软件供应链安全相关的政策、标准和实施指南,建立长效工作机制;建立国家级/行业级软件供应链安全风险分析平台,具备系统化、规模化的软件源代码缺陷和后门分析、软件漏洞分析、开源软件成分及风险分析等能力,及时发现和处置软件供应链安全风险。

(二) 用户层面

建议政企用户参照监管要求及成功案例,明确本单位软件供应链安全管理的目标、工作流程、检查内容、责任部门等;在采购商用现货软件时,应充分评估供应商的安全能力,与其签署安全责任协议,要求提供所使用的第三方组件/开源组件清单,并对出现的安全问题提供必要的技术支持;在自行或委托第三方定制开发软件系统时,应遵循软件安全开发生命周期管理流程,对软件源代码进行安全缺陷检测和修复,并重点管控开源软件的使用,建立开源软件资产台账,持续监测和消减所使用开源软件的安全风险。建议个人用户及时升级软件或打补丁,开启软件安全保护功能,不使用来源不明的应用,做好账户密码设置及管理。

(三) 厂商层面

建议软件产品厂商提高安全责任意识,严控产品安全质量;建立清晰的软件供应链安全策略,明确相关的管理目标、工作流程、检查内容、责任部门等;严控上游,尤其重点管控开源软件的使用,建立开源软件资产台账,采用开源安全治理工具,持续监测和消减其安全风险;严控自主开发代码的质量,采用软件源代码安全分析工具,持续检测和修复软件源代码中的安全缺陷和漏洞;建立完善的产品漏洞响应机制,包括产品漏洞信息的收集、漏洞报告渠道的建立和维护、漏洞补丁的开发和发布、客户端漏洞应急响应和修复支持等。