ABV.ITERATOR

缓冲区溢出 — 迭代中超出边界的数组索引

ABV.ITERATOR 可在迭代中使用一个指针检查整个数组中对数组元素超出边界的访问。该检查器会对任何相关代码进行标记,在该代码中,这种情况可能导致缓冲区溢出。

漏洞与风险

缓冲区溢出的后果包括有效数据被覆盖以及执行任意和潜在恶意代码。

漏洞代码示例 1

复制
   int example1()
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p;
       for (p = a ; p < a + 10; p++)
       {
           if (bar(*p) < 5)
               break;
       }
       return *p;   // ABV.ITERATOR
   }

Klocwork 针对第 10 行生成缓冲区溢出报告,指出当其值可能超出数组 a 的边界时,使用的是指针 p。指针 p 赋值给 a 并在第 5 行进行迭代。在本例中,迭代可能导致数组 a 超出 10 的限制。

修正代码示例 1

复制
   int example1()
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p;
       for (p = a ; p < a + 10; p++)
       {
           if (bar(*p) < 5)
               break;
       }
      if (p < a + 10)
        return *p;
      return 0;
   }

在该修正代码示例中,对第 10 行进行了检查以确保数组 a 不会溢出。

漏洞代码示例 2

复制
   int example2(int x)
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p = bar (a, x); //function returns a pointer to some element in "a"
       if (p < a + 5)
            return *p;
   
       return p[5]; // DEFECT: p[5] points to a[11] or beyond 
   }

Klocwork 针对第 8 行生成 ABV.ITERATOR 报告,指出数组 a 将在迭代后溢出。

修正代码示例 2

复制
   int example2(int x)
   {
       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
       int *p = bar (a, x); //function returns a pointer to some element in "a"
       if (p >= a + 5)
            return *p;
   
       return p[5];  
   }

在该修正代码示例中,第 5 行的语法得到更正,避免了缓冲区溢出。

安全培训

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

扩展

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