CIFSwitch — Linux CIFS 内核子系统中本地提权漏洞
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 机制)缺少这个验证钩子,这意味着:
- 任何无特权用户都可以使用任意格式的描述字符串创建
cifs.spnegokey - 当内核 CIFS 客户端需要进行 SPNEGO 认证时,会调用用户空间的
cifs.upcall帮助程序(以 root 权限运行) cifs.upcall从 key 的描述字符串中解引用一个被 NSS 库路径,该路径指向攻击者控制的恶意共享库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 编号分配 |
参考资料
💬 评论