安全设计警报:消除缓冲区溢出漏洞

安全设计警报:消除缓冲区溢出漏洞

祺印说信安 2025-02-18 16:01

恶意网络攻击者利用缓冲区溢出漏洞破坏软件

注意:此安全设计警报是正在进行的系列警报的一部分,旨在推进全行业的最佳实践,以消除产品生命周期设计和开发阶段的所有漏洞类别。安全设计计划旨在促进整个技术行业的文化转变,规范开发开箱即用的安全产品。访问cisa.gov了解有关安全设计原则的更多信息,签署安全设计承诺,并随时了解最新的安全设计警报。

缓冲区溢出漏洞是一种常见的内存安全软件设计缺陷,经常导致系统被入侵。网络安全和基础设施安全局 (CISA) 和联邦调查局 (FBI) 认识到内存安全漏洞涉及范围广泛的问题,其中许多问题需要大量时间和精力才能妥善解决。虽然在开发过程中使用内存安全语言可以防止所有类型的内存安全漏洞,但其他缓解措施可能仅针对某些类型的内存安全漏洞。无论如何,缓冲区溢出漏洞是内存安全漏洞的一个众所周知的子集,可以使用内存安全语言和本警报中列出的其他经过验证的技术来解决。尽管存在针对缓冲区溢出漏洞的记录良好、有效的缓解措施,但许多制造商仍在使用不安全的软件开发实践,导致这些漏洞持续存在。出于这些原因(以及利用这些缺陷可能造成的损害),CISA、FBI 和其他机构[ 1 ]将缓冲区溢出漏洞指定为不可原谅的缺陷。

CISA 和 FBI 认为,使用不安全的软件开发实践会导致缓冲区溢出漏洞持续存在(尤其是使用内存不安全的编程语言),对我们的国家和经济安全构成不可接受的风险。[ 2 ]因此,CISA 和 FBI 敦促制造商使用行之有效的预防方法和缓解措施来消除此类缺陷,同时敦促 软件客户要求制造商提供包含这些预防措施的安全产品。本警报概述了基于安全设计原则和软件开发最佳实践的行之有效的预防或缓解缓冲区溢出漏洞的方法。

*当威胁行为者访问或在计算机内存的错误部分(即内存缓冲区之外)写入信息时,就会出现缓冲区溢出漏洞(*CWE-119 )。

这些漏洞可能发生在管理缓冲区的两个主要内存区域中:基于堆栈的溢出CWE-121)(分配在内存堆栈上)和基于堆的溢出CWE-122)(分配在内存堆上)。缓冲区溢出漏洞会带来严重的安全风险,因为它们可能导致数据损坏、敏感数据泄露、程序崩溃和未经授权的代码执行。[ 3 ]威胁行为者经常利用这些漏洞获得对组织网络的初始访问权限,然后横向移动到更广泛的网络。[ 3 ]缓冲区溢出漏洞的示例包括:
CVE-2025-21333
CVE-2025-0282
CVE-2024-49138
CVE-2024-38812
CVE-2023-6549
CVE-2022-0185**编写机构敦促制造商立即采取行动,防止这些漏洞被引入其产品。制造商可以通过使用 此警报中列出的**
安全设计实践来防止缓冲区溢出漏洞。软件制造商高级管理人员和业务负责人应要求其产品和开发团队记录过去的缓冲区溢出漏洞以及他们如何努力消除此类缺陷。

CISA 和 FBI 还建议软件客户确保制造商遵守本警报中包含的安全软件开发实践,方法是要求制造商提供软件物料清单 (SBOM)和安全软件开发证明。[ 4 ]

