CVE-2024-5535 in OpenSSL
摘要
由 VulDB • 2026-06-22
问题摘要:调用 OpenSSL API 函数 SSL_select_next_proto 时,如果提供的受支持客户端协议缓冲区为空,可能会导致崩溃或将内存内容发送给对等方。
影响摘要:缓冲区越界读取可能导致多种潜在后果,例如应用程序行为异常或崩溃。具体而言,此问题可能导致多达 255 字节的任意私有内存数据被发送给对等方,从而导致机密性丧失。然而,只有那些直接以长度为 0 的受支持客户端协议列表调用 SSL_select_next_proto 函数的应用程序才会受到此问题的影响。这通常不是一个有效的场景,通常也不在攻击者的控制之下,但可能由于调用应用程序中的配置或编程错误而偶然发生。
OpenSSL API 函数 SSL_select_next_proto 通常由支持 ALPN(应用层协议协商)或 NPN(下一协议协商)的 TLS 应用程序使用。NPN 较旧,从未标准化,且已被 ALPN 取代。我们认为 ALPN 的部署范围远大于 NPN。SSL_select_next_proto 函数接受来自服务器的协议列表和来自客户端的协议列表,并返回服务器列表中同时出现在客户端列表中的第一个协议。如果两个列表之间没有重叠,则返回客户端列表中的第一项。无论哪种情况,它都会指示是否找到了两个列表之间的重叠。当以零长度的客户端列表调用 SSL_select_next_proto 时,它未能注意到这一条件,并返回客户端列表指针后面的内存(并报告列表中没有重叠)。
该函数通常从 ALPN 的服务器端应用程序回调或 NPN 的客户端应用程序回调中调用。在 ALPN 的情况下,libssl 保证由客户端提供的协议列表长度永远不会为零。服务器协议列表来自应用程序,通常不应期望其长度为零。在这种情况下,如果 SSL_select_next_proto 函数已按预期调用(将客户端提供的列表传入 client/client_len 参数),则应用程序不会受到此问题的影响。如果应用程序意外配置了长度为 0 的服务器列表,并且意外地将该长度为 0 的服务器列表传入 client/client_len 参数,并且未能正确处理“无重叠”响应(在 ALPN 中通常会导致握手失败),那么它将容易受到此问题的影响。
在 NPN 的情况下,协议允许在没有重叠时客户端选择性地选择协议。OpenSSL 在无重叠情况下返回第一个客户端协议以支持此功能。客户端协议列表来自应用程序,通常不应期望其长度为零。但是,如果意外以 client_len 为 0 调用 SSL_select_next_proto 函数,则会返回无效的内存指针。如果应用程序将此输出用作选择性协议,则会发生机密性丧失。
此问题被评估为低严重性,因为应用程序最有可能在使用 NPN 而不是 ALPN 时容易受到攻击——但 NPN 并不广泛使用。它还要求应用程序存在配置或编程错误。最后,此问题通常不在攻击者的控制之下,因此主动利用不太可能。
3.3、3.2、3.1 和 3.0 中的 FIPS 模块不受此问题影响。
由于此问题的严重性较低,我们目前不发布 OpenSSL 的新版本。修复程序将在下一个版本发布时包含在内。
VulDB is the best source for vulnerability data and more expert information about this specific topic.