TLS/SSL connection method not set

Программа не может определить, вызывать ли клиентские или серверные стандартные программы

Описание

Дефект возникает, когда вы вызываете одну из этих функций, не устанавливая явным образом метод соединения контекста TLS/SSL.

  • SSL_read

  • SSL_write

  • SSL_do_handshake

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

Шашка не поднимает дефект, если:

  • Вы используете SSL_connect (клиент) и SSL_accept (серверные) функции. Эти функции автоматически устанавливают правильные стандартные программы квитирования.

  • Контекст SSL передается в качестве аргумента в функцию, которая вызывает SSL_new.

  • Контекст SSL объявляется вне возможностей функции, обрабатывающей соединение.

Риск

Вы не можете начать квитирование, если механизм SSL не знает, какие стандартные программы метода соединения следует вызвать.

Зафиксировать

  • Для процедур квитирования клиентов вызовите SSL_set_connect_state прежде чем начать рукопожатие.

  • Для процедур квитирования сервера вызовите SSL_set_accept_state прежде чем начать рукопожатие.

Примеры

расширить все

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

#define fatal_error() exit(-1)

int len;
unsigned char buf;
volatile int rd;

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

void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;
    const SSL_METHOD* method =  set_method();
    ctx = SSL_CTX_new(method);
    ssl = SSL_new(ctx);

    switch (rd) {
    case 1:
        ret = SSL_read(ssl, (void*)buf, len);
        if (ret <= 0) fatal_error();
        break;
    case 2:
        ret = SSL_do_handshake(ssl);
        if (ret <= 0) fatal_error();
        break;
    default:
        ret = SSL_write(ssl, (void*)buf, len);
        if (ret <= 0) fatal_error();
        break;
    }
}

В этом примере контекст SSL ctx сгенерирован с методом подключения к серверу SSLv23_server_method. Однако метод соединения не установлен явным образом для структуры SSL ssl перед попыткой чтения из соединения инициируйте квитирование или запись в соединение.

Коррекция - явная установка соединения с сервером

Одной из возможных коррекций является вызов SSL_set_accept_state установка роли сервера для структуры SSL ssl прежде чем начать рукопожатие.

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

#define fatal_error() exit(-1)

int len;
unsigned char buf;
volatile int rd;

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

void func()
{
    int ret;
    SSL_CTX* ctx;
    SSL* ssl;
    const SSL_METHOD* method =  set_method();
    ctx = SSL_CTX_new(method);
    ssl = SSL_new(ctx);
	SSL_set_accept_state(ssl);
	

    switch (rd) {
    case 1:
        ret = SSL_read(ssl, (void*)buf, len);
        if (ret <= 0) fatal_error();
        break;
    case 2:
        ret = SSL_do_handshake(ssl);
        if (ret <= 0) fatal_error();
        break;
    default:
        ret = SSL_write(ssl, (void*)buf, len);
        if (ret <= 0) fatal_error();
        break;
    }
} 

Информация о результатах

Группа: Криптография
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_SSL_NO_ROLE
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 304, 322, 573
Введенный в R2020a