Испорченный операнд по модулю

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

Описание

Испорченный операнд по модулю проверяет операнды операций % остатка. Средство поиска ошибки отмечает операции по модулю с помощью одного или нескольких испорченных операндов.

Риск

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

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

  • Если один из операндов отрицателен, результат операции сомнителен. Для C89 не стандартизирована операция по модулю, таким образом, результат отрицательных операндов задан реализацией.

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

Фиксация

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

Примеры

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

extern void print_int(int);

int taintedintmod(int userden) {
    int rem =  128%userden; 
    print_int(rem);
    return rem;
}

В этом примере функция выполняет операцию по модулю при помощи входного параметра. Аргумент не проверяется прежде, чем вычислить остаток для значений, которые могут разрушить программу, такой как 0 и-1.

Исправление — значения операнда проверки

Одно возможное исправление должно проверять значения операндов прежде, чем выполнить операцию по модулю. В этом исправленном примере продолжается операция по модулю, только если второй операнд больше, чем нуль.

extern void print_int(int);

int taintedintmod(int userden) {
    int rem = 0;
    if (userden > 0) { 
        rem = 128 % userden; 
    }
    print_int(rem);
    return rem;
}

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

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

Введенный в R2015b