CVE-2025-40039CVE-2025-40039是Linux内核中ksmbd模块的一个中等严重性安全漏洞,CVSS评分4.7。该漏洞存在于ksmbd会话的RPC句柄列表访问过程中,由于不正确的锁机制导致潜在的竞态条件。ksmbd是Linux内核中的SMB服务器实现,用于提供文件共享服务。在ksmbd_session_rpc_open()函数中,代码在修改XArray结构(xa_store和xa_erase操作)时仅获取了读锁而非写锁,这违反了读写锁的使用规范。在ksmbbd_session_rpc_method()函数中,甚至完全没有获取任何锁就直接使用xa_load()访问列表。这些错误的锁使用模式可能导致数据竞争、不一致数据读取或潜在的释放后使用(use-after-free)漏洞。攻击者可通过本地低权限访问触发此竞态条件,虽然不需要用户交互,但成功利用可能导致内核崩溃(可用性影响高),造成拒绝服务。
该漏洞的技术根源在于ksmbd会话管理中RPC句柄列表的锁保护机制不完善。ksmbd使用XArray数据结构(sess->rpc_handle_list)管理RPC句柄,并通过读写信号量sess->rpc_lock进行同步保护。然而实现存在两处关键缺陷:
第一处缺陷在ksmbd_session_rpc_open()函数中:当执行xa_store()和xa_erase()这些修改XArray的操作时,代码错误地使用了down_read()获取读锁。由于写操作需要独占访问,读锁无法提供必要的保护,多个并发线程可能同时修改数据结构导致数据损坏或内存破坏。
第二处缺陷在ksmbd_session_rpc_method()函数中:使用xa_load()读取列表时完全没有获取任何锁。如果另一个线程同时删除了某个条目,可能导致读取到无效指针或释放后的内存,造成use-after-free漏洞。
修复方案包括:在ksmbd_session_rpc_open()中改用down_write()/up_write()确保独占访问;在ksmbd_session_rpc_method()中添加down_read()/up_read()保护读取操作;确保所有错误路径正确释放锁。攻击者需要本地访问权限,通过构造特定的SMB请求序列触发RPC操作,利用时间窗口执行并发操作来触发竞态条件。