Linux 上挂载选项中的 nodev 的含义

Linux 上挂载选项中的 nodev 的含义

根据谷歌搜索,我的理解是 mount 中的“nodev”选项不允许在已安装的文件系统上创建设备文件。我尝试进行如下快速检查,看看我的理解是否正确,但我发现即使在使用“nodev”选项进行挂载后,我也能够创建设备文件:

root@dev16:/home/vagrant# mount -o nodev /dev/sda1 ./mnt-test/
root@dev16:/home/vagrant/mnt-test# ls
bin   dev  initrd.img      lib    lost+found  mnt  proc  run   snap  sys  usr      var      vmlinuz.old
boot  etc  home    initrd.img.old  lib64  media       opt  root  sbin  srv   tmp  vagrant  vmlinuz

root@dev16:/home/vagrant/mnt-test# mknod foobar c 1 5
root@dev16:/home/vagrant/mnt-test# ls -ltr foobar
crw-r--r-- 1 root root 1, 5 Aug  3 06:11 foobar

谁能告诉我:

  1. 这里有什么问题?
  2. 另外让我知道在这里创建一个名为“foobar”的设备文件会如何导致潜在的安全漏洞(因为使用nodev选项的全部目的似乎更安全)?
  3. https://haryachyy.wordpress.com/2019/04/17/learning-dpdk-huge-pages/ 我们有mount -t hugetlbfs nodev /mnt/huge,但根据安装语法,“nodev”应该带有“-o”。这个语法正确吗?

答案1

您仍然可以创建设备节点,但如果使用该选项挂载文件系统nodev,则该文件系统上的任何设备节点行不通的。

例如,让我们为临时文件系统创建一个简单的图像文件:

$ dd if=/dev/zero of=/tmp/test.img bs=1024 count=10240
10240+0 records in
10240+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0141206 s, 743 MB/s
$ sudo mke2fs /tmp/test.img
[normal mke2fs messages...]
$ sudo mount -o loop,rw /tmp/test.img /mnt

现在我们有一个临时的额外文件系统(大小为 10M),可用于测试,安装在/mnt.

让我们为第二个文本模式虚拟控制台创建一个重复的设备节点,或者/dev/tty2

$ ls -l /dev/tty2
crw--w---- 1 root tty 4, 2 Aug  4 18:34 /dev/tty2
$ sudo mknod /mnt/hacker_tty c 4 2
$ sudo chown $(whoami) /mnt/hacker_tty
$ ls -l /mnt/hacker_tty
crw-r--r-- 1 my_username root 4, 2 Aug  4 18:46 /mnt/hacker_tty

请注意,我们的额外设备的名称可以是任何名称:重要的是设备类型(c对于字符,b对于块设备)以及主要和次要设备编号(分别为42)与目标设备匹配。这些确定设备节点与哪个内核设备实例通信。

现在,我们可以在虚拟控制台中写入我们想要的任何文本没有root权限:

$ printf "I am an evil hacker\nin your computer\ndoing evil things.\n" >/mnt/hacker_tty

Ctrl+ Alt+F2查看该消息。然后返回常规会话所在的虚拟控制台,通常是Ctrl+ Alt+F7Ctrl+ Alt+,F1具体取决于您的发行版以及是否使用 GUI 会话。

现在,让我们卸载测试文件系统,使用nodevmount 选项再次挂载它,然后再试一次。

$ sudo umount /mnt
$ sudo mount -o loop,rw,nodev /tmp/test.img /mnt
$ printf '\nCurses!\nI have been foiled!\n' >/mnt/hacker_tty
bash: /mnt/hacker_tty: Permission denied
$ ls -l /mnt/hacker_tty
crw-r--r-- 1 my_username root  4, 2 Aug  4 18:46 hacker_tty

可见权限不变,但设备节点不起作用。

即使成为 root 也无济于事:

$ sudo -i
[sudo] password for my_username:
# printf '\nCurses!\nI have been foiled!\n' >/mnt/hacker_tty
bash: /mnt/hacker_tty: Permission denied
# exit
$

一旦我们的实验令人满意,让我们自己清理一下:

$ sudo umount /mnt
$ rm /tmp/test.img

请注意,这是一个精心设计的示例,应该相对无害。通过克隆与包含根文件系统的块设备相匹配的设备节点,并使用合适的工具来理解文件系统结构,您可以绕过文件系统权限并读取内容/etc/shadow(即每个用户的密码哈希值!) 。或者您可以使用您选择的内容覆盖包含 root 密码哈希的块。


在 中mount -t hugetlbfs nodev /mnt/huge,文件系统类型hugetlbfs实际上并不需要与其关联的设备,但 mount 命令并不知道这一点。因此,“device”参数中指定的任何内容(例如您的情况下的 nodev)都将被完全忽略。

的作者是那一页只是用作nodev“无设备”的简写 - 作为虚拟占位符,与安装选项完全无关。要实际指定安装选项,您需要-o nodev.是的,这是文档中的一个不幸且令人困惑的选择。

相关内容