法律声明 此报告为悬镜安全制作,报告中的文字、图片、表格等版权均为悬镜安全所有。任何组织、个人未经悬镜安全授权,不得转载、更改或者以任何方式传送、复印、派发该报告内容,违者将依法追究法律责任。转载或引用本报告内容,不得进行如下活动: 不得擅自同意他人转载、引用本报告内容。 不得引用本报告进行商业活动或商业炒作。 本报告中的信息及观点仅供参考,悬镜安全对本报告拥有最终解释权。 关于悬镜安全 悬镜安全,DevSecOps敏捷安全领导者。由北京大学网络安全技术研究团队“XMIRROR”发起创立,致力以AI技术赋能敏捷安全,专注于DevSecOps软件供应链持续威胁一体化检测防御。核心的DevSecOps智适应威胁管理解决方案包括以深度学习技术为核心的威胁建模、开源治理、风险发现、威胁模拟、检测响应等多个维度的自主创新产品及实战攻防对抗为特色的政企安全服务,为金融、电信、政务、能源、教育等行业用户提供创新灵活的智适应安全管家解决方案。 悬镜安全官网:https://www.xmirror.cn/。 前言 INTRODUCTION 随着容器、微服务等新技术日新月异,开源软件成为业界主流形态,软件行业快速发展。但同时,软件供应链也越来越趋于复杂化和多样化,软件供应链安全风险不断加剧,针对软件供应链薄弱环节的网络攻击随之增加,软件供应链成为影响软件安全的关键因素之一。近年来,全球针对软件供应链的安全事件频发,影响巨大,软件供应链安全已然成为一个全球性问题。如何更加全面、高效地保障软件供应链的安全对于我国软件行业发展、数字化进程推进具有重要意义。 软件供应链安全作为国家近几年新提出的网络安全理念,不再是针对软件供应链上单一环节进行安全防护,而是针对软件供应链全链路进行安全监控防护,薄弱环节的安全预防更是重中之重。 本白皮书着重分析了软件供应链安全,梳理了软件供应链的安全现状,透过现状全面剖析软件供应链的安全风险及面临的安全挑战,有针对性地提出如何对软件供应链的安全风险进行防范与治理,系统阐述了软件供应链安全的防护体系及软件供应链安全的应用实践以供参考,最后白皮书结合现在软件供应链安全的发展趋势进行了全面的分析及展望。 目录 CONTENTS 1软件供应链概述 1.1软件供应链与传统供应链之间的共性及差异性02 1.2软件供应链的发展历程04 1.3开源和云原生时代改变了传统的软件供应链05 2软件供应链安全现状 2.1国内外软件供应链安全发展现状08 2.1.1国际软件供应链安全发展现状08 2.1.2国内软件供应链安全发展现状09 2.2软件供应链的安全挑战10 2.2.1国际竞争环境加剧,软件供应链完整性遭遇挑战10 2.2.2软件开源化趋势增强,安全风险加剧10 2.2.3软件复杂度增加,软件供应链每一环节均存在风险12 2.2.4难以处理敏捷开发与安全成本之间的平衡12 3软件供应链风险分析 3.1软件供应链风险概述14 3.1.1软件供应链风险现状14 3.1.2软件供应链风险因素分析16 3.2软件供应链的漏洞类型18 3.2.1漏洞来源类型18 3.2.2漏洞状态类型20 3.3软件供应链的攻击类型22 3.3.1预留后门22 3.3.2开发工具污染23 3.3.3升级劫持23 3.3.4捆绑下载24 3.3.5源代码污染24 4软件供应链安全治理方法 4.1体系构建阶段28 4.1.1SDL软件安全开发生命周期28 4.1.2DevSecOps29 4.2设计阶段32 4.2.1软件供应商风险管理流程32 4.2.2软件供应商评估模型32 4.2.3软件供应商风险管理的作用34 4.3编码阶段35 4.3.1构建详细的软件物料清单35 4.3.2使用基于SCA技术的工具38 4.4发布运营阶段40 4.4.1建立成熟的应急响应机制40 4.4.2构建完善的运营保障工具链41 5软件供应链安全应用实践 5.1可信研发运营安全能力成熟度模型46 5.2云安全共享责任模型47 5.3Grafeas开源计划48 01 软件供应链概述 1.1软件供应链与传统供应链之间的共性及差异性 行业内对软件供应链有多种理解,其中包括三种主流理解方式,第一种是将软件供应链单纯视为以开源组件为主的第三方组件供应链条;第二种是将其视为软件生产过程供应链条,包括第三方组件、开发工具和开发环境等要素;第三种是将其视为从原材料开始加工成消费者手中的最终产品并实施运营过程的全流程链条。由于前两种理解存在不同程度的片面性,因此本白皮书中以第三种理解作为阐述基础。 传统供应链的概念可以理解为一个由各种组织、人员、技术、活动、信息和资源组成的将商品或服务从供应商转移到消费者手中的过程,这一过程从原材料开始,将其加工成中间组件乃至最终转移到消费者手中的最终产品。软件供应链是根据软件生命周期中一系列环节与传统供应链的相似性,由传统供应链扩展而来。 图1软件供应链生命周期 软件供应链的生命周期包括原始组件、集成组件、软件产品及产品运营四个环节(如图1所示)。在软件供应链中,原始组件是原材料,集成组件是中间组件,软件产品是交到消费者手中的商品,产品运营是为消费者提供的服务保障产品的正常运行。因此,软件供应链可以理解为软件和系统的从生产到交付全过程,是一套自动化、标准化及规模化的持续交付的流水线。通过设计和开发阶段,将生产完成的软件产品通过软件交付渠道从软件供应链运输给最终用户。 原始组件、集成组件、软件产品及产品运营四部分涵盖保障软件供应链安全涉及的诸多关键安全要素,了解软件供应链的每一个阶段及流程中出现的源代码、工具及集成组件对于构建安全可靠的软件供应链至关重要。 根据软件供应链的定义,软件供应链安全可以被理解为软件生产的整个过程中软件设计与开发的各个阶段来自编码过程、工具、设备、供应商以及最终交付渠道所共同面临的安全问题。 对软件从业者来说,实际需要关注的是自身的软件产品开发过程和运营过程,也就是软件产品和产品运营这两个阶段,软件供应链中的原始组件和集成组件阶段的安全问题应由相应的组件供应商解决。做个类比,假如我们需要生产一部手机,我们需要关注的是手机生产和上市运营。在生产手机过程发生前,我们需要选择可信的零部件供应商,从之购买合格的零部件。而并不需要接管供应商的生产流程,帮助供应商做质量管理。软件产品阶段和产品运营阶段的加总,实际上就是传统概念中的软件生命周期。软件生命周期可以划分为4个主要阶段: 设计阶段、编码阶段、发布阶段、运营阶段(如图2所示)。这也是软件供应链安全治理中真正需要关注的部分。 图2软件供应链生命周期与软件生命周期的关系 软件供应链和传统供应链的安全性之间存在显著的共性及差异性,软件供应链与传统供应链之间的共性是攻击者通过攻击目标供应链中较弱的组成部分,导致产业链上游被污染,大量下游厂商的产品或服务作为上游组件的集合,产生大量潜在的攻击目标,而且基于对产品和服务的潜在信任,导致在安全问题出现时,难以彻底断根筛查。同时,召回问题产品的代价巨大,周期漫长,显著增加了供应链攻击的影响程度。 差异性是软件供应链所受到的攻击与传统供应链相比,软件攻击面的边界由产品本身扩大到软件生产过程中代码、服务及组件的边界,导致软件供应链的受攻击面不断扩大,显著降低了攻击者攻击的难度,这就导致软件供应链攻击可能发生在软件供应链生命周期的任何阶段,同时更聚焦在威胁的高传播性和强隐蔽性,而非仅仅聚焦在瞬间的破坏力上。 1984年,UNIX创造者之一的K.Thompson在A.MTuringAward(ACM)图灵奖的获奖演讲中提到如何通过三步构造一个通过编译器污染所有通过此编译器编译并发布软件的攻击方式,这种攻击可以在人们难以发现的情况下修改编译器,并在其中设置后门。基于此,一个通过攻击软件开发过程中薄弱环节的攻击方式暴露在人们的视野中,这就是令人头疼的AdvancedPersistentThreat(APT)攻击,在著名的震网事件中,非法组织利用震网病毒破坏世界各国的计算机系统,进而破坏国家重要的基础设施。 1995年,软件供应链的概念出现在大众的视野中,之后在2000年,M.Warren和W.Hutchinson提出了利用网络攻击破坏软件供应链的可能性。 2004年,微软公司提出了著名的软件安全开发生命周期流程,这一流程将软件开发流程划分为多个阶段,并在各个阶段中引入不同的安全措施,保障软件开发以及最终用户的安全性,并建立了漏洞发现和漏洞处理框架机制。同时提出了多种安全测试工具以及软件发布后的相关运营管理规范,至今仍是各大企业采用处理软件开发安全问题的重要手段之一。 2010年,R.J.Ellsion和C.Woody两人针对当时软件开发过程中直接采购商品化的产品和技术以及产品外包服务逐渐增加的趋势,出于对软件供应链的安全考虑,针对软件开发过程中提出了软件供应链风险管理这一思想,并介绍了相关的风险来源、种类以及风险的分析方法,并讨论了如何应对软件供应链风险的相关措施。 2014年出现著名的HeartBleed漏洞,作为被基于SSL\TLS的软件和网络服务所广泛使用的开源软件包的漏洞,感染了软件和服务的开发阶段中上游代码和模块,并沿着软件供应链,对供应链下游造成了不可磨灭的负面影响,因此这一事件被广泛认为是一起典型的软件供应链安全事件。由于近年来,一系列具有极高相似性的安全事件频频发生,这些事件中所使用的网络攻击方式与传统攻击方式相比具有更加鲜明的高隐蔽性、高传播性、低成本和高效率的特点,使软件供应链安全这一概念受到产业界和学术界的极大关注。 2017年,微软公司旗下的一个研究团队发出声明,声明中表示微软旗下的安全软件阻挡了一起精心策划的,通过攻击软件更新渠道,将插入了恶意代码的第三方软件传输给使用该软件的多家知名机构的高级持续性威胁攻击。在这篇声明中,微软针对本次安全事件,首次提出了“针对软件供应链的网络攻击”这一概念。 近年来,由于软件开发日益全球化,导致软件供应链的安全风险愈发严峻,已成为人们不可忽视的存在。软件供应链像是一个充满了未知且不可确定危险因素的地带,需要人们给予更多的关注和思考。 开源是指公开源代码的软件,任何人都可以进行自由修改和共享。源代码是程序员可以创建和编辑以改变软件工作方式的代码。通过访问程序的源代码,开发人员或程序员可以通过添加功能或修复有缺陷的部分来改进软件。 在当今快节奏的商业世界中,越来越多的软件团队采用了DevOps等敏捷开发实践以跟上业务的需求,这些做法给开发人员带来了很大的压力,要求他们能够更快地构建和部署应用程序。为了在较短的软件发布周期内成功实现此目标,开发人员经常通过对开源软件组件进行修改添加所需要的功能以加快软件开发的速度。 开源组件已成为企业实现快速开发和科技创新的必要条件。据统计,大部分的商业程序中都包含开源软件,开源为企业节省了大量的时间和金钱、提高了软件生产质量、提供了业务敏捷性并降低了某些业务风险。若没有开源组件,企业的软件生产将成倍地迟缓。据Forrester2021年发布的报告数据显示(如图3所示),开源代码占软件 代码的比例从2015年到2019年的五年时间内几乎翻了一倍。随着开源组件的不断增多,大量的第三方开源组件被插入到产品中,大量开源组件的使用也导致软件供应链变得越来越复杂。 图3开源代码占软件代码的比例不断增长 与开源密切相关并改变传统供应链的还有云原生时代的出现,容器、Docker和Kubernetes(K8s)等概念的出现,改变了传统软件交付的方式,进而影响到软件供应链。容器和K8s的引入导致软件供应链的复杂程度加剧。(如图4所示)通过引入容器和K8s给软件供应链带来更多不可控的第三方依赖,不同于传统的软件供应链,镜像作为软件统一交付的标准在容器场景下被大规模的应用,这极度加大了软件供应链的复杂性。 云原生时代下镜像的使用 镜像构建 镜像传输 镜像运行