Returned value of a sensitive function not checked

Чувствительные функции, вызываемые без проверки на неожиданные возвращаемые значения и ошибки

Описание

Этот дефект возникает, когда вы вызываете чувствительные стандартные функции, которые возвращают информацию о возможных ошибках, и вы делаете одно из следующего:

  • Игнорируйте возврат значение.

    Вы просто не присваиваете возврату значение переменной или явным образом приводите возврат значение к void.

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

Проверка рассматривает функцию как чувствительную, если вызов функции подвержен отказу по таким причинам, как:

  • Исчерпанные системные ресурсы (для примера, при распределении ресурсов).

  • Изменены привилегии или разрешения.

  • Испорченные источники при чтении, записи или преобразовании данных из внешних источников.

  • Неподдерживаемые функции, несмотря на существующий API.

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

Некоторые из этих функций могут выполнять критические задачи, такие как:

  • Установите привилегии (для примера, setuid)

  • Создайте тюрьму (для примера, chroot)

  • Создайте процесс (для примера, fork)

  • Создайте поток (для примера, pthread_create)

  • Блокируйте или разблокируйте мьютекс (для примера, pthread_mutex_lock)

  • Блокируйте или разблокируйте сегменты памяти (для примера, mlock)

Риск

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

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

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

Для чувствительных функций, которые не являются критическими, можно явным образом игнорировать возврат значение, приведя функцию к void. Polyspace® не поднимает этот дефект для чувствительных функций, приведенных к пустоте. Это разрешение не принято для критически важных функций, потому что они выполняют более уязвимые задачи.

Примеры

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

#include <pthread.h>

void initialize() {
    pthread_attr_t attr;

    pthread_attr_init(&attr); 
}

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

Коррекция - приведение функции к (void)

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

#include <pthread.h>

void initialize() {
    pthread_attr_t attr;

    (void)pthread_attr_init(&attr); 
}
Коррекция - значение возврата теста

Одной из возможных коррекций является проверка возвращаемого значения pthread_attr_init для проверки на наличие ошибок.

#include <pthread.h>
#include <stdlib.h>
#define fatal_error() abort()

void initialize() {
    pthread_attr_t attr;
    int result;

    result = pthread_attr_init(&attr);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }
}
#include <pthread.h>
extern void *start_routine(void *);

void returnnotchecked() {
    pthread_t thread_id;
    pthread_attr_t attr;
    void *res;

    (void)pthread_attr_init(&attr);
    (void)pthread_create(&thread_id, &attr, &start_routine, ((void *)0));
    pthread_join(thread_id,  &res); 
}

В этом примере вызываются две критические функции: pthread_create и pthread_join. Значение возврата pthread_create проигнорирован приведением к пустоте, но потому pthread_create является критической функцией (не только чувствительной функцией), Polyspace не игнорирует это значение Return чувствительной функции, не проверенной дефектом. Другая критическая функция, pthread_join, возвращает значение, которое игнорируется неявно. pthread_join использует возврат значение pthread_create, который не был проверен.

Коррекция - Тестируйте возвращаемое значение критических функций

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

#include <pthread.h>
#include <stdlib.h>
#define fatal_error() abort()

extern void *start_routine(void *);

void returnnotchecked() {
    pthread_t thread_id;
    pthread_attr_t attr;
    void *res;
    int result;

    (void)pthread_attr_init(&attr);
    result = pthread_create(&thread_id, &attr, &start_routine, NULL);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }

    result = pthread_join(thread_id,  &res);
    if (result != 0) {
        /* Handle error */
        fatal_error();
    }
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: RETURN_NOT_CHECKED
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 252, 253, 690, 754
Введенный в R2016b