系统极客一直在努力
专注操作系统及软件使用技能

OpenSSL 4.0 发布:原生支持 ECH,底层旧代码大规模清理

OpenSSL

知名密码学与 TLS 领域的核心库 OpenSSL 4.0.2 正式发布。这是 4.0 系列的第二个维护与安全更新,官方定义为安全补丁版本,已修复 CVE 的最高严重性为「中等」。本次没有新增特性,重点主要在 QUIC、CMS、CMP、DTLS 和 AEAD 加密路径的安全修复和行为收紧上。

OpenSSL 4.0.2 主要更新

QUIC 与 DTLS 内存安全修复

集中修复了多项可触发拒绝服务的网络协议缺陷:

  • QUIC 服务端:修复了处理INITIAL数据包时,可能触发双重释放的问题:此前通道创建失败可能破坏堆内存,导致服务进程终止。
  • 连接队列与 ACK 包管理:为 QUIC 服务端入站通道队列增加了约束,避免指向未知连接 ID 的大量INITIAL包持续堆积占用内存;修复了仅含 ACK 的数据包元数据长期滞留,可能耗尽连接内存的问题。
  • DTLS 缓冲逻辑:修复了握手期间接收未来 epoch 的 DTLS 记录时,缓存占用远高于记录本身大小的问题。攻击者只需要少量流量,就能对端点造成内存压力。

CMS、CMP 与 OCSP 处理加固

证书和消息处理链路也是本次修复的重点方向:

  • CMS 解密:修复了 CMS 密钥解包流程中的 8 字节堆缓冲区溢出漏洞。受害端在调用CMS_decrypt()解密特制消息时,可能发生堆损坏并触发拒绝服务。
  • CMP 服务端与客户端:修复了伪造protectionAlg参数导致的无效指针解引用问题,以及不可信 Sender DN 被当作格式字符串使用的缺陷:后者可能让恶意或被拦截的 CMP 端点触发客户端崩溃。
  • extraCerts 缓存:修复了 CMP 服务端长期复用同一个OSSL_CMP_CTX时,可能因恶意请求不断累积附加证书,导致的无限缓存增长问题。
  • OCSP 响应校验:修复了客户端启用 OCSP 响应校验后,恶意 TLS 服务端可通过空响应条目在每次握手中造成内存泄漏的问题。

AEAD 空密文验证行为修正

  • EVP_Cipher()单次调用路径下,ChaCha20-Poly1305AES-OCB解密空密文时,可能在未校验认证标签的情况下直接返回成功。若应用依赖该调用完成标签校验,就可能接受伪造消息。OpenSSL 4.0.2 已经修复该问题,并补全了 CCM 模式下 AEAD 空密文的认证标签校验逻辑。

TLS 1.3 会话票据与构建兼容性改进

  • 除了安全修复外,OpenSSL 4.0.2 还将 TLS 1.3 客户端处理新会话票据时的ticket_lifetime_hint上限限制为 7 天(604800 秒),对齐 RFC 8446 规范要求。
  • 构建兼容性方面,新版本新增了 LLVM 体系下 Intel icx编译器的汇编代码路径选择支持,并补充了OPENSSL_armcap(3)手册页。

OpenSSL 4.0.1 主要更新

CMS 与 PKCS#7 安全处理加固

  • 内存安全:修复了PKCS7_verify()中的堆使用后释放问题,以及 CMS 基于密码的解密路径可能出现的越界读取和空指针解引用。
  • 消息真实性:修复了 CMS AuthEnvelopedData处理逻辑可能接受伪造消息的问题,并补上了 AES-GCM-SIV 与 AES-SIV 在空消息场景下的标签处理错误。
  • 抗侧信道:修复了CMS_decrypt()PKCS7_decrypt()在处理多个RecipientInfo时,存在的 Bleichenbacher 预言机漏洞,避免攻击者通过返回错误的差异推测 RSA PKCS#1 v1.5 的解密信息。

QUIC、OCSP 与证书验证修复

