Чувствительная память кучи, не очищенная перед релизом

Уязвимые данные, не очищенные или выпущенные стандартной программой памяти

Описание

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

Риск

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

Фиксация

Прежде, чем вызвать 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: SENSITIVE_HEAP_NOT_CLEARED
Влияние: носитель
ID CWE: 244, 312, 316

Введенный в R2015b