FNH.MUST
释放非堆内存
如果要释放非堆内存(如静态或堆栈内存),则会损坏程序的内存管理结构。FNH.MUST 检查器会标记应用程序释放未使用堆函数(如 malloc()、calloc() 或 realloc())分配的内存的情况。
漏洞与风险
释放非堆内存会导致程序内存损坏,进而导致程序崩溃,并可能产生漏洞,从而被攻击者所利用。例如,恶意用户会使用 free() 访问内存位置,修改数据或执行未经授权的命令或代码。
缓解与预防
为了避免释放非堆内存,需要确保:
- 仅释放之前使用 malloc() 在堆上分配的指针
- 保持对指针的跟踪,并且仅释放指针一次
- 仅释放程序右侧部分的内存
漏洞代码示例
复制
class A {
public:
void foo();
};
void A::foo()
{
int localArray[2] = { 11, 22 };
delete[] localArray;
}
Klocwork 可生成非堆内存释放报告,其中指出当 localArray 传递到 delete[] 时,会指向非堆内存。释放非堆内存会导致应用程序崩溃,并可能产生易受攻击的漏洞。
外部指导
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。