Loop bounded with tainted value

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

Описание

Этот дефект происходит, когда цикл ограничен значениями, полученными из небезопасных источников. Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -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 \times. 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++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_LOOP_BOUNDARY
Удар: Средняя
ID CWE: 606
Введенный в R2015b