研究报告:C语言竟然最不安全!来辩么?
编译:代码卫士团队
可以说,技术从头到脚“千疮百孔”。我们见识了最底层的硬件错误如英特尔公司“出品的”Spectre 和 Meltdown 漏洞,而往上看,则会发现编程语言漏洞,而且多得“就像那天上的星星”。
开源安全公司 WhiteSource 近期发布了一份关于过去十年来,使用最广泛的七大语言中包含的开源安全漏洞问题。为找到这些漏洞,该公司使用了语言安全数据库,数据源自美国国家漏洞库、安全公告、GitHub 问题追踪和开源项目问题追踪等。
哪种语言的漏洞总量最多?
结果不出意外,这七大流行语言是 C、Java、JavaScript、Python、Ruby、PHP 和 C++。
而漏洞最多的语言是:C,且以绝对优势胜出。在所报告的漏洞中,几乎近50%位于C语言中。
图:各语言漏洞数量占比
就像谷歌 Linux 内核安全工程师 Kees “Case” Cook 最近所说的那样,“C 是一种迷人的汇编语言,它几乎可以算作是机器代码。”但是,“C具有一些令人担忧的未明确行为以及其它一些弱点,最终导致安全缺陷和易受基础设施的情况出现。”
不过 WhiteSource 公司表示,“这并不是说 C 语言的安全性不及其它语言。C语言中存在如此多的开源漏洞的原因是:首先,C语言要比其它语言的使用时间要长,而且编写的代码数量最多;C语言同时是主流基础设施如 OpenSSL和 Linux 内核使用的语言之一。数量之多和集中程度之高是C语言中出现最多开源漏洞的原因。”
图:各语言漏洞数量对比情况
他们说的倒也有道理。但是,在使用C语言并和它斗智斗勇的十年期间,在 C 语言中搞出糟糕的安全问题也过于容易。例如,C语言中含有大量不确定行为,导致各种恶意之徒趁虚而入。
哪种语言的高危漏洞数量最多?
不过,C++ 在过去的五年中“喜得”最多数量的高危漏洞。长期折磨C语言的缓冲区错误现在也开始频繁现身于 C++ 中。
图:各语言高危漏洞数量
话虽如此,可能是最流行的语言 JavaScript也是唯一一个在过去十年间漏洞数量在持续增长的语言。
报告指出,在嘲笑 JavaScript 之前,得首先说明一点,这些结果容易引起误解。JavaScript 语言中最常见的 CWE 漏洞是很少被使用、维护或支持的 JavaScript 包中的路径遍历漏洞和加密问题。那么,为什么出现的是这两种漏洞问题呢?因为发现漏洞的是新型的自动化程序。
另外一种在安全漏洞方面“颇有建树”的是 Python。对,就是经常被群嘲的 Python。
最常出现的 CWE 漏洞
最常见的 CWE 漏洞和语言种类息息相关。
语言类型 | 最常见漏洞类型#1 | 最常见漏洞类型#2 | 最常见漏洞类型#3 |
C | CWE-119 缓冲区错误 | CWE-20 输入验证 | CWE-339 资源管理错误 |
PHP | CWE-79 跨站点脚本 (XSS) | CWE-89 SQL 注入 | CWE-264 许可、权限和访问控制 |
Java | CWE-200 信息泄露/暴露 | CWE-20 输入验证 | CWE-79 跨站点脚本 (XSS) |
JavaScript | CWE-310 加密问题 | CWE-22 路径遍历 | CWE-79 跨站点脚本 (XSS) |
C | CWE-119 缓冲区错误 | CWE-20 输入验证 | CWE-200 信息泄露/暴露 |
Python | CWE-20 输入验证 | CWE-264 许可、权限和访问控制 | CWE-79 跨站点脚本 (XSS) |
Ruby | CWE-79 跨站点脚本 (XSS) | CWE-264 许可、权限和访问控制 | CWE-20 输入验证 |
几乎所有的语言中都含有某些 CWE 漏洞。两种 CWE 漏洞霸占70%的最常见语言:跨站点脚本漏洞 (XSS) CWE-79 和输入验证 CWE-20。
多次出现的其它 CWE 漏洞还包括信息泄漏/暴露 (CWE-200)、路径遍历 (CWE-22) 和 CWE-264 许可、权限和访问控制。上述最后一种 CWE 漏洞最近已被更具体化即访问控制不当 (CWE-284)。
七大语言的几种“最”
C 语言可以说是当之无愧的漏洞老大。十年来漏洞总量都稳居霸主宝座。不过,C语言的低危漏洞数量也相对较低,2018年仅为7%。它也是唯一一种含有严重程度高的内存损坏漏洞的语言。它所含高中低危漏洞占漏洞总量的情况如下:
图:高中低危漏洞占比情况
Linux 漏洞在 C 语言中占比最高,最为人熟知的是2016年年中被爆出的Image Tragic 漏洞。
Java 是唯一一种在去年开源漏洞数量见涨的语言。令人吃惊的是,2018年Java 的漏洞数量几乎是2017年的两倍。Java 语言的中危漏洞占比稳定在75%,不过在过去两年中其高危漏洞数量也在增加,在2018年占比达到20%。如图:
图:高中低危漏洞占比情况
有意思的是,反序列化问题虽然不是Java语言中最常见的漏洞,但却是独有漏洞,而且在2017年数量见涨。反序列化问题并不存在于 PHP、Ruby 或 Python中。研究人员也应该开始从上述语言中查找反序列化问题了吗?还是其它语言中的序列化天生更安全?
JavaScript 是当前的“流量小生”,也是过去十年来唯一一种漏洞总量持续上涨的语言。2017年的漏洞总量是2016年的16倍。尽管 JS 的漏洞数量在2018年上涨了50%,但高危漏洞所占比例和2017年持平。如下:
图:高中低危漏洞占比情况
另外一个有意思的趋势是,JS 开源漏洞是在社区平台上披露的,而非美国国家漏洞库。由于开源社区的去中心化特征,开源漏洞的信息散落在数千个安全公告、开源项目问题追踪和论坛中。漏洞信息有时候难以看到而且可信程度也持保留态度。这也验证了:做到开源组件是安全的而且符合公司政策这一点变成了非常复杂的流程。
图:社区贡献是主力
PHP 的漏洞总量排名第二,也是唯一一种 SQL 漏洞在所含漏洞中排名如此靠前(第二)的语言。虽然PHP的热度有所下降,但它在2017的漏洞数量猛增。如图:
图:高中低危漏洞占比情况
很多安全专家认为 SQL 漏洞已成过去式,但事实上对于 PHP 而言远非如此。CWE-79 XXS 漏洞是PHP中最常见的漏洞,自2009年以来就占据 PHP CWE 漏洞总量的近40%。
Python 与众不同的一点是,2015年的漏洞总量达到峰值,之后逐年下降。而其它语言则是2017年见涨,2018年下降。按年份来看,Python 在2017年以前的高危漏洞数量相对较少。
图:高中低危漏洞占比情况
C++ 和 C 遭受的 CWE 漏洞类型一致。由于这两种语言在 web 应用中的流行度不高,因此它们也较少遭受其它语言饱受的 CWE 漏洞折磨。
图:高中低危漏洞占比情况
Ruby 的漏洞总量垫底。十年来,Ruby 中所含的开源漏洞像过山车一样高低起伏不定,不过2015年以来它的流行度也一再放缓。
图:高中低危漏洞占比情况
有意思的是,Ruby 也是除了 PHP 以外,唯一一种含有很多 SQL 代码注入漏洞的语言,不过跟 PHP 无法“媲美”,自2015年以来也在下降。
C 最坏 Python 最好?
但是,C语言真的是最糟糕的语言、Python 是最佳语言么?WhiteSource 公司认为做出这样的结论太过武断:“虽然长期以来,我使用的语言要比你的安全这种说法颇有戏谑成分,但找到答案对你创建最具创新性或最安全的软件很可能并没有什么用。”
正确的做法是,应当“保持对已知开源漏洞的警觉,并了解你和团队所使用语言的优劣势。”
一句话结尾:安全无关语言,使用方式才至关重要。
更多详情,请见原文报告
https://www.whitesourcesoftware.com/most-secure-programming-languages/
推荐阅读
原文链接
https://www.zdnet.com/article/which-are-the-most-insecure-languages/
https://www.whitesourcesoftware.com/most-secure-programming-languages/
本文由代码卫士编译,不代表观点,转载请注明“转自代码卫士 www.codesafe.cn”。
代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。