メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

SSL/TLS プロトコルがセキュリティで保護されていません

SSL/TLS 接続の処理に使用されるコンテキストが脆弱なプロトコルに関連付けられている

説明

この欠陥は、SSL/TLS 接続を処理する目的で SSL_CTX または SSL コンテキスト オブジェクトを使用する前に、セキュリティで保護されていないプロトコルをそのオブジェクトで無効にしなかった場合に発生します。

たとえば、プロトコル SSL2.0 および TLS1.0 は無効にしているものの、同じく脆弱と見なされているプロトコル SSL3.0 は無効にするのを忘れているとします。

/* Create and configure context */
ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_TLSv1);

/* Use context to handle connection */
ssl = SSL_new(ctx);
SSL_set_fd(ssl, NULL);
ret = SSL_connect(ssl);

リスク

暗号化コミュニティでは、プロトコル SSL2.0、SSL3.0、および TLS1.0 は脆弱と見なされています。これらのいずれかのプロトコルを使用すると、接続がクロスプロトコル攻撃にさらされる可能性があります。攻撃者は、RSA 秘密鍵がわからなくても RSA 暗号文を復号化できます。

修正方法

コンテキスト オブジェクトを使用して接続を処理する前に、セキュリティ保護されていないプロトコルをそのオブジェクトで無効にします。

/* Create and configure context */
ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);

すべて展開する

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>


#define fatal_error() exit(-1)

int ret;
int func(){
  SSL_CTX *ctx;
  SSL *ssl;

  SSL_library_init();

  /* context configuration */
  ctx = SSL_CTX_new(SSLv23_client_method()); 
  if (ctx==NULL) fatal_error();

  ret = SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM); 
  if (ret <= 0) fatal_error();

  ret = SSL_CTX_load_verify_locations(ctx, NULL, "ca/path"); 
  if (ret <= 0) fatal_error();

  /* Handle connection */
  ssl = SSL_new(ctx);
  if (ssl==NULL) fatal_error();
  SSL_set_fd(ssl, NULL);

  return SSL_connect(ssl); 
}

この例では、新しい接続にコンテキスト オブジェクトが使用される前に、そのオブジェクトでプロトコル SSL2.0、SSL3.0、および TLS1.0 が無効にされていません。

修正 — セキュリティ保護されていないプロトコルを無効化

新しい接続にオブジェクトを使用する前にセキュリティ保護されていないプロトコルを無効にします。関数 SSL_CTX_set_options を使用してプロトコル SSL2.0、SSL3.0、および TLS1.0 を無効にします。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>


#define fatal_error() exit(-1)

int ret;
int func(){
  SSL_CTX *ctx;
  SSL *ssl;

  SSL_library_init();

  /* context configuration */
  ctx = SSL_CTX_new(SSLv23_client_method()); 
  if (ctx==NULL) fatal_error();

  SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);

  ret = SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM); 
  if (ret <= 0) fatal_error();

  ret = SSL_CTX_load_verify_locations(ctx, NULL, "ca/path"); 
  if (ret <= 0) fatal_error();

  /* Handle connection */
  ssl = SSL_new(ctx);
  if (ssl==NULL) fatal_error();
  SSL_set_fd(ssl, NULL);

  return SSL_connect(ssl); 
}

結果情報

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

バージョン履歴

R2018a で導入