CVE-2025-15469OpenSSL 3.5和3.6版本中的'openssl dgst'命令行工具存在一个输入截断漏洞。当使用一次性签名算法(如Ed25519、Ed448、ML-DSA系列)对大于16MB的文件进行签名或验证时,该工具会静默地将输入数据截断到前16MB,并报告签名成功而非返回错误。这意味着用户可能认为整个文件都被正确认证,但实际上超过16MB的尾部数据未被认证。攻击者可以利用此漏洞修改大文件(超过16MB)的尾部数据,而不会被签名验证检测到。该漏洞主要影响同时使用受影响版本的'openssl dgst'命令进行签名和验证的工作流程。流式摘要算法和直接使用OpenSSL库API的应用程序不受此影响。FIPS模块也不受影响。
OpenSSL的'openssl dgst'命令在处理一次性签名算法时,会将输入数据缓冲到内存中,但存在16MB的大小限制。当输入文件超过16MB时,代码会静默截断输入到前16MB,然后继续处理流程并生成签名。问题在于截断操作没有返回任何错误或警告,导致用户无法察觉数据丢失。具体来说:
1. 触发条件:使用Ed25519、Ed448、ML-DSA-44、ML-DSA-65或ML-DSA-87算法对大于16MB的文件执行'openssl dgst -sign'或'openssl dgst -verify'命令。
2. 漏洞原理:dgst命令内部使用BIO_new_file()读取文件时,在一次性签名模式下应用了16MB的缓冲区限制。超过此限制的数据被丢弃,但函数返回成功状态。
3. 影响范围:仅影响命令行工具的签名和验证流程。使用EVP_DigestSign*系列API直接处理完整消息的应用程序会正确处理大文件。
4. 利用方式:攻击者可以获取一个大于16MB的已签名文件,修改超过16MB部分的任意内容,然后使用受影响版本的'openssl dgst -verify'验证时仍会显示验证成功。