メインコンテンツ

RSA アルゴリズムのブラインディングが見つかりません

復号化または署名検証で使用されるコンテキストがタイミング攻撃に対してブラインディングされていない

説明

この欠陥は、復号化または署名検証に RSA コンテキスト オブジェクトを使用する前に、そのオブジェクトのブラインディングを有効にしなかった場合に発生します。

たとえば、次の復号化のステップの前に、コンテキスト オブジェクト rsa でブラインディングを有効にしていません。

  ret = RSA_public_decrypt(in_len, in, out, rsa, RSA_PKCS1_PADDING)

リスク

ブラインディングなしでは、暗号化操作の完了にかかる時間とキー値が相関関係をもちます。攻撃者は、完了までの時間を計測することで RSA キーに関する情報を収集できます。ブラインディングによってこの相関関係を排除し、タイミング攻撃から復号化または検証操作を保護します。

修正方法

RSA 復号化または署名検証を実行する前に、ブラインディングを有効にします。

ret = RSA_blinding_on(rsa, NULL);

すべて展開する

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error();

  RSA_blinding_off(rsa);
  return RSA_private_decrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

この例では、コンテキスト オブジェクト rsa のブラインディングが無効にされています。このコンテキスト オブジェクトを使用した復号化はタイミング攻撃に対して脆弱な可能性があります。

修正 — 復号化前にブラインディングを有効化

1 つの修正方法として、復号化前にブラインディングを明示的に有効にします。ブラインディングが前もってまたは既定で有効化されている場合でも、明示的にブラインディングを有効にすることで、現在の復号化ステップのセキュリティが func の呼び出しに依存しないようにします。

#include <stddef.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;
int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error();

  ret = RSA_blinding_on(rsa, NULL);
  if (ret <= 0) fatal_error();
  return RSA_private_decrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

結果情報

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

バージョン履歴

R2018a で導入