在网络服务与证书验证路径上,OpenSSL 4.0.1 修了多处可能导致进程崩溃或资源耗尽的问题:

  • QUIC 侧,PATH_CHALLENGE处理器的无界内存增长、服务器处理初始数据包时的空指针解引用都已修复。
  • OCSP 侧,修复了装订响应检查中的双重释放,以及启用 OCSP 检查时,证书验证路径里的空指针解引用。
  • ASN.1 方面,多字节字符串转换触发的堆缓冲区溢出、内容解析时的堆缓冲区过读,以及X509_VERIFY_PARAM_set1_email()的潜在越界读取都补上了。
  • CMP rootCaKeyUpdate中因cert/issuer拼写错误导致的信任锚替换问题、FFC-DH 对端验证时直接使用攻击者提供的q参数的问题,都在本次的修复范围。

密码算法与 PKCS#12 行为修正

在算法实现上,4.0.1 修了两个问题:

  • 通过EVP_Cipher()路径调用 AES-OCB 时会忽略 IV。
  • 包含 PBMAC1 的 PKCS#12 文件可接受过短的 HMAC 密钥。

修复 4.0.0 引入的命令行回归

除了安全漏洞,4.0.1 还修复了两个 4.0.0 版本带进来的命令行回归问题:

  • 使用openssl pkey加密私钥并交互式输入密码时,命令不会再崩溃。
  • openssl s_client -adv在单次read()调用读到 16384 字节输入时,不会再提前终止会话。

OpenSSL 4.0 主要更新

全新协议与密码学特性支持

OpenSSL 4.0 最重要的新特性,是对 ECH 的原生支持——它能彻底补齐 TLS 握手阶段的隐私短板,避免 SNI 信息明文泄露带来的风险。

  • 国密标准方面:新增了基于 RFC 8998 规范的 SM2 TLS 套件与配套签名能力,补齐了国内合规场景的原生支持。
  • 密钥派生能力上:新增 SNMP KDF 与 SRTP KDF 的原生支持,无需再依赖第三方扩展实现。
  • 算法层面:新增 cSHAKE 可扩展输出函数与ML-DSA-MU后量子签名摘要算法,提前适配后量子密码迁移需求。
  • 兼容性上:为 TLS 1.2 环境新增了协商式 FFDHE 密钥交换机制,在老旧环境中也能实现更安全的密钥协商。

破坏性变更与冗余代码移除

为了给架构彻底减重,4.0 版本带来了多项不可逆的破坏性变更。最核心的 2 项是:

  1. 彻底砍掉了对 SSLv3、SSLv2 Client Hello 的支持,彻底告别早已被行业废弃的不安全协议;
  2. 全面废弃了沿用多年的传统硬件加速(Engine)机制。

针对开发者,以下 API 与配置改变需要重点关注:

变更模块具体变化与替换方案
命令行工具c_rehash脚本正式移除,功能全面整合至原生指令openssl rehash
曲线配置编译阶段默认禁用了已废弃的 TLS 椭圆曲线与显式 EC 曲线,特殊需求需在配置阶段手动重新启用
数据类型ASN1_STRING重构为不透明类型(Opaque),多个 X.509 相关 API 强制追加了const修饰符
时间校验旧版证书时间对比函数正式弃用,官方要求统一替换为X509_check_certificate_times()

FIPS 验证逻辑与底层机制强化

对于有强合规需求的 FIPS 用户,新版本优化了模块自检流程。在执行 FIPS 模块安装时,新增延后自检机制,可将性能损耗推迟至模块实际调用阶段。

openssl fipsinstall -defer_tests

底层安全层面,4.0 分支的验证逻辑全面收紧:

  • 调用 FIPS 提供程序的PKCS5_PBKDF2_HMAC时,系统将强制执行下界校验,杜绝弱参数风险;
  • 证书校验链路新增了更严格的 AKID 与 CRL(证书吊销列表)验证流程,进一步压缩证书伪造的空间。
  • 核心库libcrypto也完成了底层清理:不再通过atexit()挂载全局清理任务,OPENSSL_cleanup()改为通过全局析构函数触发,或根据系统环境默认不执行。

版本演进与升级建议

对于体量庞大的下游生态来说,OpenSSL 4.0 是一次彻底的架构跨越。它彻底终止了对老旧生态的兼容性妥协,所有深度依赖旧版 Engine 机制、废弃协议的遗留项目,升级前都必须完成对应的代码重构。

官方也在产品路线图中划清楚了版本定位:4.0 为前沿特性分支,面向需要新能力的场景;当前的 LTS 长期支持版本仍为 OpenSSL 3.5,生产环境应优先选择 LTS 分支。

赞(0)
分享到

评论 抢沙发