为了防止缓冲区溢出漏洞,技术负责人应实施以下安全设计实践。(注意:这不是缓解和防止缓冲区溢出漏洞的完整方法列表,但包含了 CISA 认为最有效和最可行的方法。)
– 在可行的情况下,开发软件时使用内存安全语言,将内存管理的负担从开发人员转移到编程语言的内置安全功能上。[ 5 ]
注意:可以禁用或覆盖某些内存安全语言的内存安全保证;开发人员必须避免这样做,以防止缓冲区溢出漏洞。此外,将内存安全语言用于软件包的一部分并不能修复其他库中的内存不安全代码。

  • 编写机构认识到,用内存安全语言重写代码库需要付出巨大努力。因此,我们建议制造商制定并实施分阶段过渡计划,以增加内存安全语言的使用。理想情况下,该计划应包括使用内存安全语言开发新代码,并随着时间的推移和在可行的情况下将其软件中权限最高/暴露程度最高的代码转换为内存安全语言。[ 6 ]在过渡到内存安全语言的同时,制造商还应考虑利用技术来限制现有代码库中的内存安全漏洞。
  • 启用编译器标志来实现编译时和运行时对缓冲区溢出的保护[ 7 ](在应用程序的性能要求范围内尽可能地保护),并实现在发生溢出时发出警报的金丝雀。[ 8 ]
  • 使用AddressSanitizer 和 MemorySanitizer 等经过检测的工具链定期运行单元测试,这些工具链会在运行时检查源代码是否存在缓冲区溢出和其他内存安全问题。在单元测试覆盖率较高的代码库中,此类工具可以在内存安全相关问题成为漏洞之前检测到许多(但不是全部)问题。****
  • 进行积极的对抗性产品测试,包括静态分析、模糊测试和人工审查(根据需要),以确保整个开发生命周期内代码的质量和安全。[ 9 ]
  • 发布
    内存安全路线图,概述制造商计划如何用内存安全语言开发新产品,并优先将代码迁移到内存安全语言。

  • 对过去的漏洞(包括缓冲区溢出)进行根本原因分析,以发现趋势和模式。尽可能采取措施消除产品中所有类型的漏洞,而不是表面原因。

安全设计经验教训

设计安全的产品可以合理地防止恶意网络攻击者利用最常见和最危险的产品缺陷。在软件开发生命周期的开始阶段(从设计阶段开始,一直到开发、发布和更新)纳入安全性可以减轻客户的负担并降低公众的风险。尽管有这一发现,缓冲区溢出漏洞仍然是一种普遍存在的缺陷。

在可行的情况下,制造商应努力通过使用内存安全语言和本警报中所述的最佳实践来开发新软件,以消除缓冲区溢出漏洞。此外,消除缓冲区溢出漏洞有助于减少其他内存安全问题的普遍性,例如格式字符串、off-by-one 和释放后使用漏洞。有关内存安全性和过渡到使用内存安全语言的更多信息,请查看以下资源:
– CISA 和 FBI 的 内存安全路线图案例、探索关键开源项目中的内存安全以及 产品安全不良实践。
– 白宫国家网络主管办公室(ONCD) 重返构建模块报告。
– 国家安全局 (NSA) 的 软件内存安全。
– Google对内存安全的看法和 从源头消除内存安全漏洞、微软的 我们需要一种更安全的系统编程语言、亚马逊网络服务 (AWS)对 Rust 的可持续性以及 Mozilla使用 Rust 重写浏览器组件的影响。

遵循安全设计原则

制造商应考虑承诺遵循由 17 家全球网络安全机构联合制定的以下三项“安全设计”原则。

原则 1:对客户安全结果负责

软件制造商必须通过消除缓冲区溢出漏洞来优先考虑客户安全。关键投资包括为开发人员提供安全的构建块,以防止可能损害可靠性和用户数据的错误。依赖检测后修复是不可持续的;相反,制造商应该在软件开发生命周期内实施最佳实践。自动化保护措施应能防止不安全的功能,而静态分析工具和严格的代码审查可以帮助在部署之前识别缺陷。通过从源头解决漏洞,制造商可以增强安全性,而无需依赖客户进行修复。

原则 2:推行彻底的透明度和问责制

制造商在披露产品漏洞时必须注重透明度。他们应跟踪产品中的漏洞,包括软件即服务 (SaaS) 产品的漏洞,并通过通用漏洞和暴露 (CVE) 程序报告这些漏洞。CVE 记录必须完整、准确且及时,并辅以适当的通用漏洞枚举 (CWE),以便于跟踪软件缺陷类别。

