静态代码扫描 | 安全代码必备的两个条件

著名的Heartbleed,也被称为心血漏洞,攻击了全球三分之二的网站。它出现在加密程序库OpenSSL中,只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而受到攻击。

这个漏洞是如何产生,又是如何被发现的?安全代码实践究竟需要哪些行动和策略的配合?最重要的是,安全代码实践应该包括哪些部分?阅读本文,您能找到答案。

作为SonarQube授权合作伙伴,创实信息持续关注代码质量与安全领域,为中国用户带来全球范围内的优秀解决方案,帮助企业实现开发安全运营一体化。

作家罗伯特·科利尔曾说,“成功是日复一日重复的小努力的总和”。在涉及到安全问题的时候,这句话尤其准确。现在大家都明白,保护自己的系统并不像安装一个防火墙那么简单。相反,它需要多种行动和策略的配合,并随着时间的推移不断实施。不管你信不信,一个虽然小但很重要的策略,就是编写可靠(无错误)和可维护(易于理解)的代码。
这听起来可能太简单了,甚至有点自以为是。因此,本篇文章中将列出一些证据,证明编写可靠和可维护的代码本质上是在编写更安全的代码。

可维护性差导致Heartbleed(心血漏洞)

为了证明可维护的代码能保障安全,首先从心血漏洞说起。还记得这个漏洞吗?它是OpenSSL中的一个严重漏洞,让攻击者能通过一个微不足道的攻击窃取敏感信息。大卫·惠勒(David A. Wheeler)在乔治梅森大学教授安全开发研究生课程,他写了一篇关于这个漏洞的综合分析。在分析中,他将部分原因归咎于相关代码实在是难以理解:“用于应对类似心血漏洞缺陷的许多静态技术,包括人工审查,面对过于复杂的OpenSSL代码都无法发挥作用。安全敏感的代码需要‘尽可能简单’。”

当心血漏洞最终被发现时,实际上是通过人工审查而不是静态分析发现的。值得注意的是,该问题并未在同行评审中被发现,而是在合并后很久才由独立的安全研究人员发现。在分析中,惠勒也探讨了为什么没有早点发现心血漏洞。“像代码格式这样的小事情很重要,”他说,“因为格式错误的代码对人工来说更难审查。”

人们通常会认为代码异味(Code Smell)/可维护性规则微不足道,比如代码格式和命名规定等。可能是因为它们涉及的事物都很基础,所以人们轻易就会忽视它们。但正如惠勒所说,这并不意味着它们不重要。 

惠勒建议,对可维护性的关注会使软件更加安全,并继续说:“目标应该是明显正确的代码,而不是复杂到看不出任何问题的代码。” 当然,这就是代码异味规则可以帮助您做的事情——编写可维护、易于阅读的代码,这样它就有可能“明显是正确的”。 

专家观点:漏洞和代码异味是安全“弱点”

如果您认为这只是惠勒的个人意见,那么,我们看看另一个情况:CWE,它证明了可维护性和可靠性对安全性的贡献极大。 

让我们从2020年CWE前25个最危险的软件弱点开始。首先,这是一些背景知识:CWE是Common Weakness Enumeration的缩写,这是一份由企业界、学术界等各界人士(专家)共同提供的列表,列出了具有 “安全影响 “的常见软件和硬件弱点。它有大约1,300个条目,其中包括很多用于分类的条目。前25名是“在过去两个日历年中,遇到的最常见和最有影响力的问题”的列表。

鉴于这种积累,可以合理地假设列表中所有的CWE 25都描述的是安全漏洞。但据我统计,其中有近三分之一是bug,虽然可能会导致安全违规行为,但它依旧是bug,而不是安全漏洞。例如,列表第13名CWE-76,NULL指针解读(NULL Pointer Dereference)就是一个例子。

事实上,据统计,大约60%的CWE根本不是漏洞。CWE-699是软件开发视图。它“围绕软件开发中经常使用或遇到的概念组织弱点”。它包含40个子类别,包括复杂性问题、数字错误和错误编码实践(Bad Coding Practices)。在错误编码实践下的59个叶列表中,第一个是具有象征意义的CWE-478,即在Switch语句中缺少默认情况。 

大多数人认为这个规则对代码安全来说不是很重要。SonarSource甚至不将其归类为Bug,而是归类为代码异味/可维护性问题。但它被列入CWE,说明该领域的专家认为它对安全很重要。因为像提供 `default` 条款这样,小而一致的努力有助于您编写出“明显正确的代码”。 

可维护性 + 可靠性 ≥ 安全代码

通过心血漏洞的例子,您应该明白了可维护性对于安全代码的重要。如果您不能理解代码,那就无法确定它没有隐藏漏洞。再加上CWE,你会发现该领域的专家们一致认为可维护性和可靠性都对代码安全的有重要贡献。

说白了,静态分析没有发现心血漏洞。而且总会有静态分析找不到的bug和漏洞。例如,没有办法从静态上知道购物车的数量不能是一个负数,这就是同行评审的工作。在心血漏洞的案例中,同行评审失败的原因是代码难以理解/不可维护。 

虽然,静态分析没有发现心血漏洞,但通过使用它,同行评审者能够更容易自己发现漏洞。SonarQube和SonarCloud等静态分析工具可以轻松发现可维护性和可靠性问题,以及许多有价值的安全问题,例如注入漏洞、XSS、XXE、反序列化缺陷等。当所有这三类问题都随着时间的推移被持续实施时,它们将帮助您更好地掌控代码的可靠性和安全性。

在此,修改一下罗伯特·科利尔的那句话,安全性的成功是日复一日、重复的小型可维护性工作的总和。因为可维护性很重要,特别是对于代码安全来说。

想要体验SonarQube或试用SonarCloud,请联系SonarQube中国官方授权合作伙伴——创实 ,我们提供SonarQube产品的咨询、销售、 实施、培训及技术支持服务。

作者简介:

G. ANN CAMPBELL
Sonar社区管理员

文章来源:https://blog.sonarsource.com/for-secure-code-maintainability-matters/