Tainted sign change conversion

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

Описание

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

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

bcmp
memcpy
memmove
strncmp
strncpy
calloc
malloc
memalign
Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

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

  • Стандартные программы размера памяти - вызывают проблемы с выделением памяти.

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

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

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

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

Примеры

расширить все

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

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

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

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

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

Коррекция - Проверяйте значение size

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

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

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

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

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

Группа: испорченные данные
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: TAINTED_SIGN_CHANGE
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 128, 131, 192, 194, 195
Введенный в R2015b