跳到主要内容

Linux Kernel CIFSwitch 本地权限提升漏洞分析(CVE-2026-29453)

· 阅读需 9 分钟
ICE Lab
Institute of Cyber Environment

摘要

2026年5月27日,Linux 内核 CIFS 子系统中一处本地权限提升漏洞被公开披露(CVE-2026-29453,CVSSv3 7.8)。漏洞根源在于内核未对 cifs.spnego 类型密钥的描述信息实施来源合法性校验——未实现 vet_description 钩子以验证密钥是否由内核 CIFS 模块生成。同时,cifs.upcall 用户空间辅助程序以 root 权限运行时无条件信任密钥描述中的 piduidcreduidupcall_target 等攻击者可控字段。本地低权限用户可构造伪造的密钥描述发起 request_key 系统调用,触发 root 权限的 cifs.upcall 执行,通过命名空间切换与 NSS 模块加载实现 root 权限代码执行。本分析从漏洞原理、利用条件、影响范围与修复方案四个维度展开讨论。

关键词:Linux 内核;CIFS;SPNEGO;权限提升;request_key;CVE-2026-29453

1. 引言

CIFS(Common Internet File System)是 Linux 内核中实现 SMB 网络文件共享协议的核心子系统,支持 Kerberos 与 SPNEGO 认证机制。cifs-utils 作为配套用户空间工具,提供 cifs.upcall 辅助程序,负责处理内核 CIFS 子系统的 Kerberos/SPNEGO 认证请求,通过内核密钥环(keyring)完成凭证交互。该基础设施广泛应用于企业文件服务与跨平台存储访问场景。

CIFSwitch 漏洞的独特之处在于其攻击面位于内核密钥管理框架与用户空间辅助程序之间的信任边界——攻击者无需利用内核内存损坏,仅通过合法系统调用的参数构造即可实现权限提升。

2. 漏洞原理分析

2.1 CIFS SPNEGO 认证流程

Linux 内核密钥保留服务(key retention service)允许内核子系统将认证凭证以密钥形式存储于密钥环中。CIFS 子系统使用 cifs.spnego 类型的密钥描述来触发 SPNEGO 认证流程。当内核需要执行 Kerberos 认证时,通过 request_key 机制向用户空间发起上调用(upcall),由 cifs.upcall 处理认证请求并返回票据。

正常的认证流程为:

  1. 内核 CIFS 模块构造密钥描述,包含会话标识、服务主体名等信息
  2. 内核通过 /sbin/request-key 触发 cifs.upcall 以 root 权限执行
  3. cifs.upcall 解析密钥描述中的参数,执行 Kerberos 票据获取
  4. 结果通过密钥环返回内核

2.2 密钥描述注入

漏洞的核心在于两个层面的信任缺陷:

内核层面:CIFS 子系统的密钥类型定义未实现 vet_description 钩子。该钩子的设计意图是在 request_key 系统调用进入处理流程之前,验证密钥描述是否确实由受信任的内核子系统生成。由于该钩子缺失,任何本地用户均可通过 request_key 系统调用提交任意 cifs.spnego 类型的密钥描述,内核无法区分合法请求与伪造请求。

用户空间层面cifs.upcall 以 root 权限执行时,从密钥描述中提取 piduidcreduidupcall_target 等字段并直接使用。这些字段完全由密钥描述构造者控制,cifs.upcall 未对其来源进行任何验证。

2.3 提权利用路径

攻击者的利用路径可分解为以下步骤:

  1. 构造恶意密钥描述:本地低权限用户构造包含精心设计的 piduidupcall_target 等字段的 cifs.spnego 密钥描述
  2. 触发上调用:通过 request_key("cifs.spnego", malicious_description, ...) 系统调用提交密钥请求
  3. root 权限执行:内核通过 /sbin/request-key 触发 cifs.upcall,该程序以 root 权限运行并解析攻击者提供的密钥描述
  4. 命名空间切换:利用 upcall_target 中指定的目标命名空间,cifs.upcall 执行命名空间切换操作
  5. NSS 模块加载:通过操纵 NSS(Name Service Switch)模块加载路径,诱导 cifs.upcall 加载攻击者控制的共享库
  6. 代码执行:恶意共享库在 cifs.upcall 的 root 上下文中执行,完成权限提升

