根据谷歌搜索,我的理解是 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
谁能告诉我:
- 这里有什么问题?
- 另外让我知道在这里创建一个名为“foobar”的设备文件会如何导致潜在的安全漏洞(因为使用nodev选项的全部目的似乎更安全)?
- 从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
对于块设备)以及主要和次要设备编号(分别为4
和2
)与目标设备匹配。这些确定设备节点与哪个内核设备实例通信。
现在,我们可以在虚拟控制台中写入我们想要的任何文本没有root权限:
$ printf "I am an evil hacker\nin your computer\ndoing evil things.\n" >/mnt/hacker_tty
按Ctrl+ Alt+F2查看该消息。然后返回常规会话所在的虚拟控制台,通常是Ctrl+ Alt+F7或Ctrl+ Alt+,F1具体取决于您的发行版以及是否使用 GUI 会话。
现在,让我们卸载测试文件系统,使用nodev
mount 选项再次挂载它,然后再试一次。
$ 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
.是的,这是文档中的一个不幸且令人困惑的选择。