没有什么能消除所有的错误,在编写的代码中也是如此。平均而言,所有代码都有错误。其中一些错误是良性的,有些会导致意外提前终止,少数会导致资源消耗失控。一些错误会导致安全漏洞,让用户做一些意想不到的事情,有时甚至是不希望发生的事情。
一些安全漏洞是行为漏洞,因为它们取决于代码在执行时的行为。另一种类型是智能漏洞,代码行为可能是正确的,但会泄露有关如何利用系统的详细信息。这是两种主要的代码漏洞类型,两者都有风险。
运行时的行为漏洞
代码运行时的行为漏洞涵盖了广泛的问题,但所有这些问题都是代码行为导致的结果,在特定的情况下导致了不期望发生的结果,其中大多数都是无意的。
发送到数据库的未转义用户输入可能会导致SQL注入漏洞,或者发送到浏览器的未经处理的字符串可能会创建跨站点脚本(XSS)漏洞。有些行为是有意为之,但却会带来意想不到的后果;允许其输出环境变量或从外部资源读取数据的Log4j字符串替换行为是故意的,但我们现在称为 Log4Shell 的恶意使用并非如此。在最近的另一个示例中,可以利用多种行为组合在 Linux 台式计算机上获得 root 权限。
内容中的情报漏洞
在20世纪50年代,电话公司(当时几乎只有一家)开始实施完全自动拨号,无需人工接线员在交换站接听电话。从中收集到的信息导致创建了“蓝盒子”,利用内部信息让外人控制电话设备并免费拨打长途电话。
今天,我们的代码中存在情报漏洞。代码中包含大量的秘密,以及这些秘密连接到哪些系统的细节。这些秘密曾经很难管理,将它们放入代码中是唯一可行的选择。现在我们有像Hashicorp Vault这样的工具,例如,几乎每个云中都有安全密钥库,但是遗留代码中所有这些秘密的遗留和安全债务对于Lapsus$这样的攻击者和其他专门针对代码的人来说是一个金矿。
安全是一个过程,而不是一个产品
我们每个人都能说出许多类型的行为漏洞,比不同类型的情报漏洞多得多。但这两类漏洞所代表的风险相对相同。最近发生的事件表明,攻击者利用从代码中获取的内部信息,如从代码中获取的密码和密钥,够在防火墙和其他访问控制的情况下快速行动
将检测集成到开发人员的工作流程中,这样他们就可以在处理和审查代码时在上下文中采取行动,这是消除新的安全问题的有效方法。为开发人员提供所需的信息以了解其代码中智能风险的总体情况、风险最高的区域,以及指向他们可以立即修复的可操作问题以改善代码健康状况,这些工具对于帮助团队降低历史风险是有必要的,理想情况下是通过轮换发现的任何秘密。
现有的代码安全检测工具可以自动完成这个过程,并帮助团队消除代码中超过一半的风险。