IT 技能圈有一个永久无解且有争议性的问题,那便是“谁是最好的编程措辞?”事实上,由于各种编程措辞的特性、运用处景不同,它们是各有长处的,但是Whitesource 另辟路子,从安全性方面来衡量一下谁才是最好的编程措辞?
评判方法:我们常常会听到这样的声音:“XX 措辞比 XX 措辞更安全。”实在,编程措辞的安全性也取决于多种成分,为了避免引起歧义,我们先来阐述一下评判方法。
本文中关于安全性的评判标准是基于 Whitesource 的综合数据库,该数据库搜集了来自多个来源的开源漏洞信息,如国家漏洞数据库(NVD)、安全咨询、Github 问题跟踪程序和盛行的开源项目问题跟踪程序。
Whitesource 综合数据库涵盖了 200 多种编程措辞,在这次研究中,我们挑选了过去几年在开源项目中最盛行的个中编程措辞,C、Java、JavaScript、Python、Ruby、PHP 和 C++。
在评判时,我们将参考这些编程措辞的已知的开源安全漏洞的数量、这些漏洞随韶光的严重程度以及常见的 CWE。
谁是最安全的编程措辞?从上图中,我们可以看到在这些编程措辞中,C 措辞的漏洞数量是最多的,占到了过去 10 年报告中的所有漏洞的 47%。
这也使得很多人随意马虎根据这个结果认为 C 措辞最不屈安,但实在事实并非如此。首先,C 措辞是初学者最常利用的编程措辞,产生漏洞的几率无疑就增加了。其次,C 措辞的利用韶光频年夜多数措辞都长,理所应该的会更随意马虎受到攻击。第三,C 措辞还是 Open SSL 和 Linux 内核等紧张根本架构背后的措辞之一。
如果单从安全漏洞数量的维度来看,Ruby 是最安全的编程措辞,而 C 措辞是最不屈安的编程措辞。
随着韶光的推移,每种编程措辞安全漏洞的变革从图中我们可以看到,每个编程措辞都有自己的安全高点和低点,但是在过去的两年中,所有编程措辞的安全漏洞都涌现了大幅的增加,其背后的缘故原由紧张是开源的遍及和大众对付开源组件安全漏洞的认知提高。其余,自动化工具和对 bug 褒奖操持的大量投资也促进了安全漏洞数量的大幅增加。
高严重性漏洞的变革情形接下来,我们来重点关注一下高严重性的漏洞(在通用安全漏洞评估系统 CVSS v2 中高于 7 的漏洞)。
从上图中我们可以看到,虽然 2017 年安全漏洞的数量激增,但是除了 JavaScript 和 PHP 之外,报告中涵盖的大多数措辞中高严重性漏洞的百分比都不才降。
而这得益于创造安全漏洞的自动化工具。这些工具能够很好的创造漏洞,但是漏洞的严重程度并不高,这也是我们看到中等严重的漏洞数量增加的缘故原由。
不同措辞的不同安全漏洞(CWE)
为了更加严谨的研究各种编程措辞的安全性,接下来我们要检讨每种措辞中涌现的漏洞类型,同时为了方便理解它们的弱点和长处,我们剖析了随着韶光的推移在每种措辞中创造的 CWE 类型。
从图中我们可以看到站点脚本(XSS)(也称为 CWE-79)和输入验证(也称为 CWE-20)是涌现频率最高的 CWE。除此之外,其它涌现频率较高的 CWE 包括信息泄露 / 透露(CWE-200)、路径遍历(CWE-22)、权限和访问掌握(CWE-264)。
当漏洞变得越来越盛行时,会有办理这个问题的框架涌现,同时开拓职员也会对该漏洞越来越熟习理解,以是,可能在可预见的未来这个漏洞就会消逝。
各编程措辞的安全漏洞情形C 措辞
C 措辞是目前为止漏洞最多的措辞,虽然在这十年中漏洞数量会涌现上升和低落的情形,但是 C 措辞的漏洞数量一贯是远超其它编程措辞的。
C 措辞安全漏洞:按严重程度
C 措辞的漏洞数量实在逐年增加。2018 年,C 措辞的低严重性漏洞发生率相对较低,只有 7%。其余,C 措辞是唯一存在大量内存破坏问题的措辞,而这些问题被认为是一种关键的薄弱性类型。
C 措辞安全漏洞:CWE
缓冲区缺点(CWE-119)是 C 措辞中最常见的安全漏洞,类似于 C++ 的漏洞配置文件。大多数的编程措辞的 CWE 都与 Web、Web 做事干系,缓冲区缺点和其他干系的 CWE 是不可能在管理措辞中涌现的。
须要把稳的是,这组漏洞(有时称为内存破坏)常日会产生严重后果。
C 措辞中的每个项目的安全漏洞
构建在 C 措辞之上的开源项目很随意马虎被跟踪。从上图中,我们可以看到,Linux 漏洞险些总是在 C 措辞中占很大比例的漏洞。2016 年年中,我们创造了一个臭名昭著的名为 ImageCritical 的漏洞,为了确保安全,安全研究职员对其进行了大量的研究,因此我们可以看到 ImageCritical 在 2017 年呈现出了非常的增长。
Java
Java 安全漏洞:按严重程度
自 2016 年起,Java 的安全漏洞就一贯在不断上升。2018 年,其它编程措辞的安全漏洞数量都不才降,Java 是唯一一个安全漏洞在这一年增加了的编程措辞,更夸年夜的是,2018 年的 Java 安全漏洞比较 2017 年翻了一番。
从上图中,我们可以看到 Java 的严重性安全漏洞一贯坚持在 75%z 旁边,而高严重性安全漏洞在最近两年增加到了 20%。
Java 安全漏洞:CWE
从上图中我们可以看到在 Java 的 CWE 中有一个很特殊的漏洞类型——反序列化问题(CWE-502),这是在所有调查的编程措辞中 Java 所独占的一个漏洞类型,PHP、Ruby 和 Python 中没有涌现反序列化的问题,这到底是研究职员还没把稳到这些编程措辞的反序列化问题还是序列化在其它措辞中更安全呢?
JavaScript
JavaScript 安全漏洞:按严重程度
JavaScript 是唯一一个在过去 10 年中安全漏洞不断增加的编程措辞,其 2017 年的安全漏洞数量是 2016 年的 16 倍,而 2018 年安全漏洞数量又增加了 50% 以上。
为何 JavaScript 的安全漏洞会一贯增长呢?研究职员表示:“紧张缘故原由可能是 JavaScript 作为后端措辞变得越来越盛行了。”
JavaScript 安全漏洞:CWE
JavaScript 有两种常见的 CWE——密码问题(CWE-310)和路径遍历(CWE-22)。研究职员表示,“我们在调查 NPM 包时创造,61% 的 JavaScript 安全漏洞都存在路径遍历和加密的问题,但是这个中 70% 的包都已经不再利用掩护了,且 2018 年的下载量少于 2000 次。”
为什么这两种类型的 CWE 数量会这么多呢?研究职员表示,“缘故原由之一可能是新的自动化工具在这些险些没有掩护下载的包中创造了这些 CWE。”
从调查结果来看,2016 年创造的 JavaScript 安全漏洞险些都是密码问题(CWE-310),而 2017 年创造了绝大多数的安全漏洞都是路径遍历问题(WEE-22)。同时,这两种类型的安全漏洞也导致了 JavaScript 安全漏洞的整体上升。
JavaScript 社区
在研究 JavaScript 的安全漏洞时,研究职员还创造了一个有趣的征象:超过 30% 的 JavaScript 漏洞是在社区平台上公开的。
由于开源社区的分散性,有关安全漏洞的信息被分散在数百个安全顾问、开源项目的问题跟踪者和论坛中。虽然关于这些安全漏洞的信息也可以通过各种渠道被开拓者知晓,但是可信度却无法进行衡量。
PHP
PHP 安全漏洞:按严重程度
“PHP 是最好的编程措辞”,这是一个在技能圈广为流传的段子,乃至非技能人也听过这个段子。但是最近几年来,PHP 的遍及率一贯不才降。2017 年,PHP 的安全漏洞冲破了之前一贯起起伏伏的趋势,数量急剧上升。
在这次调查中,PHP 的安全漏洞数量在所有被调查的编程措辞中排第二。
PHP 安全漏洞:CWE
PHP 是唯一一种具有 SQL 注入(CWE-89)漏洞的措辞。
很多安全专家认为 SQL 注入漏洞该当是良长远的事情了,但是在 PHP 中 SQL 注入漏洞仍是很常见的安全漏洞,尤其是在 2017 年和 2018 年,SQL 注入漏洞的数量特殊高。
针对 PHP 安全漏洞,有人表示:“PHP 措辞中内置的一些设计流程和糟糕的实践,使得开拓者很难编写安全代码和掩护高等别的安全编码。”
Python
Python 安全漏洞:按严重程度
近几年来,Python 得到了飞速的发展,而且其在安全配置文件方面做得也非常不错。大多数编程措辞都是到 2018 年才涌现了安全漏洞低落的情形,但是 Python 的安全漏洞自 2015 年达到峰值,之后就一贯不才降。
且 Python 的高严重性安全漏洞的占比也非常小。
Python 安全漏洞:CWE
Python 中紧张存在 4 种类型的安全漏洞,输入验证(cwe-20)、权限、特权和访问掌握(cwe-264)、跨站点脚本(xss)(cwe-79)和信息泄露 / 泄露(cwe-200)。这些安全漏洞在其它编程措辞中也是非常常见的。
C++
C++ 安全漏洞:按严重程度
C++ 和 C 措辞的安全漏洞情形差不多,由于这两种编程措辞不太适用于 Web 运用程序开拓,由于它们的安全漏洞在其它措辞中不太常见。
C++ 安全漏洞:CWE
从上图中我们可以看到,缓冲器缺点(CWE-119)是 C++ 中最常见的安全漏洞,排在第二位的是输入验证问题(CWE-20)。
输入验证问题(CWE-20)是从 2016 年才开始增加的,而这一增长也侧面表明接下来安全研究职员可能会重点关注输入验证问题。
Ruby
Ruby 安全漏洞:按严重程度
在被调查的七种措辞中,Ruby 的安全漏洞最少,在过去的 10 年中 Ruby 的安全漏洞数量一贯在起起伏伏。
Ruby 安全漏洞:CWE
Ruby 中最常见的安全漏洞是 XSS 漏洞,同时也这是其它编程措辞中比较常见的安全漏洞。其余,CWE-20(输入验证)和 CWE-200(信息泄露 / 表露)在 Ruby 中自 2013 年达到顶峰之后,之后一贯就没有什么变革,这解释大多数的 Ruby 开拓职员已经学会了如何处理它们。
除了 PHP 之外,Ruby 也是唯一一种具有相对较高数量的 SQL 代码注入漏洞的措辞。不过,自 2015 年之后,SQL 注入就在 Ruby 中消逝了,很可能是开拓职员也节制了如何避免 SQL 注入的方法。