声明
本文是学习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%。编程语言的总体分布情况如下图所示。
2、典型安全缺陷检出情况
输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类安全缺陷是程序员在编写软件代码时经常会出现的典型安全缺陷。典型安全缺陷的检出率可以体现出软件源代码的基本安全状况(检出率指含有某类缺陷的软件项目数占软件项目总数的比例)。在被检测的2001个软件项目中,十类典型安全缺陷的总体检出率为77.8%,每类典型缺陷的检出率及排名如下表所示。
排名 | 缺陷类型 | 检出率 |
---|---|---|
1 | 输入验证 | 50.8% |
2 | 路径遍历 | 39.6% |
3 | 跨站脚本 | 39.5% |
4 | 注入 | 37.3% |
5 | NULL引用 | 31.8% |
6 | 资源管理 | 31.6% |
7 | 密码管理 | 31.0% |
8 | API误用 | 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%。
Maven、Nuget、NPM包生态系统的开源项目开发者比较“勤奋”,开源项目的平均版本数超过11个。 截至2020年底,八个典型的开源软件包生态系统的开源项目数量和版本数量如下表所示。其中,Maven包生态系统平均每个开源项目有18.0个版本,Nuget包生态系统平均每个开源项目有11.7个版本,NPM包生态系统平均每个开源项目有11.0个版本。
序号 | 包生态系统 | 2020年项目数 | 2020年版本数 | 平均版本数 |
---|---|---|---|---|
1 | Maven | 487799 | 8785416 | 18.0 |
2 | NPM | 1559835 | 17148119 | 11.0 |
3 | Packagist | 309125 | 3035815 | 9.8 |
4 | Pypi | 287113 | 2419533 | 8.4 |
5 | Godoc | 234579 | 1109833 | 4.7 |
6 | Nuget | 307336 | 3588880 | 11.7 |
7 | Rubygems | 163392 | 1094135 | 6.7 |
8 | Swift | 77015 | 474314 | 6.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,编程语言的分布情况如下图所示。
(2)典型安全缺陷检出情况
输入验证、路径遍历、跨站脚本、注入、NULL引用、资源管理、密码管理、API误用、配置管理、日志伪造等十类安全缺陷是程序员在编写软件代码时经常会出现的典型安全缺陷。典型安全缺陷的检出率可以体现出软件源代码的基本安全状况(检出率指含有某类缺陷的软件项目数占软件项目总数的比例)。在2020年检测的1364个开源软件项目中,十类典型安全缺陷的总体检出率为56.3%,每类典型缺陷的检出率及排名如下表所示。
排名 | 缺陷类型 | 检出率 |
---|---|---|
1 | 输入验证 | 34.9% |
2 | 路径遍历 | 30.7% |
3 | 注入 | 28.6% |
4 | NULL引用 | 24.8% |
5 | API误用 | 24.3% |
6 | 资源管理 | 20.7% |
7 | 跨站脚本 | 19.1% |
8 | 日志伪造 | 17.9% |
9 | 密码管理 | 13.8% |
10 | 配置管理 | 12.9% |
3、开源软件公开报告漏洞状况分析
据奇安信代码安全实验室监测与统计,截至2020年底,CVE/NVD、CNNVD、CNVD等公开漏洞库中共收录开源软件相关漏洞41342个,其中5366个为2020年度新增漏洞。
(1)大型开源项目漏洞总数及年度增长TOP20
截至2020年底,历史漏洞总数排名前20的大型开源项目信息如下表所示。
序号 | 大型开源项目 | 主页地址 | 历史漏洞总数 |
---|---|---|---|
1 | Linux Kernel | https://www.kernel.org/ | 4193 |
2 | Chromium (Google Chrome) | http://www.chromium.org/Home | 2658 |
3 | Mozilla Firefox | https://www.mozilla.org/en-US/firefox/ | 2093 |
4 | Thunderbird | https://www.thunderbird.net/zh-CN/ | 1023 |
5 | MySQL | https://www.mysql.com/ | 997 |
6 | PHP | https://www.php.net/ | 653 |
7 | Wireshark | https://www.wireshark.org/ | 597 |
8 | ImageMagick | https://imagemagick.org/ | 597 |
9 | WordPress | https://wordpress.org/ | 561 |
10 | GitLab | https://about.gitlab.com/ | 465 |
11 | Moodle | https://moodle.org/ | 412 |
12 | Xen Project (Hypervisor) | https://xenproject.org/ | 355 |
13 | QEMU | http://www.qemu.org/ | 333 |
14 | FFmpeg | https://ffmpeg.org/ | 324 |
15 | Chakra Core | https://github.com/chakra-core/chakracore | 279 |
16 | phpMyAdmin | https://www.phpmyadmin.net/ | 265 |
17 | Oracle VM VirtualBox | https://www.virtualbox.org/ | 262 |
18 | MediaWiki | https://www.mediawiki.org/ | 231 |
19 | WebKitGTK | http://webkitgtk.org/ | 221 |
20 | Magento | http://www.magento.com/ | 188 |
2020年一年间,公开报告漏洞数量增长排名前20的大型开源项目信息如下表所示。
序号 | 大型开源项目 | 主页地址 | 2020年漏洞增量 |
---|---|---|---|
1 | Chromium (Google Chrome) | http://www.chromium.org/Home | 261 |
2 | GitLab | https://about.gitlab.com/ | 237 |
3 | Linux Kernel | https://www.kernel.org/ | 235 |
4 | Mozilla Firefox | https://www.mozilla.org/en-US/firefox/ | 157 |
5 | Mattermost | http://www.mattermost.org/ | 143 |
6 | MySQL | https://www.mysql.com/ | 139 |
7 | Thunderbird | https://www.thunderbird.net/zh-CN/ | 81 |
8 | Oracle VM VirtualBox | https://www.virtualbox.org/ | 70 |
9 | QEMU | http://www.qemu.org/ | 46 |
10 | Xen Project (Hypervisor) | https://xenproject.org/ | 43 |
11 | ImageMagick | https://imagemagick.org/ | 43 |
12 | FreeRDP | https://www.freerdp.com/ | 40 |
13 | Magento | https://magento.com/ | 40 |
14 | OpenJDK | http://openjdk.java.net/ | 39 |
15 | Nextcloud | https://nextcloud.com/ | 37 |
16 | TensorFlow | https://www.tensorflow.org/ | 35 |
17 | MediaWiki | https://www.mediawiki.org/ | 35 |
18 | Chakra Core | https://github.com/chakra-core/chakracore | 32 |
19 | Ghostscript | https://www.ghostscript.com/ | 27 |
20 | WordPress | https://wordpress.org/ | 24 |
(2)主流开源软件包生态系统漏洞总数及年度增长TOP20
截至2020年底,主流开源软件包生态系统中历史漏洞总数排名前20的开源软件信息如下表所示。
序号 | 开源软件 | 所属包生态系统 | 历史漏洞总数 |
---|---|---|---|
1 | TYPO3 CMS | Packagist | 101 |
2 | Ruby on Rails | Rubygems | 98 |
3 | OpenSSL | Swift | 95 |
4 | Exiv2 | Conan | 80 |
5 | Plone | Pypi | 79 |
6 | Apache Struts | Maven | 78 |
7 | Django | Pypi | 76 |
8 | Dolibarr ERP & CRM | Packagist | 73 |
9 | Symfony | Packagist | 73 |
10 | Puppet | Rubygems | 70 |
11 | Drupal (core) | Packagist | 65 |
12 | silverstripe-framework | Packagist | 62 |
13 | Jackson-databind | Maven | 55 |
14 | Ansible | Pypi | 53 |
15 | keycloak | Maven | 53 |
16 | OpenShift Origin | Godoc | 45 |
17 | SQLite | Swift | 42 |
18 | Zend Framework | Packagist | 39 |
19 | libxml2 | Conan | 36 |
20 | Kubernetes | Godoc | 35 |
2020年一年间,主流开源软件包生态系统中公开报告漏洞数量增长排名前20的开源软件信息如下表所示。
序号 | 开源软件 | 所属包生态系统 | 2020年漏洞增量 |
---|---|---|---|
1 | Jackson-databind | Maven | 26 |
2 | keycloak | Maven | 22 |
3 | Dolibarr ERP & CRM | Packagist | 20 |
4 | Ansible | Pypi | 18 |
5 | Openfire | Maven | 16 |
6 | Electron - Cross-platform desktop application shell | NPM | 16 |
7 | Centreon | Packagist | 14 |
8 | Drupal (core) | Packagist | 14 |
9 | TYPO3 CMS | Packagist | 13 |
10 | October CMS | Packagist | 13 |
11 | Kubernetes | Godoc | 12 |
12 | SQLite | Swift | 12 |
13 | Airflow | Pypi | 12 |
14 | Vault by HashiCorp | Godoc | 11 |
15 | Apache Tomcat | Maven | 10 |
16 | Infinispan | Maven | 10 |
17 | Python Pillow | Pypi | 10 |
18 | Consul | Godoc | 9 |
19 | Plone | Pypi | 9 |
20 | Subrion | Packagist | 9 |
4、开源软件活跃度状况分析
活跃度也是衡量开源软件安全性的一个重要维度。不活跃的开源软件,无论是更新频率很低,或者被废弃,一旦出现安全漏洞,难以得到及时的修复,安全风险很高;活跃的开源软件中,如果其版本更新发布的频率过高,同样会增加使用者运维的成本和安全风险。在选择使用开源软件时,应该充分考虑这两个因素。本报告中分析了2020年主流开源软件包生态系统中开源软件的版本更新情况,可以一定程度上体现当前开源软件活跃度的整体状况。
(1)61.6%的开源软件项目处于不活跃状态
我们将一年内未更新发布过版本的开源软件项目定义为不活跃项目。2020年全年,主流开源软件包生态系统中不活跃的开源软件项目数量为2347794个,占比达到61.6%。
本报告中对八个典型的开源软件包生态系统进行了进一步的分析和比较,这八个包生态系统为Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift,其中NPM的不活跃项目数量最多,达到1018533个,Rubygems的不活跃项目比例最高,占比达到86.5%,具体数据见下表。
序号 | 包生态系统 | 项目总数 | 不活跃项目数 | 不活跃项目比例 |
---|---|---|---|---|
1 | Maven | 487799 | 272555 | 55.9% |
2 | NPM | 1559835 | 1018533 | 65.3% |
3 | Packagist | 309125 | 208890 | 67.6% |
4 | Pypi | 287113 | 170044 | 59.2% |
5 | Godoc | 234579 | 143685 | 61.3% |
6 | Nuget | 307336 | 187238 | 61.0% |
7 | Rubygems | 163392 | 141259 | 86.5% |
8 | Swift | 77015 | 59521 | 77.3% |
(2)13000多个开源软件一年内更新发布超过100个版本
2020年全年,主流开源软件包生态系统中,更新发布100个以上版本的开源项目有13411个。前述八个典型的开源软件包生态系统中,一年内更新发布超过100个版本的项目数量见下表。
排名 | 包生态系统 | 对应的开发语言 | 一年内发布超过100个版本的项目数量 |
---|---|---|---|
1 | NPM | Javascript | 8317 |
2 | Maven | Java | 2264 |
3 | Nuget | .NET | 1104 |
4 | Pypi | Python | 613 |
5 | Packagist | PHP | 554 |
6 | Swift | Swift | 281 |
7 | Godoc | Go | 193 |
8 | Rubygems | Ruby | 38 |
延伸阅读
更多内容 可以点击下载 2021年中国软件供应链安全分析报告. 进一步学习
友情链接
青海省价格监督检查办法.pdf