exponenta event banner

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

Хэш неполный или небезопасный

Описание

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

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

Риск

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

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

Выполните последний шаг для подписания, проверки или извлечения даты из контекста дайджеста сообщений перед очисткой или повторной инициализацией контекста.

Примеры

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


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


void func(unsigned char* src, int len, EVP_PKEY* pkey)
{
    int ret;

    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    ret = EVP_DigestVerifyInit(&ctx, NULL, EVP_sha256(), NULL, pkey);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyUpdate(&ctx, src, len);
    if (ret != 1) handle_error();

    EVP_MD_CTX_cleanup(&ctx);
}

В этом примере контекст проверки ctx инициализируется и обновляется данными. Затем контекст очищается без проверки на заключительном этапе. Обычно создается контекст проверки для проверки ранее подписанного сообщения. Без последнего шага подпись на сообщении не может быть проверена.

Исправление - Выполнить заключительный шаг перед очисткой контекста

Одной из возможных корректировок является выполнение последнего шага для проверки подписи контекста проверки перед очисткой контекста.


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

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void handle_error()
{
    exit(-1);
}


void func(unsigned char* src, int len, EVP_PKEY* pkey)
{
    int ret;

    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    ret = EVP_DigestVerifyInit(&ctx, NULL, EVP_sha256(), NULL, pkey);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyUpdate(&ctx, src, len);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyFinal(&ctx, out_buf, out_len);
    if (ret != 1) handle_error();

    EVP_MD_CTX_cleanup(&ctx);
} 

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

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