tag 标签: 静态代码分析

相关博文
  • 热度 5
    2024-3-14 09:41
    707 次阅读|
    0 个评论
    静态分析可帮助面临压力的开发团队。高质量的版本需要按时交付。需要满足编码和合规性标准。错误不是一种选择。 这就是开发团队使用静态分析工具/源代码分析工具的原因。在这里,我们将讨论静态分析和使用静态代码分析器的好处,以及静态分析的局限性。 什么是静态分析? 静态分析是一种调试方法,通过自动检查源代码来完成,而无需执行程序。这使开发人员能够了解他们的代码库,并有助于确保其合规性和安全可靠性。 什么是静态代码分析? 静态代码分析是指静态分析工具执行的操作,即根据一组(或多组)编码规则分析一组代码。 静态代码分析和静态分析通常与源代码分析一起互换使用。 静态代码分析解决了源代码中可能导致漏洞的弱点。当然,这也可以通过手动源代码审查来实现。但是使用自动化工具要有效得多。 静态分析通常用于遵守编码准则,例如 MISRA。 它通常用于遵守行业标准,例如 ISO 26262 。 什么时候使用静态代码分析器/源代码分析工具执行静态分析? 静态代码分析是在软件测试开始之前的开发早期进行的。对于实践DevOps的组织来说,静态代码分析发生在“创建”阶段。 静态代码分析还通过创建自动反馈循环来支持 DevOps。开发人员会很早就知道他们的代码中是否存在任何问题,解决这些问题会更容易。 静态分析与动态分析 那么, 静态分析和动态分析有什么区别 呢? 这两种类型的代码分析都可以检测缺陷。最大的区别在于 他们在开发生命周期中发现缺陷的地方。 静态分析在运行程序之前(例如,在编码和单元测试之间)识别缺陷。 动态代码分析在运行程序后(例如,在单元测试期间)识别缺陷。然而,一些编码错误可能不会在单元测试期间出现。因此,动态测试可能会遗漏一些静态代码分析所能发现的缺陷。 静态代码分析器/静态分析工具的局限性是什么? 静态代码分析用于开发特定阶段的特定目的。但是静态代码分析工具存在一些局限性。 不了解开发人员的意图 静态分析工具可以在该计算中检测到可能的溢出。但它不能确定功能根本不起预期的作用! 不可静态执行的规则 一些编码规则依赖于外部文档。或者它们可以接受主观解释。 例如: CERT-C MSC04:以可读的方式始终如一地使用注释。 可能的缺陷会导致假阳性和假阴性 在某些情况下,工具只能报告可能存在缺陷。 如果我们对 foo() 一无所知,我们就不知道x的值是多少。 结果是不可判定的。这意味着工具可能会报告实际上不存在的缺陷(假阳性)。或者他们可能无法报告真正的缺陷(假阴性)。 静态代码分析器有哪些优势? 静态分析工具有几个好处,尤其是当您需要遵守行业标准时。 最好的静态代码分析工具提供了速度、深度和准确性。 速度 开发人员进行手动代码审查需要时间。自动化工具要快得多。 静态代码检查解决了早期的问题,并准确地指出了代码中的错误所在。因此,您将能够更快地修复这些错误。此外,早期发现的编码错误修复成本更低。 深度 测试不能覆盖所有可能的代码执行路径。但是静态 代码分析器 可以。 在构建过程中,静态代码分析器会检查代码。您将根据所应用的规则深入分析代码中可能存在的潜在问题。 下面是 Helix QAC中深入代码分析的示例 。 Helix QAC 中的代码分析示例 准确性 手动源代码审查容易出现人为错误。自动化工具不是。 他们扫描每一行代码以识别潜在问题。这有助于您确保在测试开始之前就有最高质量的代码。毕竟,当您遵守编码标准时,质量是至关重要的。 静态分析和静态代码分析器如何帮助开发人员左移? 静态分析是确保软件应用程序可靠性、安全性和可维护性的重要技术。它帮助开发人员及早发现和解决问题,提高代码质量,增强安全性,确保法规遵从性,并提高效率。使用静态分析工具,开发人员可以构建质量更好的软件,降低安全漏洞的风险,并最大限度地减少调试和修复问题所花费的时间和精力。 术语“左移”是指在软件开发生命周期(SDLC)的早期集成自动化软件测试和分析工具的做法。传统上,测试和分析通常是在编写代码后进行的,这导致了解决问题的被动方法。通过左移,开发人员可以在问题变成问题之前发现问题,从而减少调试和维护所需的时间和精力。这在敏捷开发中尤其重要,因为频繁的代码更改和更新可能会导致许多需要解决的问题。 静态分析的一个关键好处是,它可以节省调试和测试的时间和精力。通过在开发过程的早期识别潜在问题,您可以在任何问题变得更加难以修复(且成本高昂)之前解决它们。随着时间的推移,您还将获得更高质量的应用程序,这些应用程序更可靠、更容易维护,并防止问题在整个代码库中传播,从而使以后更难识别和修复。 使用静态分析左移的好处包括: 及早发现问题。 通过将静态分析集成到开发过程中,开发人员可以尽早发现问题,使其在成为更大的问题之前得到解决。这减少了调试和维护所需的时间和精力,并有助于确保代码的可靠性和安全性。 降低成本。 在SDLC中较早地解决问题可以降低后期修复bug和其他问题的成本。这可以节省时间和资源,并降低可能影响项目时间表的延误或其他问题的风险。 提高代码质量。 静态分析有助于识别编码标准违规和其他可能影响代码质量的问题。通过尽早解决这些问题,开发人员可以确保代码编写良好、可维护且易于调试。 增强的安全性。 静态分析工具可以识别代码中的安全漏洞,允许开发人员在代码发布到生产环境之前解决这些问题。这可以降低安全漏洞和其他可能影响应用程序安全性的问题的风险。 使用静态分析左移如何帮助提高利润 通过静态分析左移还可以提高组织的估计投资回报率 (ROI) 和成本节约。 静态分析的主要优点之一是它能够在SDLC早期发现缺陷和漏洞。从长远来看,早期检测可以节省您的公司时间和金钱。根据 美国国家标准与技术研究院(NIST) 的一项研究,修复缺陷的成本随着开发周期的进展而显着增加。在需求阶段检测到的缺陷修复成本可能约为 60 美元,而在生产中检测到的缺陷可能高达 10000 美元!通过采用静态分析,组织可以减少进入生产阶段的缺陷数量,并显著降低修复缺陷的总体成本。 除了降低修复缺陷的成本外,静态分析还可以提高代码质量,从而进一步节省成本。改进的代码质量可以减少测试、调试和维护所需的时间和精力。 IBM 的一项研究发现 ,通过提高代码质量,修复缺陷的成本最多可降低 75%。 安全性是静态分析可以帮助降低成本的另一个领域,尤其是与安全漏洞和负面品牌状态相关的成本。 IBM的一项研究发现,数据泄露的成本可能在125万至819万美元之间。静态分析可以在SDLC的早期发现安全漏洞,使组织能够在部署软件之前修复这些漏洞。通过这样做,组织可以显著降低安全漏洞的风险和成本,并保护其声誉。 除了节省成本外,静态分析还可以提高生产力。通过在开发周期的早期发现缺陷,开发人员可以减少日后调试和修复缺陷所需的时间和精力。这可以为其他开发活动(如功能开发或测试)腾出时间。通过提高生产力,组织可以减少软件开发的时间和成本,并提高更快地交付软件的能力。 在软件开发中采用左移方法可以为组织带来显着的成本节约和投资回报率。通过及早发现缺陷和漏洞,公司可以显著降低修复缺陷的成本,提高代码质量和安全性,并提高生产力。这些好处可以提高客户满意度、提高软件质量并降低开发成本。 如何选择静态代码分析器? 在决定哪种工具适合您时,需要考虑以下几点。 程序设计语言 分析器是为许多不同的编程语言设计的。因此,选择一个支持你的语言的工具是很重要的。 标准 静态分析器的主要用途之一是符合标准。因此,如果你所在的行业需要编码标准,你需要确保你的工具支持该标准。 为什么选择 Perforce 静态代码分析器工具进行静态分析? 30多年来,Perforce静态分析解决方案一直备受信赖,能够为各行各业的关键任务项目团队提供最准确的结果。 Helix QAC 和 Klocwork 经过认证,符合编码标准和合规要求。而且它们提供的假阳性和假阴性更少。 亲身体验 Perforce 静态代码分析工具对软件质量的影响。立即注册免费试用。
  • 热度 7
    2023-9-4 10:04
    708 次阅读|
    0 个评论
    随着 2023.2 的发布, Klocwork 为 C 、 C++ 、 C# 、 Java 和 JavaScript 分析提供了更新和改进。 MISRA C:2012 AMD 2 覆盖率和 DISA STIG ASD C/C++ 高严重性规则覆盖率高达 83% 。还引入了针对 C 语言检查器的附加路径分析。 Validate 平台现在具有增强的问题浏览和筛选功能。 其他增强功能包括改进 Microsoft Visual Studio 插件和 Project Streams in Validate 的稳定性和性能。 审查 Validate 中的问题 现在,您可以通过查看、修改和导航问题搜索列表,更轻松地在 Validate 中查看问题,而无需离开 “Issue Details” 页面。 • 通过新的 “File Navigation” 窗格搜索单个文件并探索问题,该窗格启用在使用相同浏览器时在会话之间持久存在的配置。 其他 Validate 平台改进 • 使用 " 度量元 " 报告 设计器 在 Validate 中编辑阈值 和总度量值 报告定义。 • 利用新的命令行应用程序包,为 Validate 命令提供通用命名。 C/C++ 分析引擎 改进了 C/C++ 的语言功能覆盖率和缺陷检测: • 增强了对 C++14 和 C++17 分析的支持。 • 添加了几个 MISRA 规则并增加了 MISRA C : 2012 (最高 AMD 2 )的覆盖范围。 • 增加了对 DISA STIG 高严重性规则、 CERT 、 OWASP 和 CWE 的覆盖范围,包括为 2022 年 CWE Top 25 最危险的软件弱点添加分类法。 C# 分析引擎 改进了对 C# 8.0 语言规范的支持。新的语言功能支持包括: • 接口中的静态构造函数。 • 接口中的嵌套类型和运算符声明。 • 内插 verbatim 字符串。 • 范围和索引支持 … 和 ^ 运算符。 • 使用新引擎对 C# 检查程序进行额外的路径分析。 Java 分析引擎 扩展了 Java 14 语言规范的覆盖范围。新功能包括: • 改进路径分析检查程序对 Java 14 的支持。 • 100% 覆盖 Jakarta EE 。 JavaScript 分析引擎 • JavaScript 分析支持 . eslintignore 文件 • 用于指定项目目录的 kwjsspec 工具的新选项 ○ --project- dir 编码标准 Klocwork 2023.2 的新标准和扩展标准覆盖范围和 分类标准 : • CERT • CWE – 2022 CWE Top 25 最危险的软件弱点 • DISA STIG v 5 - C/C++ 高严重性规则高达 83% • MISRA – 改进了 MISRA C : 2012 AMD 2 覆盖范围(需要支持人员提供额外实用程序,以实现最大覆盖范围) • OWASP 产品体验改进 Microsoft Visual Studio 插件 使用 Visual Studio 扩展更快地开始分析。 • 在使用 kwcheck 命令作为外部分析引擎时,我们改进了 Visual Studio 扩展的构建规范生成性能。 项目流 改进了大量项目流的 Validate 平台的性能。 • 显示和使用项目流清单所需的时间大大减少。 第三方依赖项 • 软件包中包含 Apache Tomcat 和 Open JDK 的升级版本。 有关新增功能的更多详细信息,请参阅发行说明。 Klockwork 2023.2 的重要变化 许可证管理更改 自 2023.2 起, Klocwork 工具现在使用 Reprise 许可证管理器 ( RLM ) v15.0 。 • 重要提示:升级后的 RLM v15.0 服务器包含在 Klocwork 2023.2 安装中。任何早期的 RLM 服务器都需要升级到此版本才能与 Klocwork 2023.2 及更高版本配合使用。升级到 RLM v15.0 解决了在与服务器连接量较大的情况下 Validate 2023.1 的服务器稳定性可能出现的问题。 • 2022 许可证与 Klocwork 2023.2 不兼容。升级时,请联系 info@polelink.com 以获取新许可证。 2022.4 SR/ 补丁可用 已创建 2021.4 至 2022.4 的补丁,以解决自动删除版本中丢失的引用问题。 Klocwork 2023.1 及更高版本不受影响。 • 使用 2022.4 的所有客户都应升级到该软件的最新版本。 ➡ 体验最新版 Klcwork2023.2: info@polelink.com
  • 热度 9
    2023-6-25 10:00
    679 次阅读|
    0 个评论
    应用程序安全 ( AppSec ) 对于高效和有效的安全措施至关重要,有助于解决软件应用程序日益严重的安全威胁。在这里,我们将讨论应用程序安全 ( AppSec ) 的原则、实施它的最佳实践以及您应该使用的 AppSec 工具。 什么是应用安全? AppSec 是在硬件、软件和开发过程中在应用程序级别查找、修复和防止安全漏洞的过程。它包括对应用程序设计和开发以及整个生命周期(包括应用程序启动后)的措施的指导。 具有强大应用程序安全性的组织认识到, AppSec 不是一项单一的技术,而是一个持续的过程,涉及最佳实践和流程,旨在帮助预防和解决应用程序面临的网络威胁。许多组织使用服务和 AppSec 工具来加速应用程序开发,同时减少代码漏洞并防止网络安全风险。 为什么应用安全很重要? 应用程序安全性很重要,因为软件应用程序中的漏洞很常见 - 据报道, 84% 的安全事件发生在应用程序层。 为什么是应用层?由于应用程序包含重要的公司和用户数据,因此应用程序层是恶意行为者的主要目标。如果黑客能够在合法组织和合法用户之间的交换过程中访问或重定向信息,他们可以使用各种技术并利用漏洞 —— 包括代码注入、访问控制中断、安全错误配置和密码故障 —— 窃取公司数据和资源、登录凭据和其他特权信息。 应用程序安全保护软件应用程序代码免受此类威胁。 AppSec 战略计划包括在软件开发生命周期( SDLC )的所有阶段检查应用程序安全性。 通过遵循应用程序安全措施,您可以确保在开发周期的早期识别和处理软件应用程序中的弱点和漏洞,以免它们成为严重的安全漏洞。 应用安全最佳实践 AppSec 最佳实践应从软件开发生命周期的开始启动,并被整个产品团队采用。当整个团队都参与并在整个开发过程中积极测试、识别和修复代码漏洞时,您更有可能防止以后可能出现的安全问题。 把你的 DevSecOps 团队想象成一个管弦乐队,把你的 AppSec 工具想象成你的乐器,把最佳实践想象成排练。你要确保你在正确的音高和时间演奏正确的音符,无缝协调,创造出最终的、响亮的结果。所有这些工具、实践和流程协同工作,以创建应用程序的安全性和功能安全性的更大整体。使用 AppSec 工具和最佳实践,您可以为成功奠定基础。 遵循以下最佳实践以实现高效的软件应用程序安全性: • 建立 应用程序安全风险配置文件 ,以识别潜在的安全漏洞和弱点。 此方法可帮助您评估潜在风险并确定不同类型的应用程序的优先级,以帮助做出最有利于组织的战略安全决策。通过询问有关网络攻击者如何可能进入应用程序并将这些安全点记录到配置文件中的问题,您可以避免在维护评估中重复相同的基础,并加快未来的风险评估。 • 识别并消除软件应用程序中的安全漏洞。在开发应用程序时,对应用程序进行彻底的风险评估将帮助您识别和修复安全漏洞。 • 识别并解决开源和第三方软件中的安全漏洞。 这是一个重要的实践,因为对于应用程序,您只有这么多的控制权。一旦他们在世界上访问并与第三方软件交换数据,您还必须对该软件中的潜在风险进行说明并做好准备。 • 使用正确的应用程序安全工具。 现在,越来越多的数据和资源正在迁移到云中,应用程序开发人员越来越依赖于使用有助于指导安全软件开发的 AppSec 工具。使用正确的 AppSec 工具,您可以快速识别和修复软件中的漏洞,同时确保符合行业编码标准。 • 为您的团队提供应用程序安全培训。 如果您的整个团队都掌握了最新的知识和专有技术来识别应用程序代码中的常见弱点,那么您将在开发过程中更早、更快地发现问题并加速开发。将 AppSec 工具作为培训的一部分也将有助于加快应用程序的上市时间。 采用应用程序安全最佳实践将最大限度地降低风险并保护数据。为了确保您的应用程序安全措施高效且有效,您需要正确的工具。 SAST 和 DAST 都可以保护您的软件免受漏洞的影响,从而使 DevSecOps 过程更容易。以下是每种测试方法的优点: • SAST :也称为 “ 白盒测试 ” , SAST 是一种软件安全漏洞测试。该工具会在 您开发 应用程序时分析源代码,以检测和报告可能导致安全漏洞的弱点。通过使用此类工具,可以在开发早期识别安全漏洞。 • DAST :也称为 “ 黑盒测试 ” , DAST 是一种软件安全漏洞测试。这种类型的工具在运行时检测指示存在安全漏洞的情况。通过使用这种类型的工具,您可以在开发周期的后期识别安全错误、运行时和与环境相关的问题。 除了用于测试代码的静态分析器之外,还有许多其他工具可以在 本地和云 中测试和保护应用程序和 API ,这些工具可在应用程序的整个 SDLC 中提供 漏洞的可追溯性 。此外,您还可以使用复杂的 移动应用 测试 工具,帮助您像用户一样进行测试,并通过测试失败分析获得快速反馈。 在整个开发工作流程中对应用程序进行 持续的性能测试 使您的团队能够获得高质量的代码,并最大限度地减少可能导致安全问题的错误和漏洞。 应用安全左移安全性 在 SDLC 中左移是许多开发人员实施的原则,用于在开发过程的早期执行诸如测试软件之类的任务,而不是等待过程结束时(或线性开发时间线的 “ 右侧 ” )。 左移安全性, 或 “ 采用左移方法 ” 进行安全性,意味着在 SDLC 的早期执行安全检查或其他与安全相关的任务。 这种早期方法可帮助应用程序开发人员提高效率,因为他们不会因必须经常切换任务而中断。通过在开发人员脑海中还记得最近编写的代码时获得安全结果,他们可以在当时和那里快速进行更改,而不是等到他们签入代码并持续集成运行分析。 将安全措施应用于应用程序可确保在产品仍处于开发阶段时仍有时间查找和修复漏洞,并提高开发人员对常见漏洞和 AppSec 最佳实践的认识。 应用安全编码标准 安全编码标准是用于识别、预防和消除可能危及软件安全性的软件漏洞的规则和准则。 • CERT : CERT 是一系列安全编码标准,针对 C , C++ 和 Java 中可能导致安全风险的不安全编码实践和未定义的行为。 • CWE :常见弱点枚举 ( CWE ) 列表可识别 C 、 C++ 、 Java 和 C# 中的软件安全漏洞。 • DISA-STIG : DISA-STIG 是技术软件安全发现的集合。 • OWASP :开放 Web 应用程序安全 项目( OWASP )确定了最大的 Web 应用程序安全风险。最受欢迎的 OWASP 资源是 OWASP Top 10 ,它们是应用程序的 10 个最 关键的安全风险。 • ISO/IEC TS 17961 : ISO/IEC TS 17961 是 C 语言检测安全漏洞的安全编码标准。 应在开发周期的早期使用 AppSec 工具(如静态代码分析器)来强制实施安全编码标准,以确保对潜在安全漏洞的最佳解决方案。 为什么 Klocwork 和 Helix QAC 是理想的 AppSec 工具 针对 C 、 C++ 、 C# 、 Java 、 JavaScript 、 Python 和 Kotlin 的 Klocwork 静态应用程序安全测试 ( SAST ) 可识别应用程序软件的安全性、安全性和可靠性问题,帮助确保符合安全编码标准。它还使您能够在编写代码时自动执行源代码分析。 此外, Klocwork 的差异 分析 使您能够仅对已更改的文件执行快速增量分析,同时提供与完整项目扫描结果相同的结果。这确保了尽可能短的分析时间。 Klocwork 还为您提供以下好处: • 在开发早期检测代码漏洞、合 规 性问题和违反规则的行为。这有助于加快代码审查以及开发人员的手动测试工作。 • 执行行业和编码标准,包括 CWE 、 CERT 、 OWASP 和 DISA STIG 。 • 报告一段时间内和跨产品版本的合 规 性。 Perforce 的另一个静态分析解决方案 Helix QAC 可以轻松遵守安全编码标准,并在 应用诊断中获得 更少的误报和漏报 。它提供了深度覆盖和风险优先级,以帮助您首先解决最重要的问题,并涵盖安全标准,如 CERT C 、 CWE (包括 CWE Top 25 )和 ISO/IEC TS 17961 ( C 安全)。 使用验证 指挥您 的应用安全交响曲 Klocwork 和 Helix QAC 的调查结果都可以导入 Perforce 的 Valdate 平台 ,该平台是一个持续的安全和代码合 规 性平台,为所有 Perforce 静态分析产品提供单一管理平台。借助 Validate ,您可以为嵌入式和任务关键型应用程序提供功能安全性、安全性、可靠性和质量保证。 Validate 是一个单一的真相来源,它使您能够看到一组统一的报告,显示更完整的应用程序安全情况。该平台还能够整合来自各种其他工具的发现,将测试数据与静态分析结果一起提取,以识别未覆盖测试路径的代码中的关键缺陷。 正如您的 DevOps 团队就是您的管弦乐队一样,插入 Validate 的工具是单独的乐器,当它们组合在一起时,可以创建一首有凝聚力的交响乐,从而增强应用程序的整体性能和安全性。 ➡️ 申请静态分析 (Helix QAC 、 Klocwork ) 免费试用: info@polelink.com
  • 热度 5
    2023-6-19 17:36
    507 次阅读|
    0 个评论
    嵌入式软件应用程序所面临的日益增多的网络威胁。 嵌入式软件应用面临着越来越多的安全问题,在任何现代软件开发环境中,考虑安全性都是非常重要的。即使经过最好的审查和测试的软件也可能存在BUG,而这些BUG可以让恶意用户进入系统并造成巨大的物理和财务损失。 其攻击范围涵盖很多领域:从机场的调度系统到医疗设备都可能受到攻击,特别值得关注的是日益增加的自动驾驶汽车或连接汽车、列车和飞机等计算机控制系统。任何与外界通信的系统都面临着风险,例如汽车可能被盗,更糟糕的情况是车辆的控制权被夺取。 那么,BUG是如何进入系统的呢? C和C++语言存在未定义的行为和不确定的行为,这可能会导致问题,尤其是对于没有经验的开发人员来说,他们可能不知道代码实际上并没有执行他们预期的操作。此类错误可能会导致开发者错误地认为一切都很正常,因为以前使用过该代码,所以不需要重新验证。但实际上并非如此。代码的优化可能看起来是一件好事,占用更少的空间,但代码优化可能会删除优化器认为不必要但却对安全至关重要的检查,例如除以零和不可达代码检测。外部库可能包含BUG,但是采用的代码可能没有经过验证。因此,在使用外部库时,重要的是检查公开BUG的已知数据库,例如CV。而任何使用动态内存的地方都可能导致问题,特别是像内存泄漏之类的问题。 更多的安全漏洞是由于假设输入数据格式正确且无需验证,导致出现数据缓冲区溢出和使用未分配动态内存(即所谓的“use after free”)等问题。尽管人们普遍认识到这些安全问题可能会出现,但它们并没有得到足够的关注和解决。原因可能有很多,但最主要的原因是之前没有真正推动改变,增加新功能比花费时间检查安全问题更为重要。可以通过教育开发人员贯穿软件开发生命周期考虑安全、改进流程和工具来提高检测安全漏洞的信心,以及针对安全的测试,来改善这种情况。 CERT C和C++如何检测软件安全问题。 如今可能有实施软件安全的愿望,那么如何实现呢?我们将看看嵌入式系统中使用的语言,以及如何使用C和C++来检测这些语言引起的安全问题。历史上,嵌入式系统是用汇编语言编写的,但现在情况已经改变,大多数关键系统都是用C或C++编写的。C++正在变得越来越受欢迎,但当前C仍是首选语言。然而,这两种语言都存在安全问题。White Source知识库显示,在过去十年中发现的开源代码安全漏洞中,47%是C,6%是C++。这可能会导致人们认为C本质上比其他语言更容易受到攻击,但事实并非如此。因为C语言编写的代码数量比任何其他语言都多,并且时间跨度较长,因此发现漏洞的机会更多。而在过去五年中发现了大量漏洞是好事情。高危漏洞的高比例(36%)在C++中被发现,然后是C(26%)。但需要注意的是,随着C++变得越来越流行,也会有更多的机会在两种语言中发现漏洞,因此需要适当评估这些数据。 在计算机安全中,最常见的漏洞是缓冲区溢出和输入验证。缓冲区溢出是一个非常严重的问题,可能会导致严重的后果。C和C++特别容易受到溢出攻击的影响,因为它们将字符串定义为未终止的字符数组,没有隐式进行边界检查,即使开发人员认为已经进行了检查,标准库函数对字符串也不执行任何边界检查。在某些函数(如向量、点、A-T)中,C++进行了一些改进,并通过默认进行了边界检查。漏洞代码允许恶意用户覆盖内存中的其他值,例如CPU必须执行的指令,从而更改代码的行为。 关于缓冲区溢出,那就不得不提到两个常见的函数:strcpy和gets。这两个函数都存在潜在的安全风险。如果输入字符串超过目标数组的预定义长度,则strcpy函数会导致缓冲区溢出;而gets函数则永远不能被安全地使用,因为gets函数没有边界检查,当输入的字符串长度大于目标数组的长度时,将发生缓冲区溢出,可能会导致程序运行异常或被入侵者利用。 此外,未受限制的格式化输出字符串也可能会导致安全漏洞。这种漏洞是由于应用程序将输入字符串的数据作为命令进行评估。如果恶意用户可以完全或部分地控制格式化字符串的内容,则可能会导致应用程序崩溃、堆栈内容泄露、任意内存写入等后果。此外,攻击者还可以执行任意代码并以易受攻击进程的权限运行,从而破坏系统的安全和稳定性。 即使是最有经验的程序员也可能犯错。研究表明,他们通常只能以约50% 的效率发现自己的错误。那么如何确保安全问题,例如缓冲区溢出的情况不会出现在最终产品中呢?编译器可能会看到显而易见的起点,但它可能仅实现语言标准的子集,语言标准的解释可能因编译器而异,这可能导致未来的移植或语义错误。最好的方法是根据编码标准对代码进行检查,例如CERT C或CERT C++。 正如我们所看到的,C和C++都具有未定义和未指定的行为,应该避免使用。而编码标准正提供了一种做到这一点的方法。 编码标准是一组规则,通常由一个团队根据多年的经验制定,可以让开发人员对其代码更有信心。通过使用编码标准遵循一组规则,降低引入错误的可能性,使代码更易于维护。任何安全系统的起点都是使用防御性实现技术,使软件即使在面临不利情况时也能继续运行。公认的编码标准意味着其已经考虑了常见的使用情况,因为C和C++都具有可能导致关键或未指定行为的特性。编码标准因此定义了一个语言子集,以防止使用会导致此类行为的构造方式。此外,编码标准将实现强类型,它确保对语言数据类型有所了解,从而防止某些类别的编程错误。 CERT部门协助开发的编码标准专注于安全,它们被认为是一个全面的程序安全标准,并在多个行业中使用。该标准由一个在线社区开发,有单独的标准适用于C、C++和Java。然而,由于C和C++之间存在重叠,许多CERT C规则已经包括在内。只需添加一些额外的规则,便可关注C++语言中没有完全覆盖的部分。 如何通过限制使用某些库函数来创建一个安全的C语言子集,以提高代码的安全性?这可以通过引入一些规则来实现,比如INTC和A-R等,这些规则旨在防止常见的安全问题,例如缓冲区溢出和输入验证等。 ARR30-C:不要形成或使用超出边界的指针或数组 。 如果使用越界指针或数组,就可能会导致程序错误和安全漏洞。因此,在编写程序时,应该确保所有指针和数组的访问都在其有效范围内。如果需要进行指针或数组的操作,应该先检查其有效范围,再进行后续的处理。这样可以避免因为越界访问而导致的程序错误和安全漏洞。例如,如果使用指针访问数组元素时,应该先检查指针是否指向数组的有效范围内,再进行访问操作。如果指针越界,就可能会导致程序崩溃或者被攻击者利用。因此,ARR30-C规则的实践可以提高程序的安全性和稳定性。 ARR38-C:保证库函数不会形成无效指针 。 它要求在使用库函数时,必须保证传递给函数的指针参数是有效的,即指向已分配的内存区域或NULL指针。如果传递给函数的指针参数是无效的,那么就可能会出现程序错误和安全漏洞。 因此,在使用库函数时,应该先检查传递给函数的指针参数是否有效,再进行后续的处理。这样可以避免因为传递无效指针而导致的程序错误和安全漏洞。例如,如果使用strcpy()函数将一个字符串复制到另一个字符串中,那么应该先检查目标字符串的指针是否有效,再进行复制操作。如果目标字符串的指针无效,那么就可能会导致程序崩溃或者被攻击者利用。因此,ARR38-C规则的实践可以提高程序的安全性和稳定性。 EXP39-C: 不要通过不兼容类型的指针访问变量。 如果使用不兼容类型的指针访问变量,就可能会导致程序错误和安全漏洞。因此,在访问变量时,应该使用与变量类型兼容的指针。如果需要使用不兼容类型的指针,可以通过类型转换来实现。但是,在进行类型转换时,需要确保转换后的指针仍然指向有效的内存区域,否则就可能会出现程序错误和安全漏洞。因此,EXP39-C规则的实践可以提高程序的安全性和稳定性。 FIO37-C: 在使用 fgets()或fgetws()函数读取输入时,不要假定函数返回的字符串非空 。 因为这两个函数在读取输入时可能会遇到文件结束符或读取错误等情况,导致返回的字符串为空。如果程序在使用fgets()或fgetws()函数时假定返回的字符串非空,那么就可能会出现程序错误和安全漏洞。因此,在使用fgets()或fgetws()函数时,应该先检查返回的字符串是否为空,再进行后续的处理。这样可以避免因为假定字符串非空而导致的程序错误和安全漏洞。 STR31-C : 确保字符串存储空间足够容纳字符数据和空字符终止符。 这条规则的目的是防止缓冲区溢出和其他安全漏洞,从而提高代码的安全性和可靠性。具体实现方法包括使用安全的字符串函数、检查字符串长度和缓冲区大小、避免使用不安全的字符串拼接等。在编写代码时,应该遵循这条规则,并结合实际情况选择相应的实现方法,以确保代码的安全性和可靠性。 STR32-C: 不要将非零终止字符序列传递给期望字符串的库函数。 旨在防止将非空字符终止的字符序列传递给期望字符串的库函数。这条规则的目的是防止缓冲区溢出和其他安全漏洞,从而提高代码的安全性和可靠性。具体实现方法包括使用安全的字符串函数、检查字符串长度和缓冲区大小、避免使用不安全的字符串拼接等。在编写代码时,应该遵循这条规则,并结合实际情况选择相应的实现方法,以确保代码的安全性和可靠性。 静态代码分析工具如何有效地实现安全编码标准? 如何实施编码标准以确保代码的正确性和合规性呢?CERT C标准规定了确定性、不确定性和合规性的要求,并强制要求代码不得违反任何规则。同时,建议遵循推荐操作以便更容易符合规则。为了检查代码是否违反规则,该标准建议使用静态代码分析工具。 在软件开发生命周期中,手动和自动代码审查都有其适用的场景,例如自动化工具无法知道代码的实际意图。然而,手动代码审查的结果会受到审核人员专业知识的影响。静态代码分析可以检查很少被控制的代码片段,这些代码片段通常无法通过其他方法测试。这可以找出异常处理程序或日志系统中的缺陷。与手动代码审查相比,其速度更快,而且不占用开发人员的时间,使他们能够更专注于开发。开发者广泛认为手动审核和自动静态代码分析的结合是最有效的方式,因为这是识别漏洞和弱点的最佳方式,CERT C 和CERT C++ 都应该使用静态代码分析工具,最好是行业标准的工具,如Helix QAC,其对CERT编码规范的覆盖度达到100%。这款Perforce的静态代码分析工具可以验证代码符合编码指南,并提供这种符合性的证据,以满足网络安全要求。Helix QAC 具有完整的第三方 C 和 C++ 语言库的覆盖,这使得开发人员更容易验证软件是否免受常见代码安全漏洞的影响。 总之,实施编码标准是确保代码质量的重要步骤,它可以帮助开发人员避免常见的错误和漏洞,从而提高软件的可靠性和安全性。同时,使用静态分析工具进行全面的代码审查可以进一步加强代码的正确性和符合性。如何通过QAC符合CERT请见《如何通过CERT C/C++确保软件信息安全》。
  • 热度 8
    2023-4-18 17:00
    1683 次阅读|
    0 个评论
    Klocwork 2023.1为CI/CD分析pipeline引入灵活的管理选项 。使用差异分析加速静态分析扫描, 在CI/CD管道构建中提供上下文结果,并可以用和服务器端相同的方式管理issue。 扩展了对Java 14/15和C#8.0语言的支持,C/C++/C# PATH分析性能提升高达50%*。此外,此版本还包括对MISRA C:2012和DISA STIG编码标准规则覆盖范围的改进,Visual Studio IDE插件提供了新的分析模式选项。 *(根据内部基准测试的开放源码软件项目) 在 Validate中管理CI/CD pipeline的差异分析 • 对Klocwork的持续集成工具和验证平台进行了新的工作流改进,为CI/CD Pipeline分析提供了灵活的管理选项和快速反馈。 ○ 通过使用验证中新的"CI Build"选项卡来管理差异分析持续集成构建。 ○ 使用CI Build来保证新代码提交的质量。 ○ 利用Klocwork的差异分析,基于Delta更改更快地识别问题,而不必运行完整的构建。 ○ CI构建的名称和筛选器。 ○ 以处理服务器问题的相同方式来管理问题。 • 项目流功能支持CI/CD构建。 • 已经添加了新的WebAPI命令来创建、更新或删除配置项构建以及检索配置项问题详细信息。 ○ 提供与其他CI/CD pipeline(如Jenkins)的轻松集成,以提供上下文结果。 C/C++ 分析引擎 改进了C/C++ PATH分析的性能。 • PATH分析现在可以并行化利用额外的CPU内核/线程,为大型复杂项目提供更高的性能。 • 这一变化将选定项目和解决方案的分析时间缩短了50%*。 *(根据内部基准测试的开放源码软件项目) 请注意:有关“PATH API版本升级”的详细信息,请参阅下面的“Klocwork 2023.1中的重要更改”部分。“ 关详细信息,请参阅发行说明. C# 分析引擎 改进了C# PATH分析的性能。 • 这一变化将选定项目和解决方案的分析时间缩短了50%*。 *(基于内部基准OSS项目) 改进了对C#8.0语言规范的支持。新的语言功能包括: • const成员在接口中的声明 • readonly实例成员 • static局部函数 • 默认接口方法 • 空引用类型 • async streams • using声明 • 一次性ref结构 Java分析引擎 扩展了对Java 14和15语言规范的支持。新功能包括: • 改进的构建过程监控,减少Java 15的解析错误和警告。 • 扩展的PATH分析以支持Java 14开关表达式。 • Java 15 API支持Klocwork构建集成工具。 • 升级Java知识库以提供更高的准确性和对Java 15 API的支持。 • kwandroid工具现在支持-lang选项,您可以使用该选项为C++或Java生成单独的构建规范。 编码标准 针对Klocwork 2023.1新增和扩展的标准覆盖范围和taxonomies: DISA STIG v5 — C, C++, 和Java • MISRA C:2012 AMD2 规则覆盖率为99%。 • CWE — C++, Java • CERT — C • Joint Strike Fighter Air Vehicle C++ • OWASP Top 10 — Java 用户体验提升措施 Visual Studio IDE 插件 VS插件现在支持C/C++/C#的两种分析模式选项: • Klocwork的原生Visual Studio分析器提供根据本地配置的项目或解决方案的设置量身定制的结果。 • 新的外部引擎选项使用了Klocwork的“kwcheck”工具,提供了额外的新功能。 ○ 与内部引擎相比,kwcheck生成的分析结果与从kwciagent和kwbuildproject获得的结果更加一致。 ○ 与连接的项目同步以使用系统配置。 ○ 提供使用本地生成的生成规范或使用外部生成的。 ○ 利用增量和并行进行微分分析。 有关新增功能的更详细信息,请参阅发行说明。 Klocwork 2023.1中的重要更改 License管理变更 从2023.1开始,Klocwork现在只支持Reprise license管理器(RLM)。 • FLEXlm/FlexNet Publisher支持在2022.2中已弃用,将不再适用于Klocwork 2023.1版本。 • 将为Reprise生成新的license文件;如果您需要旧版Klocwork的FLEX license文件,我们可以为您提供。 • 2022许可证与Klocwork 2023.1不兼容。需要新的许可证才能使用最新版本的产品。联系license@perforce.com获得新的许可证。 PATH API版本升级 随着Klocwork 2023.1的发布,自定义C/C++ PATH检查器将需要进行多线程兼容性检查。我们建议您查看自定义检查器以查找潜在的竞态条件,并使用2023.1 Klocwork Path API头文件和库重新编译。未重新编译的自定义检查器将继续工作,但将无法使用并行化功能。请参阅我们的发行说明以了解更多信息。 Klocwork 2021的维护结束 所有版本的Klocwork 2021的维护工作于2023年3月31日结束。此外,维护结束(EOM)日期和销售结束日期(EOS)也发生在2023年3月31日。有关对任何版本的Klocwork提供支持的信息,请参阅Klocwork产品生命周期. 声明结束的公告 从Klocwork 2023.1开始,将不支持以下操作系统,并且不再提供相应的安装程序: • Mac OS 将不再支持以下许可证管理器: • FlexNet Publisher license管理器