exponenta event banner

Контур, ограниченный запятнанным значением

Цикл, управляемый значением из небезопасного источника

Описание

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

Риск

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

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

Перед началом цикла проверьте неизвестные значения границ и итератора путем проверки их нижних и верхних границ. Цикл выполняется только в том случае, если проверяются как нижняя, так и верхняя границы запятнанных значений. Явно проверьте, что допустимы как нижняя, так и верхняя границы запятнанного значения. Либо насыщайте или зажимайте запятнанное значение.

Примеры

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

#include<stdio.h>
enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

int taintedloopboundary(void) {
    int count;
    scanf("%d", &count);
    int res = 0;
    for (int i=0 ; i < count; ++i) {
        res += i;
    }
    return res;
}

В этом примере функция использует пользовательский ввод для цикла count времена. count может быть любым числом, поскольку значение не проверяется перед запуском for цикл.

Коррекция: Управление замкнутым контуром зажима

Одной из возможных корректировок является фиксация запятнанного контура управления. Проверка переменной запятнанного цикла count, этот пример ограничивает count до минимального значения и максимального значения с помощью встроенных функций min и max. Независимо от вводимого пользователем значения count остается в пределах известного диапазона.

#include<stdio.h>
#include<algorithm>
#define MIN 50
#define MAX 128
static  inline int max(int a, int b) { return a > b ? a : b;}
static inline int min(int a, int b) { return a < b ? a : b; }

int taintedloopboundary(void) {
	int count;
	scanf("%d", &count);
	int res = 0;
	count = max(MIN, min(count, MAX));
	for (int i=0 ; i<count ; ++i) { 
		res += i;
	} 
	return res;
}
Коррекция - контроль запятнанного контура

Другой возможной поправкой является проверка нижней границы и верхней границы запятнанной граничной переменной контура перед запуском for цикл. В этом примере проверяется низкий и высокий границы count и выполняет цикл только тогда, когда count находится в диапазоне от 0 до 127.

#include<stdio.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};


int taintedloopboundary(void) {
    int count;
    scanf("%d", &count);
    int res = 0;

    if (count>=0 && count<SIZE128) {
        for (int i=0 ; i<count ; ++i) { 
            res += i;
        }
    }
    return res;
}

Информация о результатах

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_LOOP_BOUNDARY
Воздействие: среднее
CWE ID: 606
Представлен в R2015b