exponenta event banner

Доступ к массиву с поврежденным индексом

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

Описание

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

Риск

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

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

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

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

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

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

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

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

Примеры

развернуть все

#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++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_ARRAY_INDEX
Воздействие: среднее
CWE ID: 121, 124, 125, 129
Представлен в R2015b