ID: 401 类型:变量 | 状态:草稿 |
描述
软件在使用后没有充分跟踪和释放分配的内存,这会慢慢消耗剩余的内存。
扩展描述
这通常是由错误的数据处理或意外中断的会话触发的。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 | 内存泄漏有两个常见的,有时是重叠的原因: •错误情况和其他异常情况 •对程序的哪个部分负责释放内存感到困惑 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
可利用性 | 技术冲击: DoS: 崩溃、推出或者重启: DoS: 不稳定; DoS: 资源消耗(CPU): DoS: 资源消耗 (内存): 一般情况下,大多数内存泄漏都会导致的软件可靠性问题,但如果攻击者可以故意触发内存泄漏,则攻击者可能会发起拒绝服务攻击(通过崩溃或挂起程序)或利用内存不足导致的其他意外程序行为。 | |
其它 | 技术冲击: 降低性能 |
被利用的可能性:
一般
示例
例1
如果对read()的调用未返回预期的字节数,则以下c函数将泄漏一块已分配的内存:
(问题代码)
Example Language: C
char* getBlock(int fd) {
char* buf = (char*) malloc(BLOCK_SIZE);
if (!buf) {
return NULL;
}
if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) {
return NULL;
}
return buf;
}
应对措施
阶段: 实现 策略: 库或者框架 选择一种提供自动内存管理的语言或工具,或使手动内存管理不易出错。
例如,Linux中的glibc提供了对无效指针的保护。
当使用xcode以OS X或IOS为目标时,启用自动参考计数(ARC)[Ref-391]。 为了帮助在C++编程时正确和一致地管理内存,请考虑使用智能指针类,如STD::AutoMyPTR(由ISO/IEC ISO/IEC 1488∶2003定义)、STD::SyrdyPtR和STD::UnQuyQPTR(由C++标准即将修订的内容,非正式地称为C++1X),或等效的解决方案,如Boost。 |
阶段: 架构与设计 使用精简库以便舍弃有风险的API。不是一个完整的解决方案。 |
Phases: 架构与设计; 编译及链接 可以使用Boehm-Demers-Weiser垃圾收集器或者valgrind探测代码中的漏洞 说明: 不一定有效. |
种属
说明
关联
这通常是由于对格式错误的数据处理不当或会话提前终止而导致的弱点。
术语
“内存泄漏”有时用于描述其他类型的问题,例如,对于不经意泄漏内存内容的信息泄漏(CVE-2003-0400就是这种术语冲突的一个例子)。