Nonsecure SSL/TLS protocol

Контекст, используемый для обработки SSL/TLS-соединений, связан со слабым протоколом

Описание

Этот дефект возникает, когда вы не отключаете небезопасные протоколы в SSL_CTX или SSL контекстный объект перед использованием объекта для обработки SSL/TLS-соединений.

Например, вы отключаете протоколы SSL2.0 и TLS1.0, но забываете отключить SSL3.0 протокола, который также считается слабым.

/* Create and configure context */
ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_TLSv1);

/* Use context to handle connection */
ssl = SSL_new(ctx);
SSL_set_fd(ssl, NULL);
ret = SSL_connect(ssl);

Риск

Протоколы SSL2.0, SSL3.0 и TLS1.0 считаются слабыми в криптографическом сообществе. Использование одного из этих протоколов может подвергнуть ваши соединения атакам между протоколами. Атакующий может расшифровать RSA-шифротекст, не зная RSA-закрытого ключа.

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

Отключите небезопасные протоколы в объекте контекста, прежде чем использовать объект для обработки подключений.

/* Create and configure context */
ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);

Примеры

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

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>


#define fatal_error() exit(-1)

int ret;
int func(){
  SSL_CTX *ctx;
  SSL *ssl;

  SSL_library_init();

  /* context configuration */
  ctx = SSL_CTX_new(SSLv23_client_method()); 
  if (ctx==NULL) fatal_error();

  ret = SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM); 
  if (ret <= 0) fatal_error();

  ret = SSL_CTX_load_verify_locations(ctx, NULL, "ca/path"); 
  if (ret <= 0) fatal_error();

  /* Handle connection */
  ssl = SSL_new(ctx);
  if (ssl==NULL) fatal_error();
  SSL_set_fd(ssl, NULL);

  return SSL_connect(ssl); 
}

В этом примере протоколы SSL2.0, SSL3.0 и TLS1.0 не отключены в объекте контекста, прежде чем объект будет использоваться для нового соединения.

Коррекция - Отключение небезопасных протоколов

Отключите небезопасные протоколы перед использованием объектов для нового подключения. Используйте функцию SSL_CTX_set_options чтобы отключить протоколы SSL2.0, SSL3.0 и TLS1.0.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>


#define fatal_error() exit(-1)

int ret;
int func(){
  SSL_CTX *ctx;
  SSL *ssl;

  SSL_library_init();

  /* context configuration */
  ctx = SSL_CTX_new(SSLv23_client_method()); 
  if (ctx==NULL) fatal_error();

  SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1);

  ret = SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM); 
  if (ret <= 0) fatal_error();

  ret = SSL_CTX_load_verify_locations(ctx, NULL, "ca/path"); 
  if (ret <= 0) fatal_error();

  /* Handle connection */
  ssl = SSL_new(ctx);
  if (ssl==NULL) fatal_error();
  SSL_set_fd(ssl, NULL);

  return SSL_connect(ssl); 
}

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

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