2021 中国软件供应链安全 分析报告

供应链安全前言

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

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

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 个国内企业软件项 目中使用开源软件的情况进行了分析,这些软件项目的应用领域涉及 政府、金融、能源等重要行业。分析发现,国内企业在软件开发中普 遍使用存在已知漏洞的开源软件,存在巨大的软件供应链安全风险。

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

Logo

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

更多推荐