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 не игнорирует это Возвращаемое значение чувствительной функции не проверяемый дефект. Другая критическая функция, 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
Удар: высоко
ID CWE: 252, 253, 690, 754
Введенный в R2017b