Tainted division operand

Операнды операции деления (/) произойдите из небезопасного источника

Описание

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

Риск

  • Если числитель является минимальным возможным значением, и знаменателем является -1, ваша операция деления переполняется, потому что результат не может быть представлен текущим переменным размером.

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

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

Фиксация

Прежде, чем выполнить деление, подтвердите значения операндов. Проверяйте на знаменатели 0 или -1, и числители минимального целочисленного значения.

Примеры

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

extern void print_int(int);

int taintedintdivision(int usernum, int userden) {
    int r =  usernum/userden; 
    print_int(r);
    return r;
}

Эта функция, взятая в качестве примера, делит две переменные аргумента, затем распечатывает и возвращает результат. Значения аргументов неизвестны и могут вызвать деление на нуль или целочисленное переполнение.

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

Одна возможная коррекция должна проверять значения числителя и знаменателя прежде, чем выполнить деление.

#include "limits.h"

extern void print_int(int);

int taintedintdivision(int usernum, int userden) {
    int r = 0;
    if (userden!=0 && !(usernum=INT_MIN && userden==-1)) {
        r = usernum/userden;
    }
    print_int(r);
    return r;
}

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

Группа: испорченные данные
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: TAINTED_INT_DIVISION
Удар: низко
ID CWE: 189, 190, 369

Введенный в R2015b