主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用被污染的索引进行数组访问

来自不安全源的数组索引可能超出数组范围

描述

当您使用从不安全来源获得且未经过验证的索引访问数组时,会发生此缺陷。

风险

索引可能超出有效数组范围。如果受污染的索引超出数组范围,可能会导致:

  • 缓冲区下溢/下写 - 在缓冲区开始之前向内存写入数据。

  • 缓冲区溢出 - 在缓冲区末尾之后向内存中写入数据。

  • 缓冲区读取越界 - 在目标缓冲区末尾之后访问内存。

  • 缓冲区读取不足,或在目标缓冲区开始之前访问内存。

攻击者可以利用无效的读写操作在您的程序中引发问题。

修复

在使用索引访问数组之前,请验证索引值,确保其在数组范围内。

扩展检查项

默认情况下,Polyspace® 假设来自外部源的数据是受污染的。请参阅Sources of Tainting in a Polyspace Analysis。要将当前 Polyspace 分析范围内未产生的数据视为受污染数据,请使用命令行选项 -consider-analysis-perimeter-as-trust-boundary

示例

全部展开

#include <stdlib.h>
#include <stdio.h>
#define SIZE100 100
extern int tab[SIZE100];
static int tainted_int_source(void) {
  return strtol(getenv("INDEX"),NULL,10);
}
int taintedarrayindex(void) {
	int num = tainted_int_source();
    return tab[num];//Noncompliant  
}

在此示例中,索引 num 访问数组 tab。索引 num 来自不安全的来源,函数 taintedarrayindex 没有检查 num 是否在 tab 的范围内。

更正 - 使用前请检查范围

一种可能的更正方法是,在使用 num 之前,先检查它是否在有效范围内。

#include <stdlib.h>
#include <stdio.h>
#define SIZE100 100
extern int tab[SIZE100];
static int tainted_int_source(void) {
	return strtol(getenv("INDEX"),NULL,10);
}
int taintedarrayindex(void) {
	int num = tainted_int_source();
	if (num >= 0 && num < SIZE100) {
		return tab[num]; 
	} else {
		return -1;
	}
}

结果信息

组:被污染的数据
语言:C | C++
默认值:关闭
命令行语法:TAINTED_ARRAY_INDEX
影响

版本历史记录

在 R2015b 中推出