メインコンテンツ

ハッシュ アルゴリズムがありません

EVP ルーチン内のコンテキストがハッシュ アルゴリズムなしで初期化されている

説明

この欠陥は、以下の EVP ルーチンでメッセージ ダイジェスト コンテキストを使用したが、ハッシュ アルゴリズムを指定せずにコンテキストを初期化した場合に発生します。

  • EVP_DigestFinal

  • EVP_DigestSignFinal

  • EVP_SignFinal

  • EVP_VerifyFinal

リスク

アルゴリズムなしで初期化されたメッセージ ダイジェスト コンテキストを使用してハッシュ演算を実行すると、ランタイム エラーが発生する可能性があります。ハッシュ演算に成功したとしても、得られたダイジェストは安全ではありません。

修正方法

EVP ルーチンで使用するメッセージ ダイジェスト コンテキストを初期化するときに、ハッシュ アルゴリズムを指定します。

すべて展開する


#include <openssl/evp.h>

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    EVP_VerifyInit(&ctx, EVP_sha256());
    EVP_MD_CTX_cleanup(&ctx);
    EVP_VerifyUpdate(&ctx, src, len);
}

この例では、コンテキスト ctx が安全なハッシュ アルゴリズム SHA-256 を使用して初期化されています。しかし、ctx のクリーンアップは、EVP_VerifyUpdate によって使用される前に実行されています。ctx のクリーンアップにより、そのリソースは解放され、ハッシュ アルゴリズムなしで再初期化が行われます。EVP_VerifyUpdate のハッシュ演算により、ランタイム エラーが発生する可能性があります。

修正 — コンテキストのクリーンアップは、そのコンテキストが不要になった後にだけ実行

1 つの修正方法として、コンテキストのクリーンアップは、そのコンテキストが不要になった後にだけ実行します。


#include <openssl/evp.h>

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    EVP_VerifyInit(&ctx, EVP_sha256());
    EVP_VerifyUpdate(&ctx, src, len);
    EVP_MD_CTX_cleanup(&ctx);
}

結果情報

グループ: 暗号化
言語: C | C++
既定値: オフ
コマンド ライン構文: CRYPTO_MD_NO_ALGORITHM
影響度: Medium

バージョン履歴

R2019b で導入