供应链安全前言

数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已 经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正 在成为当今社会的根本性、基础性问题。

随着软件产业的快速发展,软件供应链也越发复杂多元,复杂的 软件供应链会引入一系列的安全问题,导致信息系统的整体安全防护 难度越来越大。近年来,针对软件供应链的安全攻击事件一直呈快速 增长态势,造成的危害也越来越严重。

2020 年 4 月,Rubygems开源软件包生态系统被放入了数百个恶 意软件包,这些恶意软件包的下载总量近 10 万次。例如,“atlas - client”是一个诱骗的诱饵程序包,用来仿冒“atlas_client”,被下载了超过 2100 次。

2020 年 5 月,GitHub 披露了针对 Apache NetBeans IDE 项目的 开源软件供应链攻击 Octopus Scanner,最终统计显示,有 26 个开 源项目被植入了 Octopus Scanner 后门。

2020 年 12 月,全球著名的网络安全管理软件供应商 SolarWinds 遭遇国家级 APT团伙高度复杂的供应链攻击。该攻击直接导致包括美 国关键基础设施、军队、政府等在内的超过 18000 家客户全部受到影 响,可任由攻击者完全操控。

2021 年 2 月,安全研究人员通过利用开源生态安全机制上的漏 洞,成功侵入了微软、苹果、PayPal、特斯拉、优步等 35 家国际大 型科技公司的内网,这种新颖的软件供应链攻击方式被定义为依赖混 淆攻击。

2021 年 3 月,PHP的 Git 服务器被攻击,攻击者向 git.php.net 服务器上的 php-src 存储库推送了两次恶意提交,在 PHP代码中植入 了一个后门,其目标是可以通过该后门获得运行 PHP的网站系统的远 程代码执行权限。

2021 年 4 月,知名代码测试公司 Codecov 宣布其产品的 bash uploader 脚本被攻击者修改,导致用户在使用 Codecov 产品时,会 向攻击者的服务器发送敏感信息,从而导致攻击者可以获取用户的软 件源代码等机密信息。

攻击不断左移,针对软件供应链的攻击事件频发,系统性的研究 软件供应链安全,防范软件供应链安全风险,已经迫在眉睫。2020年, 奇安信代码安全实验室依托自身在软件安全领域十余年的技术积累, 针对国内软件供应链的安全状况进行了大量的研究、实践和数据分析 工作,形成本报告。报告内容主要包括国内企业自主开发源代码安全 状况分析、开源软件生态发展与安全状况分析、国内企业软件开发中 开源软件应用状况分析、典型应用系统供应链安全风险实例分析、总 结及建议等五个方面,希望可以为相关单位开展软件供应链安全相关 的研究和实践工作提供借鉴和参考。

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

源代码是软件的原始形态,位于软件供应链的源头。源代码安全 是软件供应链安全的基础,其地位非常关键和重要。2020 年全年,奇 安信代码安全实验室对 2001 个国内企业自主开发的软件项目源代码 进行了安全缺陷检测,检测的代码总量为 335011173 行,共发现安全 缺陷 3387642 个,其中高危缺陷 361812 个,整体缺陷密度为 10.11 个/千行,高危缺陷密度为 1.08 个/千行。

1、编程语言分布情况

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

编程语言总体分布情况

44, 2% 6, 0% 5, 0% 1, 0% 50, 3%
61, 3%
97, 5%
204, 10%
1492, 75%
Java PHP C/C++ Python Javascript Go C# Swift OC Cobol
2、典型安全缺陷检出情况

输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、 密码管理、API误用、配置管理、日志伪造等十类安全缺陷是程序员 在编写软件代码时经常会出现的典型安全缺陷。典型安全缺陷的检出 率可以体现出软件源代码的基本安全状况(检出率指含有某类缺陷的 软件项目数占软件项目总数的比例)。在被检测的 2001 个软件项目 中,十类典型安全缺陷的总体检出率为 77.8%,每类典型缺陷的检出 率及排名如下表所示。

