☠
🐛
2026.06.05 | QVD-2026-29453 | 19年暗门
CIFS 是 Linux 访问 Windows 共享文件夹的协议。当你用 Linux 挂载一个 Windows 共享目录的时候,系统需要做 Kerberos 认证。
这个认证过程会通过一个叫 request_key 的机制,叫醒一个 root 权限 的帮手程序——cifs.upcall。
内核 CIFS 模块
➞
发出认证请求
➞
request_key
➞
cifs.upcall
➞
完成认证
请求里带着一串描述信息,告诉 cifs.upcall 去哪认证、用什么凭据、找哪个进程。一切基于一个默认的前提——这些描述信息来自内核,是可信的。
注意!root 权限的进程被"叫醒"了!
但内核没有验证这个前提啊!本来内核有个校验机制叫 vet_description,专门验证请求是不是真的来自 CIFS 模块。
CIFS 没有实现这个校验!
结果就是,本地任何用户都能伪造一段描述信息,内核分不清这是真的 CIFS 认证请求还是用户手搓的假货。
19年了,这个校验一直是空的...
root 进程被叫醒之后,为什么会去执行攻击者的代码?
1
伪造描述信息(带恶意 pid 字段)
2
cifs.upcall 根据 pid 切换到对应进程的命名空间
3
root 进程走进了攻击者的地盘
4
攻击者在命名空间里改掉"查用户"的配置
5
让"查用户"变成"加载我写的恶意代码"
6
root 进程一查用户,恶意代码就跑起来了
恶意代码也很简单:往 sudoers 里加一条,让用户免密 sudo。也就是不用密码提权到 root。
普通用户
➞
伪造请求
➞
进入恶意命名空间
➞
root 权限
—— 笔记整理完毕。核心就一句话:内核太信任用户空间的数据了。