メインコンテンツ

TLS/SSL 接続メソッドの設定が正しくありません

プログラムが接続メソッドによって設定された役割と一致しない関数を呼び出す

説明

この欠陥は、SSL コンテキスト用に指定された接続メソッドによって設定された役割と一致しない関数を呼び出した場合に発生します。

クライアント エンティティとサーバー エンティティ間の TLS/SSL 接続の処理中に呼び出す関数は、エンティティの役割によって異なります。たとえば、サーバーとクライアント間の接続はハンドシェイクで開始されます。常に、クライアントがハンドシェイクを開始します。サーバー エンティティで SSL_accept を使用して、クライアントがハンドシェイクを開始するまで待機します。

通常は、SSL コンテキストの開始時に接続メソッドを設定します。このメソッドがエンティティの役割を指定します。

チェッカーは、SSL コンテキスト用に指定された接続メソッドと一致しない関数の使用にフラグを設定します。SSL コンテキスト用に指定された接続メソッドを確認するには、[結果の詳細] ペインで [イベント] 列を参照してください。

リスク

TLS/SSL 接続メソッドを誤って設定すると、接続の処理に使用する関数がメソッドで指定された役割と一致しなくなります。たとえば、SSL_connect がサーバーとのハンドシェイクを開始するまで待機するのではなく、クライアント エンティティで SSL_accept を使用して、クライアントがハンドシェイクを開始するまで待機する場合です。

修正方法

接続の処理に TLS/SSL 接続メソッドと一致する関数が使用されていることを確認してください。

すべて展開する

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>

#define fatal_error() exit(-1)

const SSL_METHOD*  set_method()
{
    return SSLv23_client_method();
}

void set_method_1(SSL* ssl)
{
    SSL_set_connect_state(ssl);
}
void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;
    const SSL_METHOD* method = set_method();
    ctx = SSL_CTX_new(method);
    ssl = SSL_new(ctx);
    set_method_1(ssl);
    ret = SSL_accept(ssl);
    if (ret <= 0) fatal_error();
}

この例では、SSL コンテキスト ctx がクライアント役割を使用して初期化されます。SSL 構造体も set_method_1 に対する呼び出しを介して明示的にクライアント役割に設定されます。サーバーとの接続を確立するには、クライアントがサーバーとのハンドシェイクを開始する必要があります。代わりに、SSL_accept は、あるクライアントが、別のクライアントがハンドシェイクを開始するまで待機するようにします。

修正 — SSL_connect を使用してサーバーとのハンドシェイクを開始する

1 つの修正方法として、SSL_connect を使用してサーバーとの TLS/SSL ハンドシェイクを開始します。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>

#define fatal_error() exit(-1)

const SSL_METHOD*  set_method()
{
    return SSLv23_client_method();
}

void set_method_1(SSL* ssl)
{
    SSL_set_connect_state(ssl);
}
void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;
    const SSL_METHOD* method = set_method();
    ctx = SSL_CTX_new(method);
    ssl = SSL_new(ctx);
    set_method_1(ssl);
    ret = SSL_connect(ssl);
    if (ret <= 0) fatal_error();
} 

結果情報

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

バージョン履歴

R2020a で導入