CIFS SPNEGO upcall 路径中缺少 key 描述验证,允许本地用户一条命令获取 root 权限。
PoC 已公开,CVE 待分配。


漏洞概述

项目 内容
漏洞名称 CIFSwitch
CVE 编号 待分配(截至 2026-05-30 仍在申请中)
漏洞类型 内核 key 描述验证缺失 → 提权
CVSS 预计 7.8(High)
发现者 Asim Manizada
公开时间 2026 年 5 月 28 日(oss-security 列表)
潜伏时间 ~19 年(自 2007 年引入)
PoC 状态 ✅ 已公开(GitHub: manizada/CIFSwitch)

影响范围

属性 内容
影响组件 Linux 内核 CIFS 客户端 + cifs-utils 用户空间工具
内核文件 fs/smb/client/cifs_spnego.c
引入时间 2007 年
利用条件 需同时满足以下条件:
1. 安装了 cifs-utils
2. CIFS 内核模块可用或可加载
3. 启用了无特权用户命名空间(多数发行版默认)
4. SELinux/AppArmor 策略未阻止利用链

各发行版受影响情况

发行版 默认风险
Ubuntu ⚠️ cifs-utils 不默认安装,但安装后受影响
Fedora ⚠️ 同 Ubuntu
RHEL/CentOS ⚠️ 同 Ubuntu
Debian ⚠️ 同 Ubuntu
Arch Linux ⚠️ 同 Ubuntu

漏洞原理

根因:缺少 `.vet_description` 钩子

Linux 内核的 key 类型系统允许用户空间程序实例化 key。每个 key 类型可以注册一个 .vet_description 回调函数来验证用户提供的描述字符串是否合法。

cifs.spnego key 类型(用于 CIFS/SMB 内核 upcall 机制)缺少这个验证钩子,这意味着:

  1. 任何无特权用户都可以使用任意格式的描述字符串创建 cifs.spnego key
  2. 当内核 CIFS 客户端需要进行 SPNEGO 认证时,会调用用户空间的 cifs.upcall 帮助程序(以 root 权限运行
  3. cifs.upcall 从 key 的描述字符串中解引用一个被 NSS 库路径,该路径指向攻击者控制的恶意共享库
  4. cifs.upcall 加载该恶意共享库 → 代码以 root 权限执行

利用链

无特权用户                         内核 / Root
    │                                  │
    ├── 创建恶意 cifs.spnego key ──────┤
    │   (描述中包含恶意 NSS 库路径)      │
    │                                  │
    ├── 触发 CIFS mount/访问 ──────────┤
    │                                  ├── 内核调用 cifs.upcall (root)
    │                                  ├── cifs.upcall 加载恶意 NSS 库
    │                                  └── 恶意代码以 root 执行
    │
    └── 获取 root shell ◄─────────────┘

漏洞特点

  • 一条命令完成提权 — PoC 极其简洁
  • 无需认证 — 仅需本地用户权限
  • 19 年未被发现 — 代码缺陷自 2007 年引入内核
  • ⚠️ 需安装 cifs-utils(服务器通常安装,桌面系统不默认)

缓解措施

方案一:升级内核 / cifs-utils(推荐)

上游修复已合入内核(commit 3da1fdf4efbc — "smb: client: reject userspace cifs.spnego descriptions")。等待各发行版发布更新后安装:

# Ubuntu/Debian
sudo apt update && sudo apt dist-upgrade

# Fedora
sudo dnf upgrade --refresh

# RHEL/CentOS/AlmaLinux/Rocky
sudo dnf update kernel cifs-utils

方案二:禁用 CIFS upcall(临时缓解)

# 方法 A:阻止 cifs.spnego key 操作
sudo sh -c 'echo "install cifs /bin/false" > /etc/modprobe.d/disable-cifs.conf'
sudo rmmod cifs 2>/dev/null || true

# ⚠️ 这将禁用 CIFS/SMB 文件系统挂载功能

方案三:限制用户命名空间

sudo sysctl -w kernel.unprivileged_userns_clone=0
echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.d/99-disable-userns.conf

方案四:SELinux/AppArmor 策略

确保现有策略未允许无特权用户执行 key 创建和 cifs.upcall 调用。检查关键的审计日志:

# 检查是否已有利用尝试
grep -i "cifs.spnego\|cifs.upcall" /var/log/audit/audit.log 2>/dev/null

方案五:卸载 cifs-utils

# Ubuntu/Debian
sudo apt remove cifs-utils

# Fedora/RHEL
sudo dnf remove cifs-utils

检测方法

# 检查 cifs-utils 是否安装
dpkg -l | grep cifs-utils   # Ubuntu/Debian
rpm -qa | grep cifs-utils   # RHEL/Fedora

# 检查 CIFS 模块是否加载
lsmod | grep cifs

# 检查是否有异常的 cifs.spnego key 创建
keyctl show 2>/dev/null | grep spnego

# 检查内核日志中相关事件
dmesg | grep -i "cifs\|spnego" | tail -20

与其他漏洞的关系

CIFSwitch 属于 2026 年 5 月集中披露的 Linux LPE 漏洞之一,但与 Dirty Frag / Copy Fail 家族不同

  • Dirty Frag 等属于页缓存写入类(Page-Cache Write)
  • CIFSwitch 属于key 描述验证缺失类,攻击面完全不同
对比 Dirty Frag / Copy Fail CIFSwitch
机制 内核页缓存写入 内核 key 类型验证缺失
默认受影响面 几乎所有发行版 仅安装 cifs-utils 的系统
利用复杂度 中等

时间线

日期 事件
2007 年 漏洞代码被引入内核
2026-05-28 Asim Manizada 通过 oss-security 列表公开披露
2026-05-28 上游修复提交(3da1fdf4efbc
2026-05-28 AlmaLinux 发布测试内核
⏳ 待定 CVE 编号分配

参考资料