利用需满足以下前置条件:

  • 系统安装 cifs-utils 并保留默认 cifs.spnego request-key 规则
  • Linux 内核 CIFS 模块可加载或内置
  • 启用非特权用户命名空间与挂载命名空间
  • 未被 AppArmor/SELinux 默认策略阻断(部分发行版默认阻断)

3. 影响范围

3.1 受影响版本

内核层面,自 2007 年起所有支持 CIFS 且未包含补丁 3da1fdf4efbc 的 Linux 内核版本均受影响。cifs-utils ≥ 6.14 版本受影响(含部分旧版回溯修复引入问题的版本)。

已确认受影响的操作系统发行版:

  • Linux Mint 21.3 / 22.3(Cinnamon)
  • CentOS Stream 9(GNOME)
  • Rocky Linux 9(Workstation)
  • Kali Linux 2021.4 / 2022.4 / 2023.4 / 2024.4 / 2025.4 / 2026.1(headless)
  • AlmaLinux 9.7(Workstation / Azure Cloud Image)
  • SUSE Linux Enterprise Server 15 SP7、SLES SAP 15 SP7、SLES SAP 16

3.2 影响评估

该漏洞影响量级为百万级。由于 CIFS 是 Linux 内核的内置模块,且 cifs-utils 在多数企业级发行版中默认安装,实际暴露面极为广泛。结合非特权用户命名空间在容器化环境中的普遍启用,该漏洞对云原生基础设施构成显著威胁。

4. 复现验证

ICE Lab 已在受控环境中对 CIFSwitch 漏洞完成复现验证。在运行受影响内核版本、安装 cifs-utils 并启用非特权用户命名空间的 Linux 系统上,以普通用户身份通过构造恶意 cifs.spnego 密钥描述发起 request_key 调用,成功触发 root 权限的 cifs.upcall 执行,验证了从本地低权限到 root 的完整提权路径。PoC 与 EXP 均已公开,技术细节已披露。

5. 修复方案

内核补丁 3da1fdf4efbc490041eb4f836bf596201203f8f2 已合并至主线,建议将内核升级至包含该补丁的版本。同时需更新 cifs-utils 软件包至修复版本。

临时缓解措施(适用于无法立即升级的环境):

  1. 非必要场景卸载 cifs-utils 或禁用 CIFS 内核模块加载
  2. 删除或覆盖默认的 cifs.spnego 规则——在无需 Kerberos 认证的 CIFS 场景下,可创建空规则阻断 cifs.spnego 请求
  3. 通过 sysctl 禁用非特权用户命名空间,阻断利用路径中的命名空间切换环节

结论

CIFSwitch 漏洞的核心问题在于内核密钥管理框架的信任边界缺失——vet_description 钩子的空缺使得内核无法验证密钥描述的真实来源,而 cifs.upcall 对用户空间输入的盲目信任进一步放大了这一缺陷。该漏洞无需内存损坏即可实现权限提升,且影响范围覆盖 2007 年以来大量未打补丁的 Linux 发行版,具备高利用价值。内核补丁已发布,建议受影响用户尽快完成升级。

参考文献

[1] OSS-Security. "Linux Kernel CIFS Local Privilege Escalation." https://seclists.org/oss-sec/2026/q2/717

[2] Asim. "CIFSwitch: From Key Descriptions to Root." https://heyitsas.im/posts/cifswitch/

[3] Linux Kernel. "Commit 3da1fdf4efbc: CIFS Fix vet_description." https://github.com/torvalds/linux/commit/3da1fdf4efbc490041eb4f836bf596201203f8f2