10 月 20 日至 21 日,Trend Micro 零日计划(ZDI)把六份未修复的 Linux 内核漏洞报告发到了公开邮件列表,其中两枚打在 KSMBD 上——那是 Linux 内核自带的 SMB 服务端。两枚 CVSS 都是 9.0,其中 ZDI-CAN-33774 不需要任何认证,任何把 445 端口暴露给不可信网络的 KSMBD 主机都在射程内。截至 10 月 23 日,主线和 linux-next 都没有对应修复,也没有分配 CVE。
事件概述
这一批共六份报告:五个针对 Linux 内核,一个针对用户态网络管理守护进程 ConnMan(ZDI-CAN-32005,栈上缓冲区溢出)。它们有一个共同点——没有附带补丁,也没有 CVE 编号。
内核稳定分支维护者 Greg Kroah-Hartman 在公开列表上直接回怼,其中一条大意是:不知为何你发到了公开列表,而且没带补丁,那我们也没太多能做的。后面几封更不客气,要求 ZDI 修一修提交流程。ZDI 至今未公开解释为何这些报告出现在了公开列表上。
发现方一栏署名 TrendAI,是 Trend Micro 的 AI 扫描器。这里有个政策背景:Linux 内核安全文档在 2026 年 5 月更新后写明,AI 工具发现的缺陷按定义已经算公开,应当发到各子系统开发者列表。ZDI 的投递路径看起来照着这一条走,但把未修复的细节连同部分 PoC 一起摊在公开列表上,和协调披露的常规做法明显冲突。
技术细节
ZDI-CAN-33774:不需要登录,445 端口直接够到
缺陷在 KSMBD 分发网络请求时给 handler 表赋值的方式上,是一个竞态。构造方式是:在一次 TCP 写入里先塞一串短的 SMB1 包,紧跟一个 SMB2 包,worker 就会拿 SMB2 的 handler 去处理 SMB1 的数据,读过短缓冲区的末尾。一旦攻击者已经拿到某个共享的访问权,还存在继续往缓冲区之外写的路径。CVSS 9.0。
ZDI-CAN-33549:走 SMB Direct,整数下溢
这条门槛高一些。客户端可以提交一组 RDMA buffer descriptor,让第一个描述符的长度大于声明的载荷长度,服务端的 size 计数器就会回绕,随后的内存拷贝直接越过已分配缓冲区的尾部。三个前提缺一不可:RDMA 网卡(硬件或 rxe 软件驱动)、一个可写的 KSMBD 共享、客户端协商使用 SMB Direct。CVSS 同为 9.0。
ZDI-CAN-33774 KSMBD 请求分发竞态 CVSS 9.0 无需认证
ZDI-CAN-33549 KSMBD SMB Direct 下溢 CVSS 9.0 需 RDMA + 可写共享
ZDI-CAN-33367 skb_zerocopy 本地提权 CVSS 7.8 需本地访问
ZDI-CAN-34068 vmwgfx 本地提权 CVSS 8.8 需本地访问
ZDI-CAN-34076 nvmet 信息泄露 CVSS 8.6 需本地访问
CVE 编号要等稳定树修复落地,内核项目才会分配,所以现在两枚都没有。据 Phoronix,SMB Direct 维护者 Stefan Metzmacher 已为 ZDI-CAN-33549 提交补丁,目标是下一个开发周期,但这一说法未获其他来源确认;修复进主线之后,通常还要数周才能到稳定分支和发行版内核。
顺手提醒一个容易混淆的点:ZDI-22-1690(2022 年 12 月,同组件的未认证 RCE)和 ZDI-26-573(2026 年 8 月,预认证内存泄漏,9.3)是另外的漏洞。修过那两个,不等于修了这两枚。
影响评估
实际暴露面比标题看起来小。KSMBD 在多数发行版里默认没装也没启用,红帽企业版内核根本不构建它;日常最普遍的还是用户态 Samba,用 Samba 的系统不会因为这两枚自动中招。445 端口开着也不代表是 KSMBD——要用 ss 看监听者,再确认模块。
真正该紧张的是三类:NAS 设备、家用与小型服务器,以及为了性能刻意用 KSMBD、又把 445 端口暴露在不可信网络上的机器。而细节先公开、补丁后到这件事本身,把防守方的应对窗口压到了最短——这是这轮披露最坏的部分,比漏洞本身更值得记录。
修复建议
- 先查:
systemctl status ksmbd或lsmod | grep ksmbd。 - 不需要就关掉:停服务、
modprobe -r ksmbd卸载,再写黑名单防止重启后自己回来。模块 busy 卸不掉是正常的,说明还有东西占着共享,先停服务再卸。 - 必须用就收窄:445 只对可信网段开放,清掉 guest 可访问的共享,不依赖 RDMA 就把 SMB Direct 关掉。
- 盯发行版与 NAS 厂商的安全公告,别自己猜一个内核版本号去 apt——目前所有来源都没有给出内核版本范围,编一个出来只会误导自己。
- 能换就换回用户态 Samba,它的性能不如内核实现,但至少不在这次射程里。
- 把公网暴露 SMB 当成一条独立的合规红线来查,这比追单个 CVE 有效。