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 времени. 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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 606
Введенный в R2015b