mknod
我注意到,当创建除常规文件、FIFO 或 Unix 套接字之外的节点时,该命令需要 root 权限。
这是为什么?普通用户如何mknod
使用创建普通文件时不能使用的命令来损害系统或损害其他用户的隐私?
答案1
如果您可以任意调用 mknod,那么您可以创建拥有且可访问的设备文件由你对于任何设备。设备文件使您可以无限制地访问相应的设备;因此,任何用户都可以任意访问设备。
例如,假设/dev/sda1
拥有一个您无权访问的文件系统。 (比如说,它被安装到/secret
)。在这里,/dev/sda1
是块特殊 8,1,因此如果您可以调用 mknod,例如,那么您可以通过自己的设备文件mknod ~/my_sda1 b 8 1
访问任何内容,而不管 上的任何文件系统限制。 (您将设备作为没有任何结构的平面文件获取,因此您需要知道如何处理它,但有一些库用于访问块设备文件。)/dev/sda1
/dev/sda1
/dev/sda1
同样,如果您可以创建自己的/dev/mem
或副本/dev/kmem
,那么您可以检查主内存中的任何内容;如果您可以创建自己的/dev/tty*
或副本/dev/pts/*
,那么您可以记录任何键盘输入 - 等等。
因此,mknod在普通用户手中是有害的,因此必须限制其使用。
注意这就是为什么nodev
安装选项对于移动设备至关重要,否则您可以在准备好的移动介质上引入您自己的设备文件。
答案2
使用mknod
,您可以创建设备专用文件,允许对硬件的原始访问。也就是说,内核查看设备专用文件的权限来决定是否允许给定用户对硬件进行原始访问,而不是对配置中的任何内容或类似内容进行访问。
例如,在 Debian 上,与光驱相关的设备是使用 0660 权限位、用户root
和组创建的cdrom
;所以任何人root
或者在组中可以执行诸如“使用而不是通过已安装的文件系统cdrom
创建映像”之类的操作dd
。这对您来说可能没有多大意义,直到您意识到您也可以写入的/dev/dvd
硬盘(例如,)也会发生同样的情况。/dev/sda
虽然设备专用文件通常是在该/dev
目录下创建的,但 Linux 系统中并没有固有的东西需要它;任何文件系统(未使用该nodev
选项安装的)都可以包含设备节点。将设备节点链接到实际设备的唯一因素是类型(块或字符)以及主要节点和次要节点。
因此,如果普通用户能够创建设备专用文件,那么他们将能够绕过所有内核安全性并通过简单地创建设备专用文件(例如在其主目录中)并使用该文件来直接访问所有硬件对硬盘进行核攻击。
因此,创建设备专用文件只能由root
.
答案3
除了常规、FIFO 和套接字文件类型之外,mknod 还可以创建设备文件。这些用于访问设备。
授予对设备的访问权限被视为特权操作。一般来说,我们不想创建任意设备节点并使普通用户可以访问它们。那会很糟糕。
[旁白:通常通过更改现有设备节点上的权限来授予设备访问权限。在标准 Linux 上,/dev/
由 控制udev
,因此您可以使用额外的 udev 规则]。
例子
$ mount|grep -w /
/dev/mapper/vg_fossil-root on / type ext4 (rw,seclabel,data=ordered)
$ ls -l /dev/mapper/vg_fossil-root
lrwxrwxrwx. 1 root root 7 Jan 18 08:46 /dev/mapper/vg_fossil-root -> ../dm-0
$ ls -l /dev/dm-0
brw-rw----. 1 root disk 253, 0 Jan 18 08:46 /dev/dm-0
作为根用户:
# mknod root-partition b 253 0
# chmod a+rw root-partition # make file available as if created as a normal user
现在我可以直接访问存储文件系统的设备。
$ ls -l root-partition
brw-rw-rw-. 1 root root 253, 0 Jan 18 15:05 root-partition
我可以从原本没有权限的文件中读取数据
$ grep secret root-parition
Binary file root-partition matches
或者删除下一个命令前面的“echo”,你的文件系统将不再存在。
$ echo dd if=/dev/zero of=root-partition
清理
创建额外的设备文件供使用后,您可以安全地删除它们,而不会损坏任何东西。
$ rm root-partition
当然,除非您犯了错误并删除了错误的文件,或者可能删除了所有文件。此命令不会提供撤消/取消删除或提示确认。命令行是无情的:)。唯一的保护是没有-r
或*
,它不会删除任何目录。
答案4
您可以用来mknod
访问chroot
“监狱”中的设备文件(例如根文件系统的设备)