Server certificate common name not checked

Атакующий может использовать допустимый сертификат, чтобы явиться олицетворением хоста, которому доверяют,

Описание

Дефект происходит, когда вы не проверяете общее название, обеспеченное в сертификат сервера против доменного имени сервера.

Как правило, когда клиент связывает с сервером, сервер отправляет цифровой сертификат клиенту, который идентифицирует сервер как доверяемую сущность. Сертификат содержит информацию о сервере, включая общее название сервера. Общее название совпадает с доменным именем сервера, которое сертификат идентифицирует как доверяемая сущность.

Средство проверки не повышает дефекта если:

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

  • Вы объявляете контекст SSL вне осциллографа функции, обрабатывающей связь.

Риск

Злонамеренный атакующий может использовать допустимый сертификат, чтобы явиться олицетворением доверяемого хоста, приводящего к клиенту, взаимодействующему с недоверяемым сервером.

Фиксация

Используйте одну из этих функций, чтобы задать доменное имя сервера, которое программа проверяет по общему названию, обеспеченному в сертификате сервера.

  • SSL_set_tlsext_host_name

  • SSL_set1_host

  • SSL_add1_host

Примеры

развернуть все


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

#define fatal_error() exit(-1)

void check_certificate(SSL_CTX* ctx, SSL* ssl)
{
    /* Check for Client authentication error */
    if (!SSL_get_peer_certificate(ssl)) {
        printf("SSL Client Authentication error\n");
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        exit(0);
    }
    /* Check for Client authentication error */
    if (SSL_get_verify_result(ssl) != X509_V_OK) {
        printf("SSL Client Authentication error\n");
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        exit(0);
    }
}

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

    /* creation context for the SSL protocol */
    ctx = SSL_CTX_new(SSLv23_client_method());
    if (ctx == NULL) fatal_error();

    /* Handle connection */
    ssl = SSL_new(ctx);
    SSL_set_connect_state(ssl);
    check_certificate(ctx, ssl);
    ret = SSL_connect(ssl);
    if (ret <= 0) fatal_error();

    SSL_free(ssl);
    SSL_CTX_free(ctx);
}

В этом примере структура SSL инициируется с клиентским методом связи. Клиент подтверждает сертификат сервера с check_certificate. Однако клиент не проверяет, что общее название сертификата совпадает с доменным именем сервера. Атакующий может использовать допустимый сертификат, чтобы явиться олицетворением доверяемого сервера.

Коррекция — задает доменное имя, чтобы проверять по общему названию сертификата

Одна возможная коррекция должна использовать SSL_set1_host задавать ожидаемое доменное имя, которое программа проверяет по общему названию сертификата сервера.


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

#define fatal_error() exit(-1)

void check_certificate(SSL_CTX* ctx, SSL* ssl)
{
    /* Check for Client authentication error */
    if (!SSL_get_peer_certificate(ssl)) {
        printf("SSL Client Authentication error\n");
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        exit(0);
    }
    /* Check for Client authentication error */
    if (SSL_get_verify_result(ssl) != X509_V_OK) {
        printf("SSL Client Authentication error\n");
        SSL_free(ssl);
        SSL_CTX_free(ctx);
        exit(0);
    }
}

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

    /* creation context for the SSL protocol */
    ctx = SSL_CTX_new(SSLv23_client_method());
    if (ctx == NULL) fatal_error();

    /* Handle connection */
    ssl = SSL_new(ctx);
    SSL_set_connect_state(ssl);
    check_certificate(ctx, ssl);
    ret = SSL_set1_host(ssl, "www.mysite.com");
    if (ret <= 0) fatal_error();
    ret = SSL_connect(ssl);
    if (ret <= 0) fatal_error();

    SSL_free(ssl);
    SSL_CTX_free(ctx);
}
 

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: CRYPTO_SSL_HOSTNAME_NOT_CHECKED
Удар: Средняя
ID CWE: 297
Введенный в R2020a