exponenta event banner

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

Конфиденциальные данные не очищены или не освобождены подпрограммой памяти

Описание

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

Риск

Если зона памяти перераспределена, злоумышленник может проверить конфиденциальные данные в старой зоне памяти.

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

Перед вызовом free, очистить конфиденциальные данные с помощью memset или SecureZeroMemory.

Примеры

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

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

void sensitiveheapnotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char* buf = (char*) malloc(1024);
    getpwnam_r(my_user, &pwd, buf, bufsize, &result);
    free(buf);
}

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

Исправление - обнуление данных

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

#include <unistd.h>
#include <stdlib.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 sensitiveheapnotcleared(const char * my_user) {
    struct passwd* result, pwd;
    long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    char* buf = (char*) malloc(1024);

    if (buf) {
        getpwnam_r(my_user, &pwd, buf, bufsize, &result);
        memset(buf, 0, (size_t)1024);
        isNull(buf);
        free(buf); 
    }
}

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

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