Array access with tainted index

Индекс массива из небезопасного источника, возможно, за пределами границ массива

Описание

Этот дефект возникает, когда вы получаете доступ к массиву с помощью индекса, который получен из небезопасных источников и который не был проверен. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

Возможно, индекс находится вне допустимой области значений массивов. Если испорченный индекс находится вне области значений массивов, это может вызвать:

  • Buffer underflow/underwrite - запись в память перед началом буфера.

  • Переполнение буфера - запись в память после окончания буфера.

  • Перечитывание буфера - доступ к памяти после окончания целевого буфера.

  • Недостаточное чтение буфера или доступ к памяти перед началом целевого буфера.

Атакующий может использовать недопустимую операцию чтения или записи, созданную для проблем в вашей программе.

Зафиксировать

Прежде чем использовать индекс для доступа к массиву, проверьте значение индекса, чтобы убедиться, что он находится внутри области значений массива.

Примеры

расширить все

#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];  
}

В этом примере индекс 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++
По умолчанию: Off
Синтаксис командной строки: TAINTED_ARRAY_INDEX
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 121, 124, 125, 129
Введенный в R2015b