ABV.STACK

缓冲区溢出 — 超出边界的局部数组索引

ABV.STACK 是一种过程间检查器,可查找被调用的函数内部的缓冲区溢出。传递给该函数的参数可控制访问缓冲区的哪些元素。如果缓冲区未传递给该函数,但是缓冲区通常为函数内部的局部变量或全局变量时,此检查器将查找缺陷。

漏洞与风险

编入索引中超出边界的局部数组,可能导致应用程序不稳定、精心策划的攻击、数据披露漏洞、代码注入或其他漏洞。

漏洞代码示例

复制
  void foobar(int x)
  {
      int local_array[7];
      local_array[x] = 0;
  }
  
  int main() {
      foobar(15);
      return 0;
 }

在此示例中,函数 foobar 获得可在索引中用于访问 local_array 的值。Klocwork 为第 8 行生成了一个问题报告,指出参数为 15 的调用方法 foobar 超出有效值 0..7。在本例中,检查器已在函数 foobar 内部的缓冲区中查找到缺陷。

修正代码示例

复制
  void foobar(int x)
  {
      int local_array[7];
      // verify the parameter is in range
      if (x >= 0 && x < 7)
      {
          local_array[x] = 0;
      }
  }
 
 int main() {
     foobar(15);
     return 0;
 }

在该修正代码示例中,参数 X 的值在用于对第 7 行的局部数组 local_array 进行索引前,已在第 5 行进行验证。在其他情况下,对类似代码最好的修正方法可能是在调用函数中检查值。

扩展

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