TLS/SSL connection method set incorrectly

Программа вызывает функции, которые не совпадают с ролями, установленными методом соединения

Описание

Дефект возникает при вызове функций, не соответствующих роли, заданной методом соединения, заданным для контекста SSL.

Функции, которые вы вызываете при обработке соединения TLS/SSL между сущностями клиента и сервера, различны, в зависимости от роли сущности. Например, соединение между сервером и клиентом начинается с квитирования. Клиент всегда инициирует квитирование. Вы используете SSL_accept с серверной сущностью, чтобы подождать, пока клиент инициирует квитирование.

Как правило, метод подключения устанавливается при инициировании контекста SSL. Метод задает роль сущности.

Средство проверки помечает использование функций, не соответствующих методу подключения, заданному для контекста SSL. Смотрите столбец Event на панели Results Details, чтобы просмотреть метод подключения, заданный для контекста SSL.

Риск

Если неправильно задать метод соединения TLS/SSL, функции, используемые для обработки соединения, могут не совпадать с ролью, заданной методом. Например, вы используете SSL_accept с клиентской сущностью, чтобы дождаться, когда клиент инициирует квитирование вместо 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_accept(ssl);
    if (ret <= 0) fatal_error();
}

В этом примере контекст SSL ctx инициализируется с ролью клиента. Структура SSL также явно устанавливается на роль клиента посредством вызова set_method_1. Чтобы установить соединение с сервером, клиент должен инициировать квитирование с сервером. Вместо этого SSL_accept приводит к тому, что клиент ожидает инициирования квитирования другим клиентом.

Коррекция - Использование SSL_connect Инициирование квитирования с сервером

Одной из возможных коррекций является использование 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++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_SSL_BAD_ROLE
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 573
Введенный в R2020a