メインコンテンツ

暗号化、復号化または署名操作用のデータが見つかりません

公開鍵暗号化操作用に指定されたデータが NULL であるか、データの長さがゼロである

説明

この欠陥は、暗号化、復号化、署名、または認証操作用に指定されたデータが NULL であるか、データの長さがゼロである場合に発生します。

たとえば、次の復号化操作で意図せずに in に NULL 値を与えたり、in_len にゼロ値を与えるとします。

ret = EVP_PKEY_decrypt(ctx, out, &out_len, in, in_len);
または、次の検証操作で md または sig に NULL 値を与えたり、md_len または sig_len にゼロ値を与えるとします。
ret = EVP_PKEY_verify(ctx, md, mdlen, sig, siglen);

リスク

NULL データまたはゼロの長さでは操作が発生しません。冗長な操作は多くの場合、コーディング エラーを示します。

修正方法

暗号化、復号化、または署名操作の配置をチェックします。操作の発生を意図している場合、与えられるデータが非 NULL であることを確認します。データの長さを非ゼロ値に設定します。

すべて展開する

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY_CTX * ctx){
  if (ctx == NULL) fatal_error(); 
  unsigned char* sig = (unsigned char*) "0123456789";
  unsigned char* md = (unsigned char*) "0123456789";

  ret = EVP_PKEY_verify_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256());
  if (ret <= 0) fatal_error();
  return EVP_PKEY_verify(ctx, sig, 0, md, 0); 
}

この例では、データの長さ (EVP_PKEY_verify の 3 番目と 5 番目の引数) がゼロです。この操作は失敗します。

修正 — ゼロ以外のデータの長さを使用

1 つの修正方法として、署名と、署名されると考えられるデータにゼロ以外の長さを使用します。

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY_CTX * ctx){
  if (ctx == NULL) fatal_error(); 
  unsigned char* sig = (unsigned char*) "0123456789";
  unsigned char* md = (unsigned char*) "0123456789";

  ret = EVP_PKEY_verify_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256());
  if (ret <= 0) fatal_error();
  return EVP_PKEY_verify(ctx, sig, 10, md, 10); 
}

結果情報

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

バージョン履歴

R2018a で導入