FUM.GEN.MUST

释放未分配内存

如果释放未分配内存,会导致不可预测的结果。FUM.GEN.MUST 检查器会查找通过未初始化的指针调用的释放函数。

漏洞与风险

使用无效指针调用 free() 时,会导致程序内存损坏,进而导致程序崩溃,并可能产生会被攻击者利用的漏洞。

缓解与预防

为了避免释放非堆内存,需要确保:

  • 仅释放之前使用 malloc() 在堆上分配的指针
  • 保持对指针的跟踪,并且仅释放指针一次
  • 仅释放程序右侧部分的内存

漏洞代码示例

复制
      typedef struct list {
        char * next;
      } list;
      typedef struct z {
        list l;
      } z;
  
      void a6(){ // 8923
        z * x = malloc(sizeof(z));
       if (!x) return;
       x->l.next=1;
       free(x->l.next);
     }

Klocwork 针对第 12 行生成问题报告,指出被 x->l.next 引用且在第 11 行分配的未分配内存已在第 12 行释放。释放未非配内存会导致应用程序崩溃,并可能产生易受攻击的漏洞。

安全培训

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

扩展

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