Linux KSMBD 认证前漏洞:ZDI 评为 CVSS 9.0 RCE,尚无已发布修复(ZDI-CAN-33774)
Linux 内核内置 SMB 服务器 KSMBD 的两个漏洞被 ZDI 评为 CVSS 9.0,其中一个可在身份验证前触发;任何已发布内核都尚未包含修复,也尚无 CVE 编号。
要点速览
- ZDI-CAN-33774:KSMBD 协议处理器分发中的认证前竞态,通过一次 TCP 写入将一批 SMB1 数据包排在 SMB2 数据包前面发送即可触发。
- ZDI-CAN-33549:KSMBD SMB Direct(RDMA)路径中的整数下溢。
- 所有运行 KSMBD 且 TCP 445 端口可被不可信对端访问的主机都存在暴露。ZDI-CAN-33774 无需身份验证。ZDI-CAN-33549 还要求协商 SMB Direct 传输、支持 RDMA 的接口和可写共享。
- 随报告发布到公开内核邮件列表的概念验证代码,演示了认证前每次尝试泄露 28 字节内核堆内存以及内核崩溃,而非代码执行。ZDI 将两个漏洞均评为远程代码执行,并为 ZDI-CAN-33774 描述了一条写入路径,但公开材料没有展示其实现代码执行。截至 2026 年 10 月 24 日,未报告在野利用(Sysdig)。
- 目前没有可安装的修复。ZDI-CAN-33774 修复于 2026 年 10 月 20 日合入主线开发树,但尚无已发布内核包含它;ZDI-CAN-33549 有提议补丁,但未确认已发布修复,两个漏洞均无 CVE 编号。应停止暴露 KSMBD:不需要时禁用服务,不向不可信网络开放 445 端口,除非确有需要,否则关闭 SMB Direct。
Trend Micro 的 Zero Day Initiative 将两个漏洞均评为 CVSS 9.0,并将两者发现者记为 Hyeontae Lee。
我是否受到影响?
前两个条件成立时,ZDI-CAN-33774 会使您面临已演示的泄露和崩溃;ZDI-CAN-33549 还需要第三个条件:
- 内核构建包含 KSMBD,且服务正在运行。
systemctl status ksmbd显示服务状态;lsmod | grep ksmbd显示内核模块是否加载。仅加载模块并不足以证明暴露:使用下方ss命令检查 445 端口监听,并确认由 KSMBD 提供服务。 - TCP 445 端口可被互联网、租户网络或任何不完全可信的对端访问。
- 仅针对 ZDI-CAN-33549:连接可通过支持 RDMA 的接口协商 SMB Direct,包括硬件接口或 rxe 软件驱动,并存在可写 KSMBD 共享。
两个漏洞的条件和修复状态不同:
| 漏洞 | 所在位置 | 所需条件 | 截至 2026 年 10 月 26 日的修复状态 |
|---|---|---|---|
| ZDI-CAN-33774,CVSS 9.0 | KSMBD 协议分发,fs/smb/server | 无需身份验证;任何在 445 端口运行 KSMBD 的服务器 | 修复提交 68f410faedaf 于 2026 年 10 月 20 日合入主线开发树;尚无已发布内核包含它 |
| ZDI-CAN-33549,CVSS 9.0 | KSMBD SMB Direct(RDMA)路径 | 协商 SMB Direct、支持 RDMA 的接口、可写共享 | Stefan Metzmacher 建议测试 for-7.5/smbdirect 开发分支;Namjae Jeon 于 10 月 23 日发布更小补丁。未确认已发布修复 |
检查运行情况:
systemctl status ksmbd # is the KSMBD service running?
lsmod | grep ksmbd # is the module loaded?
ss -tlnp | grep :445 # is the SMB port listening, and on which address?
KSMBD 实际运行环境:
| 发行版或部署 | 检查内容 |
|---|---|
| Red Hat Enterprise Linux | 根据 Red Hat,默认不包含 KSMBD。 |
| AlmaLinux / CloudLinux 9 和 10 | 根据 CloudLinux,其内核不构建 KSMBD。 |
| Debian / Ubuntu | 根据 CloudLinux,只有安装 ksmbd-tools 并启动服务后才运行 KSMBD。 |
| NAS / 存储设备 | 优先审计附带启用 KSMBD 内核的设备;检查运行的服务和网络暴露。 |
如何修复?
两个漏洞都没有可安装的已发布修复,因此应采取措施移除暴露:
- 不需要内核态 SMB 服务时,停止并禁用 KSMBD:
systemctl stop ksmbd && systemctl disable ksmbd。代价是完全移除文件服务。 - 必须继续提供服务时,在主机防火墙和所有边界防火墙上,将 445 端口限制为主机可信的网络。取舍是服务继续运行,但只有可信对端能到达两个漏洞。任何路径上的不可信访问都会保留 ZDI-CAN-33774 暴露,因为它无需身份验证。
- 除非专门使用,否则关闭 SMB Direct 和 RDMA,这可封堵 ZDI-CAN-33549。局限是它对认证前漏洞 ZDI-CAN-33774 没有作用。
跟踪修复内核,不要猜测日期。合入主线树的修复通常需要数周才会进入稳定分支,随后再进入发行版内核;内核项目只在稳定树修复可用后分配 CVE 编号。当发行版提供包含提交 68f410faedaf(“ksmbd:接收另一个 PDU 前等待协商完成”)的内核时,该主机上的 ZDI-CAN-33774 才被关闭。对于 ZDI-CAN-33549,请向厂商确认是否包含 10 月 23 日补丁“smb: smbdirect:修复 RDMA 传输中的缓冲区长度下溢”。
根本原因是什么?
KSMBD 接收线程可能在协商工作线程完成前读取下一个协议数据单元,因此流水线发送的 SMB2 请求能在工作线程仍处理较早、较短的 SMB1 请求时,替换连接的处理器表。
维护者的修复提交 68f410faedaf 精确描述了机制:
接收线程将请求排队后,可能在协商工作线程完成前读取下一个 PDU。当 need_neg 被设置时,下一个 PDU 可使 ksmbd_init_smb_server() 替换 conn->ops。因此,流水线发送的 SMB2 请求可能令工作线程使用 SMB2 操作处理较早、较短的 SMB1 请求,并读出缓冲区边界。
SMB1 多协议协商之后可能紧接一个 SMB2 NEGOTIATE,再次改变 conn->ops。
机制逐步如下:
conn->ops是连接的处理器表,即将解码后的 SMB 命令转为操作的函数指针集合。SMB1 和 SMB2 命令布局不同,因此服务器在need_neg被设置的协商期间分配其中一种表。ksmbd_init_smb_server()执行该分配。连接中途再次运行它,会替换conn->ops,但按旧表排队的工作可能仍在执行。- 流水线请求,即将多个协议数据单元打包进一次 TCP 写入,制造了重叠:在较早、较短 SMB1 数据包的工作线程完成前,接收线程读取 SMB2 数据包并重新执行协商。
- 工作线程随后将 SMB2 处理逻辑应用于 SMB1 大小的缓冲区,越界读取。
对于 ZDI-CAN-33549,报告描述了 SMB Direct 路径中的整数下溢:客户端提供 RDMA 缓冲区描述符,第一个描述符的长度大于声明的载荷,使服务器大小计数器回绕,随后内存复制超出已分配缓冲区末尾。
如何利用?
尚未报告在野利用,攻击路径已在附带概念验证源码、发布到公开内核邮件列表的报告中公开:
- 攻击者连接运行 KSMBD 的主机 445 端口。ZDI-CAN-33774 不需要身份验证,因此任何在该端口运行 KSMBD 的服务器都会暴露。
- 攻击者用一次 TCP 写入发送一批短 SMB1 数据包,随后附上一个 SMB2 数据包。
- 接收线程将 SMB1 数据包的工作排队,读取 SMB2 数据包,重新执行协商,并用 SMB2 处理器表替换
conn->ops。 - 已排队的工作线程使用 SMB2 操作处理较早、较短的 SMB1 请求,读出较短缓冲区边界。
- 公开概念验证演示的是:认证前每次尝试泄露 28 字节内核堆内存,以及内核崩溃。ZDI 报告还描述了攻击者获得共享访问权后的一条越界写入路径,但 Sysdig 指出,公开材料没有展示该路径实现代码执行。
对于 ZDI-CAN-33549,攻击者是协商 SMB Direct 并提供特制 RDMA 缓冲区描述符的客户端;它需要服务器支持 RDMA 的接口、可写共享和 SMB Direct 传输,因此比 ZDI-CAN-33774 有更多前提。
攻击如何展开?
整个攻击是一次流水线 TCP 写入,令服务器在已排队工作线程仍执行时更换处理器表。
无需身份验证"] --> B["一次 TCP 写入:一批
短 SMB1 数据包加 SMB2"] B --> C["接收线程在 SMB1 工作线程
完成前读取 SMB2"] C --> D["协商将 conn->ops
替换为 SMB2 处理器"] D --> E["工作线程用 SMB2 处理器处理
SMB1 数据,越界读取"] E --> F["每次尝试泄露内核堆内存;
内核可能崩溃"] style C fill:#f8d7da
缺失的同步位于 C:没有机制让接收线程在读取下一个协议数据单元前等待协商工作线程完成。
攻击者能做什么?
对暴露主机,公开演示的影响是内核内存泄露,认证前每次泄露 28 字节堆内存,以及内核崩溃,即文件服务器拒绝服务。ZDI 将两个漏洞均以远程代码执行评为 CVSS 9.0,其 ZDI-CAN-33774 报告描述了攻击者获得共享访问后的一条越界写入路径,因此除已演示泄露之外,进一步内存破坏是合理可能性。但没有公开演示将其转为代码执行,也没有已报告在野使用。
每个漏洞所需条件:
- ZDI-CAN-33774:触发泄露和崩溃需要内核构建包含 KSMBD、服务运行、445 端口可达;不需要账户或共享。ZDI 描述的写入路径还需要共享访问权。
- ZDI-CAN-33549:上述条件之外,还需协商 SMB Direct、支持 RDMA 的接口(硬件或 rxe 软件驱动)和可写共享。
- 两者均不影响用户态 Samba(smbd),它是独立代码库,不共享 KSMBD 的内核分发路径。
为什么修复有效?
KSMBD 维护者 Namjae Jeon 提交的 ZDI-CAN-33774 修复 68f410faedaf,在 fs/smb/server/server.c 接收路径中添加等待:
--- a/fs/smb/server/server.c
+++ b/fs/smb/server/server.c
@@ static int queue_ksmbd_work(struct ksmbd_conn *conn)
struct ksmbd_work *work;
+ bool wait_for_neg = ksmbd_conn_new(conn) || ksmbd_conn_need_negotiate(conn);
int err;
@@
INIT_WORK(&work->work, handle_ksmbd_work);
ksmbd_queue_work(work);
+ /* Negotiation can change conn->ops, finish it before reading another PDU. */
+ if (wait_for_neg)
+ wait_event(conn->req_running_q,
+ atomic_read(&conn->req_running) == 0);
return 0;
对新连接或仍在协商的连接排队工作后,接收线程现在会在 conn->req_running_q 上等待,直到所有排队请求完成。工作线程仍处理较早请求时,处理器表无法被替换,因此 SMB1 数据不再会由 SMB2 操作处理。提交保持 need_neg 语义不变,其说明将变更描述为在协商两个阶段保持操作稳定。
修复完整解决了此竞态,针对一份相关的较早报告编写,并向 ihopenre-eng 致谢。仍有两个限制:它于 2026 年 10 月 20 日合入主线开发树,尚无已发布内核包含;它也不涉及 SMB Direct 路径,因此 ZDI-CAN-33549 需要独立的 SMB Direct 补丁。
如何检查是否已遭入侵?
两个漏洞均未报告利用,也未发布入侵指标。如果您将 KSMBD 暴露于不可信网络并希望审计:
- 审查 445 端口连接和防火墙日志,查找意外源地址。若有抓包,查找请求突发后立即断连的模式;仅此模式不能证明利用。
- 检查内核日志中引用 ksmbd 或 fs/smb/server 的 oops 或 panic 记录,因为公开概念验证可使内核崩溃。
- 将每次尝试泄露 28 字节堆内存视为真实暴露:每次尝试都会披露内核堆内容,因此即使没有崩溃,对暴露主机的重复尝试也可能已收集内存内容。如果怀疑主机失陷,应执行疑似内核级事件的标准响应:隔离主机、轮换其持有的所有凭据,并从已知可靠镜像重建。
时间线
- 2026-09-30:KSMBD 维护者 Namjae Jeon 编写修复提交 68f410faedaf“ksmbd:接收另一个 PDU 前等待协商完成”,回应较早报告,并向 ihopenre-eng 致谢。
- 2026-10-20:修复提交合入主线 Linux 开发树(提交者时间戳为 10 月 20 日 23:55 UTC)。
- 2026-10-21:ZDI 向公开内核邮件列表披露 ZDI-CAN-33774 和 ZDI-CAN-33549,均评为 CVSS 9.0,发现者为 Hyeontae Lee,未附补丁(UTC 时间戳)。
- 2026-10-21:SMB Direct 维护者 Stefan Metzmacher 请报告者测试
for-7.5/smbdirect开发分支,作为 ZDI-CAN-33549 的可能修复。 - 2026-10-22:KSMBD 维护者 Namjae Jeon 回复称提交 68f410faedaf 已修复竞态。
- 2026-10-22:稳定内核维护者 Greg Kroah-Hartman 回复,要求提交补丁而非公开披露。
- 2026-10-22:The Hacker News 报道披露事件。
- 2026-10-23:Stefan Metzmacher 建议最小修复后,Namjae Jeon 发布更小的 SMB Direct 下溢补丁。
- 2026-10-23 至 25:AlmaLinux、CloudLinux 和 Sysdig 发布分析;公开概念验证被记录为认证前每次泄露 28 字节内核堆内存加崩溃,而非代码执行。
- 2026-10-26:本文发布。尚未报告在野利用,两个漏洞均未列入 CISA KEV 目录。
常见问题
为什么没有 CVE 编号?
根据 Linux 内核项目公开的 CVE 政策,只有修复在已发布稳定内核中可用后才分配 CVE 编号。这两个漏洞在任何已发布内核包含修复之前就被披露到公开列表,因此通过 ZDI-CAN 标识符跟踪。预计稳定内核纳入修复后才会出现 CVE 编号。
公开概念验证能让攻击者远程执行代码吗?
不能。它演示的是认证前每次泄露 28 字节内核堆内存,以及内核崩溃。ZDI 的 CVSS 9.0 评级将漏洞视为远程代码执行,其 ZDI-CAN-33774 报告还描述了攻击者获得共享访问后的一条越界写入路径,但 Sysdig 指出,没有公开演示显示代码执行。
我的发行版内核受影响吗?
只有发行版构建了 KSMBD 且服务已启动才会受影响。Red Hat Enterprise Linux 默认不包含 KSMBD,AlmaLinux 和 CloudLinux 9、10 的内核不构建它,Debian 和 Ubuntu 仅在安装 ksmbd-tools 并启动服务后运行它。应审计附带启用 KSMBD 内核、用于文件服务的 NAS 设备和存储服务器。
Samba 服务器受影响吗?
不受影响。Samba 的用户态 smbd 是独立实现,不共享 KSMBD 内核分发代码。暴露软件是内核内 SMB 服务器 KSMBD,可通过 systemctl status ksmbd 或 lsmod | grep ksmbd 识别。
修复何时进入我的内核?
ZDI-CAN-33774 修复于 2026 年 10 月 20 日进入主线开发树,主线修复通常需要数周进入稳定分支,之后再进入发行版内核。对于 ZDI-CAN-33549,Stefan Metzmacher 最初请报告者测试 for-7.5/smbdirect 开发分支,随后 Namjae Jeon 于 10 月 23 日发布更小补丁;这并不证明发行版已发布内核中已经可用。跟踪发行版内核公告中的提交 68f410faedaf(ZDI-CAN-33774)和 10 月 23 日 SMB Direct 补丁(ZDI-CAN-33549),分别确认覆盖情况。
两个漏洞都需要 SMB Direct 才值得担心吗?
不是。ZDI-CAN-33549 需要 SMB Direct、支持 RDMA 的接口和可写共享。ZDI-CAN-33774 都不需要:任何能到达运行 KSMBD 主机 445 端口、未经身份验证的对端都能触及,因此应优先移除它的暴露。
在攻击者之前找到暴露的 SMB 服务器
按照 Ostorlab 网络扫描指南:选择新建扫描 → 网络,输入 IP 地址或范围,选择完整网络扫描,然后启动扫描。审查所有 445 端口发现,再在本地确认服务为 KSMBD 还是用户态 Samba。等待修复后的发行版内核期间,限制暴露的 KSMBD 服务。
参考资料
- 由 Openwall 镜像的 ZDI-CAN-33774 原始报告,包含 10 月 21 日 UTC 披露时间戳及描述的写入路径:https://lists.openwall.net/linux-kernel/2026/10/21/2694
- Stefan Metzmacher 的 SMB Direct 分支和最小修复讨论,10 月 23 日:https://lists.openwall.net/linux-kernel/2026/10/23/739
- Namjae Jeon 附带的 SMB Direct 下溢补丁,10 月 23 日:https://lists.openwall.net/linux-kernel/2026/10/23/971
- The Hacker News,《两个 CVSS 9.0 Linux KSMBD RCE 漏洞在内核修复前披露于公开邮件列表》,2026 年 10 月 22 日,10 月 26 日更新,包含机制、维护者回复、概念验证范围和发行版状态:https://thehackernews.com/2026/10/two-cvss-90-linux-ksmbd-rce-flaws.html (2026 年 10 月 26 日核查)
- ZDI 即将发布公告,将 ZDI-CAN-33774 和 ZDI-CAN-33549 列为 CVSS 9.0,厂商 Linux,发现者 Hyeontae Lee:https://www.zerodayinitiative.com/advisories/upcoming/ (2026 年 10 月 26 日核查)
- 公开内核列表上的 ZDI-CAN-33774 报告:https://lore.kernel.org/lkml/BYAPR01MB383076AC412E19C48CFBEAE980662@BYAPR01MB3830.prod.exchangelabs.com/ (原始报告)
- 公开内核列表上的 ZDI-CAN-33549 报告:https://lore.kernel.org/lkml/BYAPR01MB3830472B5702C089B0BBB77D80662@BYAPR01MB3830.prod.exchangelabs.com/ (原始报告)
- 主线 Linux 树中的修复提交 68f410faedaf“ksmbd:接收另一个 PDU 前等待协商完成”,2026 年 9 月 30 日编写,提交者时间戳为 2026 年 10 月 20 日:https://github.com/torvalds/linux/commit/68f410faedaf6ee74d81e574733c50ebcc1bd8ed (2026 年 10 月 26 日核查)
- Sysdig 关于 10 月六个内核报告、概念验证范围及尚未合入修复状态的分析:https://www.sysdig.com/blog/detecting-and-mitigating-zdi-can-33367-and-five-other-linux-flaws (通过 The Hacker News 引用,2026 年 10 月 26 日)
- AlmaLinux 关于公开内核列表报告的分析:https://almalinux.org/blog/2026-10-23-zdi-can-33367/ (通过 The Hacker News 引用,2026 年 10 月 26 日)
- CloudLinux 关于 KSMBD 概念验证和发行版构建状态的分析:https://blog.cloudlinux.com/zdi-can-33367 (通过 The Hacker News 引用,2026 年 10 月 26 日)
- Red Hat 解决方案文档 6991749,RHEL 默认不包含 KSMBD:https://access.redhat.com/solutions/6991749 (通过 The Hacker News 引用,2026 年 10 月 26 日)
- Linux 内核 CVE 分配政策,仅在稳定树修复后发布 CVE:https://docs.kernel.org/process/cve.html (通过 The Hacker News 引用,2026 年 10 月 26 日)