代码质量与安全 | Sonar推出深层SAST,挖掘传统工具无法检测出的深层隐藏漏洞
Sonar致力于帮助您的代码达到“清洁”状态。这意味着您的代码将变得更加安全、可靠、可访问和易维护,更适合用于开发和生产环境。Sonar的清洁代码解决方案可以在您写代码的同时检测各种问题,Sonar团队也不断创新,研究新技术,以提供最全面的代码分析。为了实现这一目标,您需要深入了解您的所有代码。
查找安全漏洞是最难的挑战。因为当您的代码使用第三方依赖项代码并与之交互时,这些问题可能会变得复杂且深藏不露。本篇文章将分享Sonar在检测传统工具无法检测到的深层隐藏安全漏洞方面的重大突破。
一起来了解这些漏洞,如何检测它们,以及如何立即开始使用Sonar更深入的SAST来清洁您的代码!
隐藏漏洞带来的问题
尽管已经存在了几十年,但污染漏洞(或注入漏洞)仍然是应用程序的最大安全风险之一。流行的类型包括SQL注入、反序列化或命令注入漏洞,一旦被利用可能造成严重的后果:攻击者可以泄漏敏感数据、执行恶意代码或者控制软件服务器。即使只有其中一个问题出现在您的生产代码中,也会严重危及到业务。
那么,为什么这些关键的代码漏洞仍然会产生呢?
其中一个主要的原因就是,这些漏洞对开发人员来说可能非常难以理解和发现。通常,污染漏洞不仅仅体现在一行代码中,而是在不同代码文件和函数中的多个代码序列的相互作用下导致的。每个代码序列本身可能是无害的,但组合在一起就会导致安全问题。当涉及到不同位置的更多代码时,就会更难理解其相互作用和影响,以及最终对安全性的影响。
当使用第三方代码时,情况就变得更加复杂。几乎所有软件都会依赖多个开源框架或库,这让开发人员可以复用现有的代码,把精力集中于快速交付新功能。然而,这种便利性也伴随着风险。
每当在项目中使用依赖项,例如Spring框架或Log4j库时,您的代码就会与该依赖项的代码进行交互。仅仅是通过与您的代码进行交互与独特组合,就可能出现新的安全漏洞,就像臭名昭著的Log4shell漏洞一样。手动审查自己的代码库已经足够困难,还要审查所有来自依赖项中使用的功能的所有代码,以及它们与自身(也称为传递依赖项)的后续交互,这根本行不通。
传统的方法
静态应用程序安全测试(SAST)可以帮助您将代码审查自动化。通过使用污点分析等技术,您可以评估项目中的代码交互是否存在不同覆盖范围、准确性和速度的安全问题。然而,所有传统的SAST工具都只扫描您的项目代码。这些工具不了解依赖性代码及其与安全相关的交互,除非您手动添加了一些工具配置。这种硬编码的知识本质上是不完整的:实际上,数十万种不同的依赖项和交互存在于项目代码中。每种语言的生态系统都会导致传统SAST工具的盲点。每当您的代码与依赖项交互时,传统的SAST工具只能理解实际执行的代码的一小部分,因此会忽略深藏的漏洞。
软件组合分析 (SCA) 也无法检测到此类隐藏的漏洞。SCA工具的原理是基于公开已知的数据库,来报告依赖关系中的问题。该数据库就是SCA工具能检测到的极限范围。虽然开源依赖项中有数十亿行经常更新的代码行,但SCA数据库中公开记录的已知问题相对较少。此外,不能因为一个依赖项的特性在代码中被不谨慎地使用造成安全风险,而认为这个依赖项本身有漏洞。作为开发人员,您需要确保在您的代码中,与依赖项的交互是安全的。因为SCA数据库不会列出由您的代码引起的独特漏洞,这些问题将被SCA工具忽略。
来自Sonar的深度SAST
为了填补这一市场空缺,Sonar推出深度SAST,成功地将精确的污点分析功能从项目代码深入扩展到传递依赖项代码。这让开发人员能够识别因其代码与依赖项之间的交互而产生的深层隐藏的污点漏洞。
一起来看下两个示例。为了简单起见,示例使用了仅拥有少量代码序列和交互的漏洞。但请记住,在实际情况下这些漏洞会复杂得多。
下面这一代码片段显示了一个反序列化漏洞。该代码从Session-Auth HTTP 标头获取数据 [1],然后尝试根据该数据调用Java对象 [6-8]。由于攻击者可以操纵任何 HTTP 标头,引起Java 对象格式错误,从而使攻击者能够远程执行代码。
对于更深层次的SAST,关键步骤发生在[3] 中。使用库中的decodeBase64()函数来处理数据。如果SAST工具不知道[3]中这个库函数的作用,它就无法将[1]和[8]之间建立联系,从而忽略这个关键的漏洞。
一起看看下面显示的另一个示例。这次,代码段为特定的用户执行数据库迁移。它检索用户提供的用户名[1],该用户名用作数据库保存点 [7] 名称的一部分。保存点是通过库函数创建的,该函数具有无害名单setSavepoint()[8]。开发人员,甚至传统的SAST工具都不知道这个特定的函数容易受到SQL注入的攻击。攻击者可以将具有SQL语法的恶意用户名注入保存点,修改数据库查询。
如今,深度SAST可用于Java,C#和JavaScript/TypeScript,并且已经支持数千个顶级和最常用的开源库,包括它们的传递依赖项。深度SAST增强了识别不同类型的污点漏洞的能力。在分析具有依赖关系的源代码时,Sonar的SAST引擎在领先的精度和性能方面保持不变,用户无需执行其他步骤,即可从深度分析中获益。
到目前为止,Sonar观察到,在每个代码项目中平均有10个常规漏洞的情况下,深度SAST 能检测出一个额外的、隐藏颇深的漏洞。Sonar将扩展深度SAST,涵盖更多的依赖项和编程语言,并不断改进污点分析来检测更多隐藏的漏洞。
深度SAST背后的故事
Sonar深度SAST是如何更高水平工作的?这个创新方法包含了两个部分。
首先是Sonar内部,收集了最常用的开源依赖项的源代码。然后,复杂代码分析器会从这些与污点分析相关的依赖项里提取所有代码信息。其中一个关键挑战是将这一过程自动扩展到成千上万个依赖项、它们的传递依赖项和不同版本。
相关信息包括了例如有关用户输入源、数据流或安全敏感操作的知识。请注意,这不是在依赖项代码中寻找漏洞,而是寻找可能使代码变得易受攻击的交互。提取出的有价值的信息随后储存在可以进一步优化的知识库中。该知识库会持续更新,以保持与生态系统中重要更改同步。
然后,此知识库会集成到产品提供的污点分析中。当您的代码被扫描时,污点分析现在具有独特的能力,能够通过从全面的知识库中推断出缺失的知识,来理解代码和依赖项代码之间的代码交互。这样就可以在代码上下文中理解和评估依赖项的交互,了解安全隐患,从而发现隐藏的安全问题。
来,试试看!
最重要的是:深度SAST对用户来说不会产生额外的费用。您可以通过使用SonarCloud来试用,这是Sonar基于云的产品,对于开源项目是免费的。如果您已经使用SonarQube(自托管)了,那么深度SAST在开发者版9.9 LTS或更高版本中可用。Sonar的“清洁代码”解决方案让您能通过使用质量门限,持续检查和分析代码库中的 5,000多条规则,以确定代码是否符合定义的生产标准。
Sonar已经创建了一个演示存储库,您可以使用它来查看深度SAST的运行情况。在这个Java Spring应用程序中,当您分叉和扫描此项目时,可以找到各种隐藏的漏洞。请联系SonarQube授权合作伙伴——创实,我们将为您提供所有的入门说明。
立即使用深度SAST,请联系SonarQube中国官方授权合作伙伴——创实 ,我们提供SonarQube产品的咨询、销售、实施、培训及技术支持服务。