CVE-2023-3493


环境搭建

commit 	bcf876870b95592b52519ed4aafcf9d95999bc9c

总的config:

defconfig+menuconfig

CONFIG_CONFIGFS_FS=y  #支持img
CONFIG_SECURITYFS=y #支持img
CONFIG_DEBUG_INFO=y #调试
CONFIG_USER_NS=y #支持新的namespace
CONFIG_USERFAULTFD=y #支持userfaultfd
CONFIG_OVERLAY_FS=y #支持overlay文件系统
CONFIG_FS_MOUNT=y #支持挂载文件系统
FS_USERNS_MOUNT=y
CONFIG_OVERLAY_FS_UNPRIVILEGED=y #允许普通用户在namespace中挂载

(同样是修改了objtool的一个代码)

前置知识

参考:CVE-2021-3493复现 - 一生热爱 - 博客园 (cnblogs.com)

Overlay文件系统

Overlay Fs联合文件系统源码解析系列(一)挂载过程详解-51CTO.COM :star:

它可以将两个不同的文件系统(通常是只读的根文件系统和可读写的另一个文件系统)合并成一个联合文件系统。它使用了一个overlay mount机制,可以将两个文件系统的内容堆叠在一起,同时保留各自的文件系统结构和权限控制。

Overlayfs的使用非常广泛,特别是在容器技术中。在容器技术中,通常使用一个基础镜像来创建一个容器,并在容器中叠加一个额外的可写层,这样可以实现容器的快速创建和部署,并且避免了在每个容器中都复制一份完整的文件系统的问题。

linux capabilities机制

关于suid:

namespace

【CVE-2021-3493】——漏洞复现、原理分析以及漏洞修复-CSDN博客

CVE-2021-3493复现-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com :star:

在新user namespace中uid 0等于root默认拥有所有capability,普通用户的capability是在execve()时由task->real_cred->cap_inheritable + file capability综合而成。

文件权限

rwx-rwx-rwx 分别表示文件所有者、同组用户、其他用户;

root 用户拥有所有权限;

对于两个 user namespace ,如果使用了相同的 mount namespace 才能够相互看到对方创建的文件,否则直接看不到;然后就是 uid && gid 的映射问题了,如果映射了,则通过转换可具有相同的权限,但是实际上从全局的角度来看,这就是同一个进程;

漏洞成因

首先创建一个 user namespace;

在这个namespace 中给自己root权限;

然后使用 Overlay文件系统 把一个之前打不开的文件挂载进来;

然后给这个文件赋权;(setxattr,最后会调用到cap_convert_nscap函数)

cap_convert_nscap函数用于校验被设置Capabilities权限的文件或目录的namespace与当前环境的namespace是否一致,如果不一致,则无法赋予目标文件或目录特定的Capabilities权限。

vfs_setxattr函数是设置文件或目录Capabilities权限的核心代码:

int  
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
int error;

error = xattr_permission(inode, name, MAY_WRITE);
if (error)
return error;

inode_lock(inode);
error = security_inode_setxattr(dentry, name, value, size, flags);
if (error)
goto out;

error = __vfs_setxattr_noperm(dentry, name, value, size, flags);

out:
inode_unlock(inode);
return error;
}

该函数在设置cap时缺少对cap_convert_nscap函数的调用,导致了并不能确认被设置cap的文件的namespace是否和当前进程namespace相同;

漏洞复现

mkdir work merged upper lower
unshare --fork --user --mount --map-root-user

unshare --mount --uts --ipc --net --pid --fork --map-root-user --user --mount-proc /bin/sh


mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work ./merged

setcap CAP_SETUID=eip merged/a.out

exp的主要思路就是先创建必要的目录;

然后unshare创建新的namespace;

然后使用mount+overlay进行挂载;

笔者遇到的最大问题就是这个挂载没有权限;

检查挂载是否权限的代码位于/fs/super.c中的mount_capable:

我们的fc->fs_type->fs_flags是0,而宏定义FS_USERNS_MOUNT的值是8;

查找资料:CVE-2021-3493 Ubuntu内核OverlayFS权限逃逸漏洞分析-安全客 - 安全资讯平台 (anquanke.com)

而在5.8的主线代码中:

却没有这个定义;

在某5.11的源码中找到了这个定义:

但是由于5.11这个洞就被patch了:

必须找ubuntu才行;

最终找到一个commit:8768341327a76cdaea772993676365fbc219d2dd

关于版本的印证

通过分析可知,触发的条件有2:

  1. 在ovl_fs_type结构体中有.fs_flags=FS_USERNS_MOUNT的定义;
  2. 在vfs_setxattr函数中没有cap_convert_nscap这个检查;

调试命令

gdb -ex "target remote localhost:1234" -ex "file /mnt/hgfs/VMshare2/cve/all/CVE-2021-3493/vmlinux" -ex "c"

参考


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录