权限下降:允许只读文件系统上的非特权进程对文件进行只读访问

权限下降:允许只读文件系统上的非特权进程对文件进行只读访问

一个理想的最低特权进程应该能够对文件系统上的数据进行只读访问,文件系统本身是只读的。因此,这就是情况

root@linux# ###(1) filesystem is untrusted + readonly
root@linux# grep untrusted_ro_fs /proc/mounts       
/dev/sdb1 /mnt/untrusted_ro_fs ext4 ro 0 0

root@linux# ###(2) no read permissions for (o)thers for /mnt/untrusted_ro_fs/root
root@linux# ls -ld /mnt/untrusted_ro_fs/root
drwxr-x--- 1 root root 1138 Jul  3 21:13 /mnt/untrusted_ro_fs/root

root@linux# ###(3a) unpriviledge process ls (run with uid=9999 and gid=9999) no read access
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups ls /mnt/untrusted_ro_fs/root
ls: cannot open directory '/root': Permission denied

root@linux# ###(3b) unpriviledge process cat (run with uid=9999 and gid=9999) no read access
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /mnt/untrusted_ro_fs/root/file
cat: /mtn/untrusted_ro_fs/root/file: Permission denied

root@linux# ###(4) file permission change fails on ro filesystem
root@linux# chmod a+rx /mnt/untrusted_ro_fs/root/
chmod: changing permissions of '/mnt/untrusted_ro_fs/root/': Read-only file system

我寻求如何完成上述读取访问(3a + 3b)的答案。这是我想出的途径。理想的答案是 a) 提供替代解决方案或 b) 详细说明所提供的解决方案:

  • a) “守护进程式特权下降”:以 root 身份打开文件描述符,然后setuid在进程内部打开文件描述符。

  • b) “使用 FIFO”,这似乎仅有助于 (3b)
    root@linux# mkfifo /access_to_root_file.fifo
    root@linux# chown root:9999 /access_to_root_file.fifo
    root@linux# chmod 0640 /access_to_root_file.fifo
    root@linux# cat /mnt/untrusted_ro_fs/root/file > /access_to_root_file.fifo & root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /access_to_root_file.fifo

  • c)“覆盖”
    root@linux# mkdir /mnt/upper /mnt/work /mnt/merged
    root@linux# mount -t overlay overlay -o lowerdir=/mnt/untrusted_ro_fs,upperdir=/mnt/upper,workdir=/mnt/work /mnt/merged root@linux# chmod a+rx /mnt/merged/root root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups ls /mnt/merged/root &>/dev/null && echo SUCCESS-ls
    SUCCESS
    root@linux# chmod a+rx /mnt/merged/root/file root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /mnt/merged/root/file &>/dev/null && echo SUCCESS-cat
    SUCCESS

  • d) “虚拟化”(即 kvv + qemu),其中为虚拟机设置对不受信任文件系统的块设备的只读访问。

答案1

对我来说最自然的方法是创建具有不同访问规则的文件系统的另一个视图,如下所示挂载具有特定用户读/写访问权限的设备。和绑定文件系统:

mkdir -m 700 /mnt/permissive_view
chown 9999:9999 /mnt/permissive_view
bindfs -r -M 9999 /mnt/untrusted_ro_fs /mnt/permissive_view

然后在 下有 9999 个访问文件/mnt/permissive_view

该选项-M 9999使用户 9999 将自己视为所有文件的所有者。根据您的具体用例,您可能需要不同的映射,例如-u 9999(使所有用户将 9999 视为所有者)或--map=0/9999(使 9999 仅成为 root 拥有的文件的表面所有者)。

相关内容