排名缺陷类型检出率
1输入验证50.8%
2路径遍历39.6%
3跨站脚本39.5%
4注入37.3%
5NULL引用31.8%
6资源管理31.6%
7密码管理31.0%
8API误用28.7%
9配置管理28.0%
10日志伪造18.2%

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

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%。

典型开源软件包生态系统中项目数量变化情况

MavenNPMPackagistPypiGodocNugetRubygemsSwift
2019年数量3850421174332254710212717172215233871
2020年数量4877991559835309125287113234579307336
增长率26.7%32.8%21.4%35.0%36.2%31.4%
2019年数量 2020年数量 增长率

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

序号包生态系统2020 年项目数2020 年版本数平均版本数
1Maven487799878541618.0
2NPM15598351714811911.0
3Packagist30912530358159.8
4Pypi28711324195338.4
5Godoc23457911098334.7
6Nuget307336358888011.7
7Rubygems16339210941356.7
8Swift770154743146.2
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,编程语言 的分布情况如下图所示。

编程语言总体分布情况

49, 4%49, 4% 69, 5%

84, 6%

618, 45% 174, 13%

5Godoc23457914368561.3%
6Nuget30733618723861.0%
7Rubygems16339214125986.5%
8Swift770155952177.3%
  • 2)13000 多个开源软件一年内更新发布超过 100 个版本

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

排名包生态系统对应的开发语言一年内发布超过 100 个版本的项目数量
1NPMJavascript8317
2MavenJava2264
3Nuget. NET1104
4PypiPython613
5PackagistPHP554
6SwiftSwift281
7GodocGo193
8RubygemsRuby38
四、国内企业软件开发中开源软件应用状况

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

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

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

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

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

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

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

开源软件名称使用它的项目数量被使用率
Apache Commons Lang62224.3%
Apache Commons Collections62024.2%
dom4j: flexible XML framework for Java56322.0%
Simple Logging Facade for Java (SLF4J)51019.9%
Javax Inject47218.5%
2、开源软件漏洞风险分析
  • 1)近 9 成软件项目存在已知开源软件漏洞

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

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

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

项目存在开源软件漏洞数量
项目 11200
项目 21013
项目 3649
项目 4517
项目 5426
  • 3)影响最广的开源软件漏洞存在于 44.3%的软件项目中

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

漏洞名称CVE 编号影响项 目数量影响度
Spring Framework 安全漏洞CVE-2020-5421113244.3%
Google Guava 访问控制错误漏洞CVE-2020-8908102139.9%
Apache Log4j 信任管理问题漏洞CVE-2020-9488102039.9%
FasterXML Jackson-databind 代码问题漏洞CVE-2020-884090535.4%
FasterXML Jackson-databind 代码问题漏洞CVE-2020-2564986633.9%
  • 4)15 年前的开源软件漏洞仍然存在于多个软件项目中

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

漏洞名称CVE 编号发布日期影响项 目数量
Apache Tomcat 目录列表拒绝服务漏洞CVE-2005-35102005.11.0631
Jetty URL 编码的反斜杠源代码泄露漏洞CVE-2005-37472005.11.2241
Apache Tomcat 跨站脚本攻击漏洞CVE-2005-48382005.12.3132
Apache Struts ActionForm 拒绝服务漏洞CVE-2006-15472006.3.3032
Apache Struts 特定参数安全绕过漏洞CVE-2006-15462006.3.30

泛获取开源软件信息和漏洞信息,帮助客户掌握开源软件资产状况, 及时获取开源软件漏洞情报,降低由开源软件带来的安全风险,奇安 信开源卫士目前可识别 4500 多万个开源软件版本,兼容 NVD、CNNVD、 CNVD等多个漏洞库。奇安信代码卫士和奇安信开源卫士目前已经在 数百家大型企业和机构中应用,帮助客户构建自身的代码安全保障体 系,消减软件代码安全隐患,并入选国家发改委数字化转型伙伴行动、 工信部中小企业数字化赋能专项行动,为中小企业提供软件代码安全 检测平台和服务。

本文主要学习 2021年中国软件供应链安全分析报告进行整理的笔记,如有错误,请随时联系

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