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
Удар: Средняя
ID CWE: 573
Введенный в R2020a