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