每千行代码平均可利用的错误数?

信息安全 源代码 软件 统计数据
2021-09-02 04:25:20

多年来,我听到过各种关于每千行代码可利用错误的平均数量的估计,一个常见的数字是每千行代码有一个可利用错误。谷歌搜索一方面给出了一些低得多的数字,如0.0200.048 ,但也提供了非常高的数字,如5 到 50所有这些数字都适用于未经审查或安全测试的代码。

有没有关于这个主题进行过严肃的实证研究?通过检查多年来报告的安全漏洞数量,可以基于经过良好审查的开源软件进行此类研究。如果不是,这些数字是从哪里来的?

2个回答

你得到的任何数字都将毫无意义——需要考虑一些因素:

  • 编程语言——一些语言让你做非常不安全的事情;例如,C 使您可以直接分配内存、进行指针运算、具有以空字符结尾的字符串,因此引入了许多潜在的安全漏洞,而像 ruby​​/python 等更安全(但速度稍慢)的语言则不允许这样做。申请的目的?什么类型的编码器/代码审查?

  • 应用程序类型——如果一个无恶意的程序员用 Java 编写了一个相对复杂的愤怒的小鸟类型的游戏(不使用unsafe模块),那么很有可能没有任何“可利用的”错误——尤其是在测试之后;除了能够使程序崩溃的可能例外。由业余爱好者编写的 PHP 网络应用程序很可能存在各种可利用的缺陷(SQL 注入、跨站点脚本、不良会话管理、弱散列、远程文件包含等)。

  • 编写安全代码的程序员专业知识。如果您雇用一个没有过去经验的高中生来编写一些 Web 应用程序,那么他们很有可能会成为重大缺陷。

此外,计算“可利用”错误的数量也不是一项简单的任务。如果发现错误很简单,它们将在代码审查中被删除。有时许多错误只是由于微妙的竞争条件或程序/库之间的复杂交互而出现。

但是,如果您采用开源项目,很容易在 ohloh.net 上找到 LoC 的数量,在 cvedetails.com 上找到“可利用”漏洞的数量(我将“可利用”定义为 CVSS 超过 7 个)。我随机决定查看一些 Web 浏览器、编程语言和 Web 框架,发现:

网络浏览器:

开源编程语言:

网络框架:

因此,对于这些特定的主要编程项目(可能由专家程序员编写)再次发现主要可利用漏洞的比率为每 1000 LoC 0.003 到 0.08 个。(或每 12 500 - 300 000 LoC 1 个)。我必然会推断非主要的开源项目。

作为一个为了乐趣和利润而对 Web 应用程序进行安全测试的人,在常见的开源 Web 应用程序中,每千行的安全缺陷比引用的 0.08 数字要高得多。大概问题是 CVE 仅记录通过相关渠道发现和报告的安全缺陷,您需要代码经过系统审查的指标,以便至少检测到低悬的安全缺陷,否则您正在测量的只是测试的一部分努力。