我试图回答这个问题:由于没有读写权限,无法对磁盘进行 fsck对此我回答道:
答案隐含在
fsck
的输出中。更改所有权:
# chown username /dev/sdb5 $ fsck /dev/sdb5
或者不改变它而是成为 root(可能更好):
# fsck /dev/sdb5
如果设备已安装,请先将其卸载。
暗示的fsck
输出是:
您必须具有文件系统的读/写访问权限或成为 root 用户。
然后另一位用户在我的回答中评论如下:
永远不要更改块设备的所有权。这会打开安全漏洞,通常还会阻止普通用户做一些愚蠢的事情。因此,您描述的 sudo 选项是可行的方法。也许您想采纳您的答案。
这让我很困惑,因为通常情况下,我会通过mkfs
在块设备上运行来创建文件系统,例如sudo mkfs.ext4 /dev/block_device
。所以我假设要与文件系统交互,我必须通过块设备文件进行交互。现在,如果文件系统位于 /dev/block_device 中,当我更改块设备的所有权或权限时,这是否意味着我正在更改文件系统的所有权或权限?
如果我做出了错误的假设,并且这些事情并不等同,那么如何改变文件系统的所有权或权限?
或者说这根本就不该发生?为什么?
答案1
当您更改块设备的所有者或所有权时,您不会更改文件系统中的任何内容。如果您将chown
块设备交给普通用户,则会发生这种情况:您完全绕过了文件系统访问权限。
块设备只是用于存放非结构化数据的容器。文件系统使这些数据结构化且可用。通常,所有用户都通过文件系统间接访问块设备,请求读取/打开/写入文件或文件夹。所有这些都基于文件系统维护的访问权限,授予或拒绝对文件或文件夹的访问。
现在,当普通用户对块设备具有读/写访问权限时,就可以绕过文件系统的访问权限,因为您可以直接从块设备“抓取”文件。
让我们来看看。
首先,我们创建一个只能由访问的文件夹和文件root
,并从块设备开始。
root@host:~# ll /dev/vda1
brw-rw---- 1 root disk 253, 1 Jul 26 18:52 /dev/vda1
root@host:~# mkdir /secure-folder
root@host:~# chmod 700 /secure-folder/
root@host:~# ll -d /secure-folder
drwx------ 2 root root 4096 Jul 27 20:06 /secure-folder/
root@host:~# echo "MySuperSecretText" > /secure-folder/my-secure-file
root@host:~# chmod 400 /secure-folder/my-secure-file
root@host:~# ll /secure-folder/my-secure-file
-r-------- 1 root root 9 Jul 27 19:19 /secure-folder/my-secure-file
该文件夹和文件只能由用户访问root
,即使在更改块设备的所有者后,它仍然如您所期望的那样。
user@host:~$ ll /secure-folder/
ls: cannot open directory /secure-folder/: Permission denied
user@host:~$ ll /secure-folder/my-secure-file
ls: cannot access /secure-folder/my-secure-file: Permission denied
root@host:~# chown user /dev/vda1
root@host:~# ll /dev/vda1
brw-rw---- 1 user disk 253, 1 Jul 27 20:16 /dev/vda1
user@host:~$ ll /secure-folder/
ls: cannot open directory /secure-folder/: Permission denied
user@host:~$ ll /secure-folder/my-secure-file
ls: cannot access /secure-folder/my-secure-file: Permission denied
在这种情况下,您的文件系统阻止了user
访问它无权访问的文件。
但是由于user
具有对块设备的读/写访问权限,我们可以绕过文件系统。vda1
这是安装在 上的分区,/
并且debugfs
随附于e2fsprogs
,因此很确定是预安装的。
user@host:~$ debugfs /dev/vda1 -R "ls -l /secure-folder"
67344 40700 (2) 0 0 4096 27-Jul-2017 19:33 .
2 40755 (2) 0 0 4096 27-Jul-2017 19:16 ..
45137 100400 (1) 0 0 18 27-Jul-2017 19:43 my-secure-file
好的,我可以列出我没有访问权限的文件夹中的目录条目。让我们看看我还能对我没有访问权限的文件做些什么。
user@host:~$ debugfs /dev/vda1 -R "cat /secure-folder/my-secure-file"
debugfs 1.42.9 (4-Feb-2014)
MySuperSecretText
好吧,我可以用这种方式读取文件内容。太棒了。我还能做什么呢?让我们在一个我通常无法访问的地方创建一个文件夹。
user@host:~$ debugfs -w /dev/vda1 -R "mkdir /secure-folder/attack"
debugfs 1.42.9 (4-Feb-2014)
root@host:~# ll /secure-folder/
total 16
drwx------ 2 root root 4096 Jul 27 19:33 ./
drwxr-xr-x 25 root root 4096 Jul 27 19:16 ../
drwxr-xr-x 2 root root 4096 Jul 27 20:29 attack/
-r-------- 1 root root 18 Jul 27 19:43 my-secure-file
root
哎呀。虽然我已将其创建为,但它仍然属于user
。嗯,还有什么可能呢?让我们试试。
首先,我们需要的块号/secure-folder/my-secure-file
。
user@host:~$ debugfs /dev/vda1 -R "blocks /secure-folder/my-secure-file"
debugfs 1.42.9 (4-Feb-2014)
913939
好的,块号913939
包含文件的数据/secure-folder/my-secure-file
。让我们使用它dd
来获取内容,4096
是 ext4 或 xfs 文件系统的默认块大小。再次成为可能,因为我可以作为普通用户在块设备上操作。
user@host:~$ dd if=/dev/vda1 of=/tmp/secure-file skip=913939 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.0214174 s, 191 kB/s
现在我们可以进行修改/tmp/secure-file
并将dd
其放回块设备上。
user@host:~$ cat /tmp/secure-file
XxXxxxxSecretText
user@host:~$ dd if=/tmp/secure-file of=/dev/vda1 seek=913939 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000356448 s, 11.5 MB/s
最后,作为root
用户,我们从文件系统视图查看文件。为了安全起见,我们首先使所有缓存无效以获取磁盘内容。
root@host:~# echo 3 > /proc/sys/vm/drop_caches
root@host:~# cat /secure-folder/my-secure-file
XxXxxxxSecretText
root@host:~# ll /secure-folder/my-secure-file
-r-------- 1 root root 18 Jul 27 20:39 /secure-folder/my-secure-file
我更改了属于普通用户的文件root
,无需更改任何访问权限。所有这些都基于我对底层块设备具有读/写访问权限这一事实。
这只是一个简单的示例,高级攻击者可以将二进制代码放入您的文件系统中,或将众所周知的二进制文件与恶意二进制文件交换。通常,所使用的工具几乎预装在任何发行版中。
好吧,我必须承认,当您通过 重新启动时,块设备上的访问权限会被设置回来udev
,但是当您授予普通用户对块设备的读/写访问权限时,就会出现安全问题。
希望它不会太令人困惑并且有助于理解文件系统和块设备之间的区别。
答案2
我认为你误解了其中的含义。作为 sudo 组的成员,你默认拥有 R/W 访问权限。这并不意味着你实际上是 root,只是你拥有类似的访问权限,具体取决于sudo 是如何配置的。
进一步阅读:
https://help.ubuntu.com/community/Sudoers
https://www.tecmint.com/su-vs-sudo-and-how-to-configure-sudo-in-linux/