exponenta event banner

Отсутствует соль для операции хеширования

Хэшированные данные уязвимы для атаки радужного стола

Описание

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

  • EVP_DigestFinal

  • EVP_DigestSignUpdate

  • EVP_DigestVerifyUpdate

  • SHA*_Final семейство функций

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

EVP_MD_CTX ctx_global;

void foo(EVP_MD_CTX* ctx) {
//ctx passed as argument of func()
    EVP_DigestFinal(ctx, out_buf, &out_len); //no defect
}

void bar() {
// ctx_global declared outside of bar() 
    EVP_DigestFinal(&ctx_glob, out_buf, &out_len); //no defect
}

Риск

Хеширование тех же данных без соли приводит к тому же хешированному значению. Например, если вы хэшируете пароли пользователей и два пользователя имеют одинаковые пароли, хэшированные пароли идентичны. Затем хеширование уязвимо для предварительно вычисленных радужных атак.

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

Укажите соль при хэшировании данных.

Примеры

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

#include <openssl/evp.h>
#include <cstring>

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

В этом примере контекст ctx инициализируется алгоритмом безопасного хеширования SHA-256, затем EVP_DigestUpdate мешанины src в ctx. Поскольку EVP_DigestUpdate вызывается только один раз, соль не может быть предоставлена для повышения безопасности операции хеширования. Значение дайджеста, EVP_DigestFinal извлекаемые данные затем уязвимы для предварительно вычисленных радужных атак.

Коррекция - хеш-соль в контекст после хеширования исходных данных

Одной из возможных корректировок является хэш соли в контексте ctx после первой операции хеширования. Полученное значение дайджеста, EVP_DigestFinal извлечения более безопасны.

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <cstring>

#define BUFF_SIZE_32 32

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    const char* salt;

    RAND_bytes((unsigned char*)salt, BUFF_SIZE_32);
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestUpdate(&ctx, salt, BUFF_SIZE_32);
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_MD_NO_SALT
Воздействие: среднее
ИДЕНТИФИКАТОР CWE: 759
Представлен в R2019b