RABV.CHECK

访问超过数组大小的数组值

在检查索引是否位于数组边界内之前,检查器会查找访问数组的情况。

漏洞与风险

如果超出数组大小的索引访问数组,可能会破坏数据,导致操作不当和/或崩溃。

漏洞代码示例 1

复制
  // some function returning an index
  int get_index();
  
  void main() {
      const int SIZE = 10;
  
      int arr[SIZE];
      int index = get_index();
  
      arr[index] = 0;
  
      if (index >= SIZE) {
          return;
      }
 }

Klocwork 报告第 10 行出现缺陷,指出在检查第 12 行索引的有效性之前,将其用于访问阵列。

修正代码示例 1

复制
  // some function returning an index
  int get_index();
  
  void main() {
      const int SIZE = 10;
  
      int arr[SIZE];
      int index = get_index();
  
     if (index >= SIZE) {
         return;
     }
 
     arr[index] = 0;
 }

前一代码段的问题已修复;在将索引用于访问阵列之前对其进行检查。

漏洞代码示例 2

复制
  int get_index();
  
  void set(int* arr, int index) {
      arr[index] = 0;
  }
  
  void main() {
      int SIZE = 10;
      int arr[SIZE];
     int index = get_index();
     
     set(arr, index);
    
     if (index >= SIZE) {
         return;
     }
 }

类似于示例 1,但不是在相同的函数 main 中访问阵列,而是作为参数传递至另一个函数 set。Klocwork 报告第 12 行出现缺陷,指出在检查第 14 行索引的有效性之前,将其用于访问函数 set 内的阵列。

修正代码示例 2

复制
  int get_index();
  
  void set(int* arr, int index) {
      arr[index] = 0;
  }
  
  void main() {
      int SIZE = 10;
      int arr[SIZE];
     int index = get_index();
     
     if (index >= SIZE) {
         return;
     } 
         
     set(arr, index);    
 }

用相同的方式修复缺陷;现在在索引传递至第 16 行的函数 set 之前,在第 12 行检查其有效性。

相关检查器

安全培训

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