Returned value of a sensitive function not checked

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

Описание

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

  • Проигнорируйте возвращаемое значение.

  • Используйте выход или возвращаемое значение, не тестируя валидность возвращаемого значения.

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

Чувствительная функция является стандартной функцией, которая может столкнуться:

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

  • Измененные привилегии или полномочия

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

  • Неподдерживаемые функции несмотря на существующий 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