exponenta event banner

Неправильно задан метод подключения TLS/SSL

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

Описание

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

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

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

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