CVE-2026-9265CVE-2026-9265是存在于Perl的Crypt::OpenSSL::PKCS12模块中的一个高危堆缓冲区越界读取漏洞,影响1.96版本之前的所有版本。该漏洞位于print_attribute()函数处理UTF8STRING类型的ASN.1属性值时。当模块解析PKCS#12文件中的ASN.1结构时,print_attribute()函数使用strncpy将UTF8STRING属性值复制到一个大小恰好等于其声明长度的堆缓冲区中,但未添加NUL终止符。由于缓冲区缺少终止符,下游调用者在对该缓冲区调用strlen()时会读取超出缓冲区边界的相邻堆内存数据。随后,读取到的膨胀长度被传递给newSVpvn()函数,导致攻击者可控的相邻堆字节被复制到Perl标量中。该漏洞的CVSS评分为9.1,属于严重级别,攻击者可以通过网络远程利用,无需认证和用户交互即可触发。成功利用该漏洞可能导致敏感堆内存数据泄露,包括可能包含密码、密钥或其他机密信息的相邻内存区域。同时,由于堆内存的异常读取,可能导致进程崩溃,造成可用性影响。该漏洞特别危险,因为它影响的是广泛用于处理PKCS#12证书和私钥文件的加密库,PKCS#12格式通常用于存储服务器证书、客户端证书和私钥,是PKI基础设施中的关键组件。
该漏洞的根本原因在于print_attribute()函数中对UTF8STRING类型ASN.1属性的不当处理。具体技术细节如下:
1. **缓冲区分配缺陷**:当解析PKCS#12文件中的ASN.1属性时,如果属性类型为UTF8STRING,函数会根据属性的声明长度分配一个精确大小的堆缓冲区。
2. **缺少NUL终止符**:使用strncpy()将属性值复制到缓冲区后,由于strncpy在源字符串长度等于目标缓冲区大小时不会自动添加NUL终止符,导致缓冲区末尾缺少终止符。
3. **strlen越界读取**:下游调用者在处理该缓冲区时调用strlen()函数来确定字符串的实际长度。由于缺少NUL终止符,strlen()会继续读取缓冲区之后的相邻堆内存,直到遇到一个NUL字节为止,从而返回一个膨胀的长度值。
4. **数据泄露**:该膨胀的长度值随后被传递给newSVpvn()函数,该函数会按照strlen返回的长度从堆中复制数据到Perl标量中。这意味着攻击者可以通过精心构造PKCS#12文件,控制缓冲区在堆中的布局,使得相邻内存区域包含攻击者感兴趣的数据。
5. **利用条件**:攻击者只需提供一个恶意构造的PKCS#12文件,当目标系统使用存在漏洞的Crypt::OpenSSL::PKCS12模块解析该文件时,即可触发漏洞。由于PKCS#12文件通常通过电子邮件、网络下载或其他网络传输方式分发,攻击者可以通过网络远程实施攻击。