CISA:大多数关键开源项目未使用内存安全代码
美国网络安全和基础设施安全局(CISA)近日发布的报告调查了172个关键开源项目的内存安全问题。报告显示,超过半数项目的代码存在内存不安全的情况,尤其在资源限制和性能要求高的情况下,开发人员依然选择使用内存不安全的语言。
![](https://www.goupsec.com/wp-content/uploads/2024/06/image-139.png)
关键开源项目的内存安全状态分布 来源:CISA
内存安全的重要性
内存安全语言通过自动管理内存,防止常见的内存相关错误(如缓冲区溢出和释放后使用)。例如,Rust的借用检查器能够消除数据争用,语言如Golang、Java、C#和Python通过垃圾回收来防止内存被错误利用。相比之下,内存不安全的语言(如C、C++和Assembly)不提供内存管理机制,增加了开发人员出错的风险。
调查结果
根据CISA、联邦调查局(FBI)以及澳大利亚和加拿大安全机构的报告,关键的开源项目中存在大量内存不安全的代码。以下是主要发现:
- 52%的关键开源项目包含内存不安全的代码。
- 这些项目中55%的代码行数(LoC)是内存不安全的。
- 大型项目大多数使用内存不安全的语言。
- 暗LoC计算十大项目的内存不安全代码比例均超过26%,平均比例为62.5%,有些项目高达94%。
- 即使用内存安全语言编写的项目也常常依赖于用内存不安全语言编写的组件。
一些关键开源项目的内存不安全代码比例如下:
- Linux:95%
- Tor:93%
- Chromium:51%
- MySQLServer:84%
- glibc:85%
- Redis:85%
- SystemD:65%
- Electron:47%
建议措施
CISA指出,软件开发人员面临多重挑战,尤其在实现网络、加密和操作系统功能时,不得不使用内存不安全的语言。此外,开发人员有时为了性能和资源限制,故意或错误地禁用内存安全功能,即使这样做会带来风险。
CISA建议软件开发人员使用内存安全的语言(例如Rust、Java和GO)编写新代码,并将现有项目(尤其是关键组件)转换为这些语言。
此外,CISA还建议开发人员遵循安全编码实践,仔细管理和审核依赖关系,并执行持续测试,包括静态分析、动态分析和模糊测试,以检测和解决内存安全问题。
报告链接: