CVE-2025-39931CVE-2025-39931是Linux内核crypto/af_alg子系统中的一个中等严重性漏洞,CVSS评分为5.5。该漏洞位于af_alg_sendmsg函数中,由于ctx->merge变量在函数循环开始时未被及时初始化为零,导致在异常路径中止后,该变量可能保留上一次循环遗留的垃圾值。当下一次进入af_alg_sendmsg函数并尝试执行合并(merge)操作时,由于该垃圾值不符合合并条件,从而触发内核崩溃,造成本地拒绝服务(DoS)。
af_alg是Linux内核提供的一套用于用户空间访问加密算法(AF_ALG socket接口)的机制,广泛应用于各类加密通信场景。该漏洞虽然需要低权限本地触发,但能够导致系统完全崩溃(内核panic),对系统可用性造成严重影响。该问题已在多个Linux内核稳定版本中得到修复,包括5.10.x、5.15.x、6.1.x、6.6.x及6.12.x等长期支持分支。
此漏洞由Linux内核安全团队成员发现并修复,属于典型的内核代码逻辑缺陷类安全问题。虽然不涉及远程攻击或权限提升,但其对系统稳定性的影响不容忽视,特别是在多用户服务器环境中,低权限用户可能利用此漏洞触发系统崩溃,影响业务连续性。
从技术角度看,该漏洞的根本原因在于af_alg_sendmsg函数中的变量初始化顺序问题。af_alg_sendmsg是AF_ALG socket接口的核心发送消息函数,负责处理用户空间通过socket发送的加密操作请求。
在原始代码中,ctx->merge字段用于跟踪是否需要将当前消息与之前的消息进行合并处理。该字段的初始化被放置在循环内部,但在某些错误处理路径中,函数可能在初始化之前就跳出了循环或返回了错误。当这种情况发生时,ctx->merge保留了之前调用时的旧值。
当用户空间程序再次调用af_alg_sendmsg时,函数会检查ctx->merge的值来决定是否执行合并逻辑。由于该值是垃圾值(可能是任意非零值),代码会尝试执行一个无法完成的合并操作,导致空指针解引用或非法内存访问,最终触发内核oops或panic。
利用方式上,攻击者只需拥有本地低权限账户,通过AF_ALG socket接口(通常通过OpenSSL的ENGINE API或直接使用socket系统调用)触发特定的错误条件即可。具体而言:
1. 创建一个AF_ALG类型的socket
2. 绑定到特定的加密算法(如hash算法)
3. 发送一个会导致af_alg_sendmsg在循环中出错的请求
4. 再次发送请求时,ctx->merge的垃圾值将导致内核崩溃
修复方案是将ctx->merge = 0的赋值操作移至循环开始之前,确保每次进入循环时该变量都被正确初始化,从而避免使用未初始化的值。