Scala 代码中的安全漏洞

信息安全 软件 静态分析
2021-08-30 18:28:44

我目前正在阅读 Gary McGraw 的“Software Security: Build Security In”,他区分了安全漏洞和安全漏洞。安全漏洞是代码中的实现错误,而漏洞更多是在软件的架构/设计方面。他写道,安全缺陷往往在错误和缺陷之间的比例约为 50/50。

然而,这是在 2006 年写的,他提到了 C 和 C++ 等语言。例如,有很多关于缓冲区溢出的讨论。我的问题是:这与 Scala 的相关性如何?显然,实现中的错误仍然会导致安全风险,但是在 JVM 上使用托管语言进行边界检查似乎可以减轻 McGraw 所说的一大类错误。使用像 Scala 这样的语言,软件安全已经更多地转向事物的架构和逻辑方面,这是一个合理的说法吗?或者,更具体地说,Scala 中的静态代码分析对安全性的重要性是否不如 C 和 C++ 等语言重要?如果不是,为什么不呢?

2个回答

就内存相关问题而言,仍然存在一些问题,例如,您仍然可能偶然发现空指针、使用越界集合索引、意外与其他类共享可变数据、使应用程序使用其所有分配的内存,或者在某些情况下在几乎所有内存都被使用并创建大量新临时对象的情况下,GC 可以占用几乎所有的执行时间 - 但其中大部分是 JVM 上的异常/错误,并且可以处理,尽管它们应该如果可能,通过配置和仔细编码来避免。

此外,在 scala 中,null 不赞成 Option,而 mutable state 赞成不可变,因此使用惯用的函数样式,null 和可变性问题进一步减少。

有一些scala 静态分析工具(免责声明:我是 Linter 的维护者),但它们并不是专门用于安全性的。也就是说,他们经常会发现会导致应用程序在运行时崩溃、使其运行速度比所需速度慢或发现逻辑上没有意义的代码的问题——所有这些都是潜在的安全问题来源。我想提一下 Wartremover,它具有将语言限制为更安全/更纯的子集的检查功能。

您还可以使用在 JVM 字节码上运行的工具,例如 Findbugs 的 find-sec-bugs 插件。默认的 Findbugs 检查也有效,但由生成的 scala 代码触发,因此有很多误报。语言作者确实会查看这些结果,并在发现任何内容时进行修复,但不幸的是,误报使 Findbugs 对我们其他人的用处不大。

(我很想知道是否有人在评论中使用过任何其他带有 Scala 的工具)

虽然可以公平地说,与 c/c++ 等语言相比,托管语言不太容易出现某些类别的问题,但仍有几类软件错误可以应用于 Java/Scala 和在托管环境中运行的其他语言。

这可能从 SQL 注入和跨站点脚本等输入验证问题到错误处理问题和密码学滥用问题而有所不同。一种信息来源是这种安全问题分类法,它显示了影响 Java 的广泛范围。显然 Scala 不会遇到所有相同的问题,但它让您了解托管语言仍然可以从静态分析中受益。