exponenta event banner

Неочищенные конфиденциальные данные в стеке

Переменная в стеке не очищена и содержит конфиденциальные данные

Описание

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

Риск

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

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

Перед выходом из функции или программы удалите зоны памяти, содержащие конфиденциальные данные, с помощью memset или SecureZeroMemory.

Примеры

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

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

void bug_sensitivestacknotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char buf[1024] = "";
    getpwnam_r(my_user, &pwd, buf, bufsize, &result);
} 

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

Коррекция - очистка памяти

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

#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <pwd.h>
#include <assert.h>

#define isNull(arr) for(int i=0;i<(sizeof(arr)/sizeof(arr[0]));i++) assert(arr[i]==0)

void corrected_sensitivestacknotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char buf[1024] = "";
    getpwnam_r(my_user, &pwd, buf, bufsize, &result);
    memset(buf, 0, (size_t)1024);
    isNull(buf);
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: SENSITIVE_STACK_NOT_CLEARED
Воздействие: среднее
CWE ID: 226, 312, 316
Представлен в R2015b