Tainted modulo operand

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

Описание

Этот дефект возникает, когда один или оба целочисленных операнда за оставшуюся операцию (%) происходит из небезопасных источников. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

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

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

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

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

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

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

Примеры

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

#include <stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem =  128%userden; 
    print_int(rem);
    return rem;
}

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

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

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

#include<stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem = 0;
    if (userden > 0 ) { 
        rem = 128 % userden; 
    }
    print_int(rem);
    return rem;
}

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

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