环境:
- 操作系统:CentOS 8(generic/centos8 Vagrant box)
- 虚拟化:VMware-Workstation 16.1.0 build-17198959
重现步骤:
- 创建设备新策略
cd /sys/fs/cgroup/devices
mkdir custom_poc
- 验证哪个设备被用作 tty(多种方法):
使用 tty:
root@centos8# tty /dev/pts/0
获取过程标准输入:
ls -l /proc/$$/fd/{0,1,2} lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/0 -> /dev/pts/0 lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/1 -> /dev/pts/0 lrwx------. 1 root root 64 Mar 5 11:25 /proc/2446/fd/2 -> /dev/pts/0
- 将 tty 设备添加到
devices.deny
:
检查设备主要和次要编号:
ls -l /dev/pts/0 crw--w----. 1 vagrant tty 136, 0 Mar 5 11:28 /dev/pts/0
拒绝访问:
root@centos8# echo 'c 136:0 w' > /sys/fs/cgroup/devices/custom_poc/devices.deny root@centos8# echo $$ > tasks root@centos8# echo 'a' > /dev/pts/0 -bash: /dev/pts/0: Operation not permitted
但是,即使在删除对 STDIN 设备的访问之后,我的 Bash 终端也能正常工作。这是一个简单的 whoami 的输出:
root@centos8# whoami root
从内核文档:
这些限制仅适用于打开设备文件。这与大多数其他访问控制权限(例如标准 Unix 权限)相同。
以读写模式打开文件后,您可以对其进行读写。没有对每个
read()
and应用访问控制write()
,这会增加太多开销,并且可能会在应用程序中导致非常令人惊讶的行为。mmap
例如,当文件在内存中是 ped()时,也很难强制执行。在您的情况下,在您应用限制之前,
/dev/pts/0
已打开(可能由其父级之一,可能是终端仿真器,可能getty
,可能sshd
...,并且 shell 继承了文件描述符)。类似地,在派生一个要执行的进程时
whoami
,子进程继承 fds,并且这些 fds 在执行时被保留,whoami
并且whoami
只是在write(1, "root\n", 5)
不打开设备文件的情况下执行。但是
echo a > /dev/pts/0
,shell 确实会尝试打开文件以执行该重定向,并且在此时被阻止这样做。