メインコンテンツ

ハッシュ アルゴリズムがセキュリティで保護されていません

メッセージ ダイジェストの作成に使用されるコンテキストが脆弱なアルゴリズムに関連付けられている

説明

この欠陥は、特定の形式の攻撃に対して脆弱であると証明されている暗号化ハッシュ関数を使用した場合に発生します。

このチェッカーによりフラグが設定されるハッシュ関数には、SHA-0、SHA-1、MD4、MD5、RIPEMD-160 などがあります。チェッカーは、以下におけるこれらのハッシュ関数の使用を検出します。

  • EVP_DigestUpdateEVP_SignUpdate など、EVP API の関数。

  • SHA1_UpdateMD5_Update など、低レベル API の関数。

リスク

ハッシュ関数を使用して入力データからメッセージ ダイジェストを作成することで、データの整合性を確保します。このチェッカーによりフラグが設定されたハッシュ関数では、攻撃者が悪用するおそれのある既知の脆弱性のあるアルゴリズムが使用されています。攻撃がデータの整合性を含む可能性があります。

修正方法

より安全なハッシュ関数を使用します。たとえば、SHA-224、SHA-256、SHA-384、SHA-512 など、より最近の SHA 関数を使用します。

すべて展開する

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
unsigned int out_len;

void func(unsigned char *src, size_t len, EVP_PKEY* pkey){
  EVP_MD_CTX* ctx = EVP_MD_CTX_create();

  ret = EVP_SignInit_ex(ctx, EVP_md5(), NULL);
  if (ret != 1) fatal_error();

  ret = EVP_DigestUpdate(ctx,src,len);

  if (ret != 1) fatal_error();

  ret = EVP_SignFinal(ctx, out_buf, &out_len, pkey);
  if (ret != 1) fatal_error();
}

この例では、EVP_SignInit_ex での初期化中に、コンテキスト オブジェクトが脆弱なハッシュ関数 MD5 に関連付けられています。チェッカーは、EVP_DigestUpdate による更新ステップにおけるこのコンテキストの使用にフラグを設定します。

修正 - SHA-2 ファミリ関数を使用

1 つの修正方法として、SHA-256 など、SHA-2 ファミリのハッシュ関数を使用します。

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
unsigned int out_len;

void func(unsigned char *src, size_t len, EVP_PKEY* pkey){
  EVP_MD_CTX* ctx = EVP_MD_CTX_create();

  ret = EVP_SignInit_ex(ctx, EVP_sha256(), NULL); 
  if (ret != 1) fatal_error();

  ret = EVP_SignUpdate(ctx, src, len); 
  if (ret != 1) fatal_error();

  ret = EVP_SignFinal(ctx, out_buf, &out_len, pkey);
  if (ret != 1) fatal_error();
}

結果情報

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

バージョン履歴

R2018a で導入