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[] 时,会指向非堆内存。释放非堆内存会导致应用程序崩溃,并可能产生易受攻击的漏洞。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。