漏洞概述

2026 年 1 月 27 日,OpenSSL 官方发布了安全公告,披露了一个高危漏洞 CVE-2025-15467。该漏洞位于 OpenSSL 的 CMS(Cryptographic Message Syntax)实现中,当处理使用 AEAD(Authenticated Encryption with Associated Data)密码的 AuthEnvelopedData 结构时,存在栈缓冲区溢出问题。

漏洞严重性评级为 High,可导致拒绝服务(DoS),在特定条件下甚至可能实现远程代码执行(RCE)。

影响版本

受影响的 OpenSSL 版本:

  • OpenSSL 3.6.x
  • OpenSSL 3.5.x
  • OpenSSL 3.4.x
  • OpenSSL 3.3.x
  • OpenSSL 3.0.x

不受影响的版本

  • OpenSSL 1.1.1
  • OpenSSL 1.0.2

修复版本:

  • OpenSSL 3.6.1
  • OpenSSL 3.5.5
  • OpenSSL 3.4.4
  • OpenSSL 3.3.6
  • OpenSSL 3.0.19

技术分析

CMS 简介

CMS(Cryptographic Message Syntax,RFC 5652)是一种用于签名、加密消息的通用语法标准,广泛应用于:

  • S/MIME:安全电子邮件
  • PKCS#7:加密消息语法
  • 代码签名
  • 证书管理(如 CRL、证书请求)

CMS 支持多种加密数据格式,包括:

  • EnvelopedData:加密数据
  • SignedData:签名数据
  • AuthEnvelopedData:带认证的加密数据(AEAD)

AEAD 密码与 AES-GCM

AEAD(Authenticated Encryption with Associated Data)是一种同时提供机密性和完整性的加密模式。常见的 AEAD 密码包括:

  • AES-GCM:AES Galois/Counter Mode
  • AES-CCM:AES Counter with CBC-MAC
  • ChaCha20-Poly1305

AES-GCM 是目前最广泛使用的 AEAD 模式之一,它使用一个 Initialization Vector(IV) 作为加密初始化向量。IV 的长度通常是固定的(对于 GCM 为 12 字节),但可以由发送方指定。

漏洞根因

问题的核心在于:当 OpenSSL 解析 CMS AuthEnvelopedData 或 EnvelopedData 结构时,会从 ASN.1 编码的参数中提取 IV,并将 IV 复制到固定大小的栈缓冲区中。

关键问题:OpenSSL 在复制 IV 之前没有验证 IV 长度是否超过目标缓冲区的容量

1
2
3
4
// 简化示意(问题代码逻辑)
IV_LENGTH iv_len = get_iv_length_from_asn1(params);
char iv_buffer[12];  // 固定大小的栈缓冲区
memcpy(iv_buffer, iv_data, iv_len);  // 未检查 iv_len 是否超过 12 字节!

攻击者可以构造一个包含超长 IV 的恶意 CMS 消息,触发栈缓冲区溢出。由于溢出发生在认证/标签验证之前,攻击者甚至不需要持有有效的密钥材料即可触发漏洞。

利用条件与影响

  1. 触发条件:应用解析不受信任的 CMS 或 PKCS#7 内容,且使用 AEAD 密码(如 AES-GCM)
  2. 攻击向量:远程发送恶意构造的 CMS 消息(如 S/MIME 邮件)
  3. 利用影响
    • 拒绝服务(应用崩溃)
    • 潜在的远程代码执行(取决于平台缓解措施)

漏洞验证与检测

检查当前 OpenSSL 版本

可以使用以下命令检查 OpenSSL 版本:

1
openssl version

输出示例:

1
OpenSSL 3.0.13 19 Sep 2023 (Library: OpenSSL 3.0.13)

注意:某些系统可能同时安装了多个版本的 OpenSSL,需要检查所有相关二进制文件的版本。

检查软件依赖

如果你的应用是静态链接或动态链接 OpenSSL,可以使用以下命令检查:

1
2
3
4
5
# 动态链接检查
ldd /path/to/your/application | grep ssl

# 检查 libssl 版本
ls -la /usr/lib*/libssl.so.*

验证修复

升级 OpenSSL 后,验证版本是否在修复版本范围内:

1
openssl version -a

输出应包含类似以下信息:

1
OpenSSL 3.0.19 15 Jan 2026 (Library: OpenSSL 3.0.19)

修复方案

1. 升级 OpenSSL

最直接的修复方案是升级到官方发布的修复版本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Debian/Ubuntu
apt update && apt install openssl

# RHEL/CentOS/Fedora
dnf update openssl

# 或从源码编译
wget https://www.openssl.org/source/openssl-3.0.19.tar.gz
tar -xzf openssl-3.0.19.tar.gz
cd openssl-3.0.19
./config --prefix=/usr/local/openssl-3.0.19
make -j$(nproc)
make install

2. 临时缓解措施

如果无法立即升级,可以考虑以下临时缓解措施:

  • 限制解析不受信任的 CMS/PKCS#7 内容
  • 在网络层过滤异常的 CMS 消息
  • 监控应用日志中的异常崩溃

3. 检查第三方依赖

许多第三方应用会打包自己的 OpenSSL 副本,需要检查并更新这些依赖:

1
2
3
4
5
# 搜索系统中的 OpenSSL 库
find /usr -name "libssl*" -type f

# 检查应用是否使用系统 OpenSSL
ldconfig -p | grep ssl

总结

CVE-2025-15467 是一个严重的安全漏洞,位于 OpenSSL 处理 CMS 加密消息的逻辑中。由于:

  1. 影响范围广(OpenSSL 3.0-3.6 所有版本)
  2. 触发条件简单(无需认证即可触发)
  3. 潜在危害大(可能实现 RCE)

建议所有使用 OpenSSL 3.x 版本的用户尽快升级到修复版本,并检查所有依赖 OpenSSL 的第三方应用。


参考来源