多年来,我听到过各种关于每千行代码可利用错误的平均数量的估计,一个常见的数字是每千行代码有一个可利用错误。谷歌搜索一方面给出了一些低得多的数字,如0.020和0.048 ,但也提供了非常高的数字,如5 到 50。所有这些数字都适用于未经审查或安全测试的代码。
有没有关于这个主题进行过严肃的实证研究?通过检查多年来报告的安全漏洞数量,可以基于经过良好审查的开源软件进行此类研究。如果不是,这些数字是从哪里来的?
多年来,我听到过各种关于每千行代码可利用错误的平均数量的估计,一个常见的数字是每千行代码有一个可利用错误。谷歌搜索一方面给出了一些低得多的数字,如0.020和0.048 ,但也提供了非常高的数字,如5 到 50。所有这些数字都适用于未经审查或安全测试的代码。
有没有关于这个主题进行过严肃的实证研究?通过检查多年来报告的安全漏洞数量,可以基于经过良好审查的开源软件进行此类研究。如果不是,这些数字是从哪里来的?
你得到的任何数字都将毫无意义——需要考虑一些因素:
编程语言——一些语言让你做非常不安全的事情;例如,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 仅记录通过相关渠道发现和报告的安全缺陷,您需要代码经过系统审查的指标,以便至少检测到低悬的安全缺陷,否则您正在测量的只是测试的一部分努力。