欢迎访问Sonar Source中文网站!
语言选择: ∷ 

通过更深入的 SAST 发现隐藏的安全漏洞

发布时间:2023-10-10浏览次数:64

在 Sonar,我们致力于帮助您实现干净代码的状态。这意味着您的代码变得安全、可靠、可访问且可维护,从而适合开发和生产。我们的清洁代码解决方案可检测您编码时的各种问题,我们的团队不断研究新的创新,以提供最全面的代码分析。为此,深入理解所有代码是关键。


发现安全漏洞尤其具有挑战性,因为当您的代码使用第三方依赖项代码并与之交互时,这些问题可能会变得复杂且隐藏得很深。在这篇博文中,我们很高兴分享更多关于我们在检测传统工具无法检测到的深层安全漏洞方面的重大突破。 


让我们看看这些漏洞,我们如何检测它们,以及您今天如何开始使用我们更深入的 SAST 来清理您的代码!

隐藏漏洞问题

尽管污染漏洞(或注入缺陷)已为人所知数十年,但它仍然是应用程序的首要安全风险。流行的类型包括SQL 注入反序列化命令注入漏洞,这些漏洞的利用可能会产生严重后果:攻击者可以泄漏敏感数据、执行恶意代码或接管软件服务器的控制。即使这些问题中的一个最终出现在您的生产代码中,也可能使您的业务面临严重风险。


但为什么这些关键代码漏洞仍然会出现呢? 


主要原因之一是这些漏洞对于开发人员来说可能非常模糊且难以发现。通常,污点漏洞不仅仅出现在一个代码行中,而是由位于不同代码文件和函数中的多个代码序列的交互引起的。每个代码序列本身可能是无害的,但组合会导致安全问题。涉及的来自不同位置的代码越多,就越难理解其交互、影响以及最终的安全影响。

博客的支持图 2 通过更深入的 SAST 发现隐藏的安全漏洞

当使用第三方代码时,事情会变得更加复杂。几乎所有软件都使用(依赖于)多个开源框架或库。这使开发人员能够重用现有代码并专注于快速交付新功能。然而,这种舒适也伴随着风险。 


每当您在项目中利用依赖项(例如 Spring 框架或 Log4j 库)时,您的代码都会与该依赖项的代码进行交互。仅仅通过与代码的交互和独特组合,就可能会出现新的安全漏洞,正如我们在臭名昭著的 Log4shell 漏洞中所看到的那样。手动检查自己的代码库已经足够具有挑战性了。此外,检查依赖项中使用的功能的所有代码以及它们与自己的依赖项(也称为传递依赖项)的后续交互是不可能的。

传统方法

静态应用程序安全测试 (SAST) 可以帮助您自动执行代码审查。通过污点分析等技术,可以评估项目中的代码交互是否存在不同覆盖范围、准确性和速度的安全问题。然而,所有传统的 SAST 工具仅扫描您的项目代码这些工具不知道依赖代码以及它们与安全相关的交互,除了一些手动添加的工具配置。这种硬编码的知识本质上是不完整的:实际上,每种语言的生态系统中都存在数十万种不同的依赖关系和交互,这导致了传统 SAST 工具的盲点。每当您的代码与依赖项交互时,传统的 SAST 工具只能理解实际执行的代码的一小部分,因此会错过深层隐藏的漏洞。

博客的支持图 2 通过更深入的 SAST 发现隐藏的安全漏洞

软件成分分析 (SCA) 也无法检测到此类隐藏漏洞。SCA 工具根据公开已知漏洞的数据库报告依赖项中的问题。该数据库是 SCA 可以检测到的内容的限制。考虑到开源依赖项中有数十亿条经常更新的代码行,SCA 数据库中发现的公开记录的问题数量非常少。此外,仅仅因为代码中不谨慎的交互可能会不安全地使用依赖项功能,但这并不意味着依赖项本身容易受到攻击作为开发人员,您可以在代码中安全地与依赖项进行交互 SCA 数据库不会列出您的代码中引起的独特漏洞,因此 SCA 会遗漏该漏洞。  

声纳更深的 SAST

为了解决市场中的这一关键空白,我们很自豪地推出更深入的 SAST我们成功地将精确的污点分析能力从项目代码深入扩展到传递依赖代码。这使开发人员能够识别由于代码与其依赖项之间的交互而产生的深层隐藏的污点漏洞。 


