CVE-2025-39929CVE-2025-39929是Linux内核SMB(Server Message Block)客户端子系统中的一个内存泄漏漏洞。该漏洞位于smbdirect接收I/O对象的内存管理逻辑中,具体出现在smbd_negotiate()函数的错误处理路径上。当SMB直连(smbdirect)协议协商过程中发生错误时,系统未能正确释放已分配的smbdirect_recv_io对象,导致内核内存泄漏。在测试其他无关补丁的过程中,研究人员通过触发__kmem_cache_shutdown()时检测到残留对象,证实了该漏洞的存在。
该漏洞的CVSS 3.1评分为5.5分,属于中危级别。其攻击向量为本地攻击(AV:L),攻击复杂度低(AC:L),所需权限为低权限(PR:L),无需用户交互(UI:N)。从影响维度来看,该漏洞对机密性无影响(C:N),对完整性无影响(I:N),但对系统可用性影响较高(A:H)。这意味着攻击者可以利用该漏洞耗尽内核内存资源,最终导致系统不稳定或拒绝服务。
Linux内核的SMB客户端模块是Linux系统与Windows/Samba服务器进行文件共享通信的核心组件,被广泛应用于企业级NAS、文件服务器以及容器化环境中。该漏洞的存在可能导致长时间运行的系统出现内存耗尽问题,影响系统稳定性和业务连续性。
该漏洞的技术根源在于smbd_negotiate()函数的错误处理路径中缺少对smbdirect_recv_io对象的正确释放。
在SMB直连(SMB Direct)协议中,smbdirect_recv_io结构体用于管理接收I/O操作。当smbd_negotiate()函数执行协商过程时,会预先分配smbdirect_recv_io对象以备后续数据接收使用。然而,如果在协商过程中出现错误(例如网络中断、协议版本不兼容等),函数会跳转到错误处理路径,但该路径未正确释放先前分配的smbdirect_recv_io对象。
具体技术细节如下:
1. smbd_negotiate()调用smbd_create_conn()或相关函数创建连接并分配接收缓冲区;
2. 在协商过程中分配smbdirect_recv_io对象并将其加入接收队列;
3. 当协商失败时,错误处理路径调用smbd_destroy_conn()或类似清理函数;
4. 清理函数未遍历并释放所有已分配的smbdirect_recv_io对象;
5. 每次错误发生都会泄漏一个或多个smbdirect_recv_io对象。
利用方式方面,攻击者需要拥有本地系统的低权限访问权限,通过反复触发SMB连接协商失败(例如连接到恶意SMB服务器或操纵网络环境),可以持续造成内核内存泄漏。虽然每次泄漏的内存量有限,但长期累积可导致内核slab缓存耗尽,最终触发内核panic或系统不可用。