メインコンテンツ

更新操作のハッシュ後に最終ステップがありません

ハッシュが不完全かセキュリティで保護されていない

説明

この欠陥は、メッセージ ダイジェスト コンテキストに対する更新操作後に、コンテキストをクリーンアップまたは再初期化する前に最終ステップを実行しなかった場合に発生します。

メッセージ ダイジェスト関数を使用する場合は、通常、メッセージ ダイジェスト コンテキストを初期化し、1 回以上の更新ステップを実行してコンテキストにデータを追加します。その後で、最終ステップとして、コンテキスト内のデータの署名、検証、または取得を実行します。

リスク

最終ステップの欠落は、ハッシュが不完全であるまたはセキュリティで保護されていないことを示します。

修正方法

コンテキストをクリーンアップまたは再初期化する前に、メッセージ ダイジェスト コンテキストからの日付に対する署名、検証、または取得を実行するための最終ステップを実行します。

すべて展開する


#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 が初期化され、データで更新されます。その後で、コンテキストが最終ステップで検証されずにクリーンアップされます。通常は、過去に署名されたメッセージを検証するための検証コンテキストを作成します。最終ステップを実行しないと、メッセージ上の署名を検証できません。

修正 — コンテキストのクリーンアップの前に最終ステップを実行する

1 つの修正方法として、コンテキストをクリーンアップする前に、検証コンテキストの署名を検証するための最終ステップを実行します。


#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
影響度: Medium

バージョン履歴

R2020a で導入