让我们看一下更深入的 SAST 问题的两个具体示例。为了使本博文简单起见,我们使用仅具有少量代码序列和交互的漏洞,但请记住,这些漏洞在现实世界的代码库中要复杂得多。


下面的代码片段显示了反序列化漏洞。该代码从 Session-Auth HTTP 标头获取数据 [1],然后尝试根据该数据调用 Java 对象 [6-8]。由于攻击者可以操纵任何 HTTP 标头,因此 Java 对象可能会出现格式错误,从而使攻击者能够远程执行代码。 

SonarCloud 中打开更深层次的 SAST 问题


对于更深入的 SAST,关键步骤发生在[3]中。库中的函数decodeBase64()用于处理数据。如果 SAST 工具不知道这个库函数在 [3] 中做什么,它就无法在 [1] 和 [8] 之间建立连接,并且会错过这个严重漏洞。


让我们看一下下面所示的另一个示例代码。这次,代码片段为特定用户执行数据库迁移。它检索用户提供的用户名 [1],该用户名用作数据库保存点 [7] 名称的一部分。保存点是通过使用具有无害名称setSavepoint() [8]的库函数创建的开发人员和传统 SAST 工具都不知道这个特定函数容易受到 SQL 注入的影响。攻击者可以将带有 SQL 语法的恶意用户名注入到保存点中,以修改数据库查询。

SonarCloud 中打开更深层次的 SAST 问题


如今,更深入的 SAST 可用于 Java、C# 和 JavaScript/TypeScript,并且已经支持数千个最顶级和常用的开源库,包括它们的传递依赖项。我们支持的所有不同类型的污点漏洞都通过更深入的 SAST 得到增强。在分析具有依赖关系的源代码时,我们的 SAST 引擎领先的精度和性能保持不变,用户无需执行任何额外步骤即可从我们更深入的分析中受益。 


到目前为止,我们观察到,在代码项目中平均每发现 10 个常规漏洞,我们更深入的 SAST 就会检测到一个额外的、深层隐藏的漏洞。我们将扩展更深入的 SAST,通过覆盖更多依赖项和语言并不断改进我们的污点分析来检测更多隐藏的漏洞。

更深入的 SAST 幕后故事

让我们看看声纳更深层次的 SAST 如何在高水平上工作。我们的创新方法包括两部分。 


首先,在 Sonar 内部,我们收集了最流行的开源依赖项的源代码。然后,我们使用复杂的代码分析器从这些与污点分析相关的依赖项中提取所有代码信息。关键挑战之一是将其自动扩展到数千个依赖项、它们的传递依赖项和不同版本。 


相关信息包括例如有关用户输入源、数据流或安全敏感操作的知识。请注意,我们并不是寻找依赖代码中的漏洞,而是寻找可能使您的代码容易受到攻击的交互。然后,提取的有价值的信息被存储在可以进一步优化的知识库中。该知识库不断更新,以领先于生态系统的重要变化。

博客的支持图片通过更深入的 SAST 发现隐藏的安全漏洞

然后,知识库被集成到我们产品中附带的污点分析中。当您的代码被扫描时,我们的污点分析现在具有独特的能力,可以通过从我们全面的知识库中推断缺失的知识来理解您的代码和依赖项代码之间的代码交互。这样,就可以在代码上下文中理解和评估依赖交互的安全影响,从而发现隐藏得很深的安全问题。

试试看

最好的事情是:更深入的 SAST 对于我们的用户来说不需要额外的费用。您可以使用SonarCloud进行尝试,这是我们基于云的免费开源产品。当您使用SonarQube(自我管理)时,Developer Edition 版本 9.9 LTS 或更高版本中提供了更深入的 SAST。我们的清洁代码解决方案使您能够使用质量门持续检查和分析代码库中的 5,000 多个规则,以确定代码是否符合定义的生产标准。


我们创建了一个演示存储库,您可以使用它来查看更深入的 SAST 操作。在这个Java Spring应用程序中,当fork和扫描这个项目时,可以发现各种隐藏的漏洞。您可以在下面的链接中找到所有入门说明。



微信扫码微信扫码 关注我们

  • 24小时咨询热线180-210-69380

  • 移动电话180-210-69380

Copyright © 2022 All Rights Reserved. 地址:上海市浦东新区崮山路538号808 苏ICP123456 XML地图