Испорченное преобразование изменения знака

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

Описание

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

Например, функции, которые используют 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