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
Удар: носитель
ID CWE: 310, 327, 522, 693
Введенный в R2018a