Tainted sign change conversion

Значение из небезопасного источника изменяет знак

Описание

Этот дефект происходит, когда значения из незащищенных источников преобразованы, неявно или явным образом, от со знаком до значений без знака.

Например, функции то использование size_t когда аргументы неявно преобразуют аргумент в беззнаковое целое. Некоторые функции, которые неявно преобразуют size_t :

bcmp
memcpy
memmove
strncmp
strncpy
calloc
malloc
memalign

Риск

Если вы преобразуете маленькое отрицательное число в без знака, результатом является большое положительное число. Большое положительное число может создать уязвимости системы обеспечения безопасности. Например, если вы используете значение без знака в:

  • Стандартные программы емкости памяти — причины, выделяющие проблемы памяти.

  • Стандартные программы обработки строк — вызывают переполнение буфера.

  • Контуры цикла — вызывают бесконечные циклы.

Фиксация

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

Примеры

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

#include <stdlib.h>
#include <string.h>

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

void bug_taintedsignchange(int size) {
    char str[SIZE128] = "";
    if (size<SIZE128) {
        memset(str, 'c', size); 
    }
}

В этом примере, char буфер создается и заполнил использование memset. Аргумент размера к memset входной параметр к функции.

Вызов memset неявно преобразует size к беззнаковому целому. Если size большое отрицательное число, абсолютное значение могло быть слишком большим, чтобы представлять как целое число, вызвав переполнение буфера.

Коррекция — контрольное число size

Одна возможная коррекция должна проверять если size в допустимой области значений. Эта коррекция проверяет если size больше нуля и меньше, чем buffer size прежде, чем вызвать memset.

#include <stdlib.h>
#include <string.h>

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

void corrected_taintedsignchange(int size) {
    char str[SIZE128] = "";
    if (size>0 && size<SIZE128) {
        memset(str, 'c', size);  
    }
}

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

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TAINTED_SIGN_CHANGE
Удар: носитель
ID CWE: 128, 131, 192, 194, 195

Введенный в R2015b