Испорченный операнд деления

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

Описание

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

Риск

  • Если числитель является минимальным возможным значением, и знаменателем является -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