软件开发社区已经概述了避免各种缓冲区溢出漏洞的方法,例如归类为CWE-119和相关 CWE 的漏洞。制造商应找出这些漏洞的根本原因,并努力消除它们并解决更广泛的内存安全问题。此外,他们还应维护强大的漏洞披露计划 (VDP) 和产品安全事件响应团队 (PSIRT)。CISA 提供资源来帮助组织建立和维护 VDP。

原则 3:建立组织结构和领导力以实现这些目标

技术主管必须将软件安全资源视为战略投资,认识到安全设计实践可带来显著的长期节约。例如,谷歌的 Android 团队在确定缓解内存安全漏洞的长期成本将超过预防这些漏洞所需的投资后,于 2019 年将新代码转换为内存安全编程语言。[ 10 ]通过从根本上解决这些漏洞,他们最终随着时间的推移降低了成本。同样,微软、AWS 和 Mozilla 等组织也提倡采用内存安全语言来增强软件安全性。[ 11 ]

除了财务方面的考虑,领导者还必须认识到安全对客户、经济和国家安全的更广泛影响。这包括投资将安全作为核心业务重点的计划和激励措施。组织应积极努力消除所有类型的漏洞,并定期进行审查以识别和解决重复出现的问题。高管必须积极监控进展情况,确保分配足够的资源,并致力于持续改进。

软件制造商和客户的行动项目

软件制造商应考虑签署“安全设计承诺”  ,以表明他们致力于打造安全设计的产品。该承诺列出了签署者承诺的七个关键目标,以证明他们在确保产品安全设计方面取得了可衡量的进展,包括减少缓冲区溢出等系统性漏洞。

客户应要求软件在设计上是安全的。希望购买设计上安全的软件的组织应参考我们的“按需安全”指南,并将以下产品安全注意事项纳入其采购生命周期:
采购前:通过提问了解各个软件厂商如何保证产品安全。
在采购期间:将组织的产品安全要求整合到合同语言中。
采购后:持续评估产品安全性和安全结果。

免责声明

本报告中的信息“按原样”提供,仅供参考。编写组织不认可任何商业实体、产品、公司或服务,包括本文档中链接的任何实体、产品或服务。任何以服务标记、商标、制造商或其他方式提及特定商业实体、产品、流程或服务的行为,并不构成或暗示编写组织对其的认可、推荐或偏爱。

[1]请参阅 MITRE 的《不可原谅的漏洞》和CWE 的《25 个最危险的软件弱点》。
[2]请参阅 CISA 的《产品安全不良实践指南》。
[3]请参阅 OWASP 基金会的《缓冲区溢出》和 Fortinet 的《什么是缓冲区溢出?攻击、类型和漏洞》。
[4]请参阅 NIST 的特别出版物 (SP) 800-218《安全软件开发框架 (SSDF) 1.1 版:减轻软件漏洞风险的建议》,了解制造商和供应商在证明遵守安全软件开发实践方面的责任。
[5]请参阅 OWASP 基金会的《缓冲区溢出》。
[6]请参阅 CISA 的《产品安全不良实践指南》和 Google 的案例研究《从源头消除内存安全漏洞》,了解 Google 的 Android 团队如何通过改用内存安全语言,大大降低了 Android 中内存安全漏洞的流行程度。
[7]请参阅 Red Flag Developer 的《使用源代码级注释帮助 GCC 检测缓冲区溢出》和《在 GCC 和 Clang 中使用编译器标志进行堆栈保护》中列出的防止缓冲区溢出的编译器标志示例。请注意,这些标志不一定在所有 C 编译器中都实现。
[8]请参阅 OWASP Foundation 的CWE-119。
[9]请参阅 NIST 的SSDF。
[10]请参阅谷歌的《从源头消除内存安全漏洞》。
[11]请参阅微软的《我们需要更安全的系统编程语言》、《Mozilla用 Rust 重写浏览器组件的含义》和 AWS 的《使用 Rust 实现可持续性》。

回顾《网络安全法》第一个处罚案例看等级保护

根据网传某教育网站数据库被格式化无备份乱谈等级保护

网络安全知识:防火墙

防火墙的四大缺点与局限性

网络安全知识:网络安全意识