exponenta event banner

Преобразование изменения запятнанного знака

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

Описание

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

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

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

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

Коррекция - контрольное значение size

Одной из возможных корректировок является проверка size находится внутри допустимого диапазона. Эта коррекция проверяет, 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++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_SIGN_CHANGE
Воздействие: среднее
CWE ID: 128, 131, 192, 194, 195
Представлен в R2015b