ID: 762 类型:变量 | 状态:未完成 |
描述
应用程序试图向系统返回内存资源,但它调用的释放函数与最初用于分配该资源的函数不兼容
扩展描述
这种弱点通常被描述为内存管理不匹配,例如::
- 内存是在堆栈上分配的(自动),但它是使用内存管理函数free()(cwe-590)释放的,该函数用于显式分配堆内存。
- 使用一组内存管理功能显式分配内存,并使用另一组释放内存。例如,内存可以用C++中的MalCube()代替新的运算符,然后用Delphi运算符重新分配。
当内存管理功能不匹配时,后果可能与代码执行、内存损坏或程序崩溃一样严重。根据例程的实现和管理对象的不同,结果和易受攻击性也会有所不同。
相关视图
“研究概念”视图(CWE-1000)
Nature | Type | ID | Name |
ChildOf | 763 | 释放无效指针或引用 | |
ParentOf | 590 | 释放非堆内存 |
“开发概念”视图(CWE-699)
Nature | Type | ID | Name |
MemberOf | 399 | 资源管理错误 |
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 修改内存; DoS: 崩溃、推出或者重启: 执行未获授权的代码或命令 |
被利用的可能性:
低
示例
例1
这个例子使用C++中的new运算符分配了一个BAROBJ对象,但是,程序员然后使用For()来分配对象,这可能导致意外的行为。
(问题代码)
Example Language: C++
void foo(){
BarObj *ptr = new BarObj()
/* do some work with ptr here */
...
free(ptr);
}
相反,程序员应该使用malloc系列函数之一创建对象,或者使用delete操作符删除对象。
(正确代码)
Example Language: C++
void foo(){
BarObj *ptr = new BarObj()
/* do some work with ptr here */
...
delete ptr;
}
例2
在本例中,程序不使用匹配函数(如malloc/free、new/delete和new[]/delete[])来分配/取消分配资源
(问题代码)
Example Language: C++
class A {
void foo();
};
void A::foo(){
int *ptr;
ptr = (int*)malloc(sizeof(int));
delete ptr;
}
例3
在本例中,程序调用非堆内存上的delete[]函数。
(问题代码)
Example Language: C++
class A{
void foo(bool);
};
void A::foo(bool heap) {
int localArray[2] = {
11,22
};
int *p = localArray;
if (heap){
p = new int[2];
}
delete[] p;
}
应对措施
阶段: 实现 只调用匹配的内存管理功能。不要混合和匹配程序。例如,当使用malloc()分配缓冲区时,请使用free()释放原始指针。 |
阶段: 实现 策略: 库或者框架 选择一种提供自动内存管理的语言或工具,或使手动内存管理不易出错。 例如,Linux中的glibc提供了对无效指针的保护。 When using Xcode to target OS X or iOS, enable automatic reference counting (ARC) [REF-391]. 当使用XCODE靶向OS X或IOS时,启用自动引用计数(ARC)[Ref-391]。 考虑使用智能指针类如 std::auto_ptr (defined by ISO/IEC ISO/IEC 14882:2003),std::shared_ptr and std::unique_ptr (specified by an upcoming revision of the C++ standard, informally referred to as C++ 1x),以帮助在C++编程时正确和一致地管理内存。或等效的解决方案,如Boost。 |
阶段: 架构与设计 策略: 库或者框架 使用一个经过审查的库或框架,它不允许出现这种弱点,或者提供使这种弱点更容易避免的结构。 例如,Linux中的glibc提供了对无效指针的保护。 |
阶段: 架构与设计 使用为内存分配和释放提供抽象的语言。 |
阶段: 测试 使用动态检测内存管理问题的工具,如valgrind。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 876 | ||
属于 | 969 | ||
属于 | 1172 | SEI CERT C Coding Standard - Guidelines 51. Microsoft Windows (WIN) |
说明
应用平台
这种弱点在任何允许手动管理内存的编程语言中都是可能的。