![Linux 文件权限可以被欺骗吗?](https://linux22.com/image/585838/Linux%20%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E5%8F%AF%E4%BB%A5%E8%A2%AB%E6%AC%BA%E9%AA%97%E5%90%97%EF%BC%9F.png)
今天我偶然看到了这个例子,我很好奇 Linux 文件权限对于隐藏信息有多可靠
$ mkdir fooledYa
$ mkdir fooledYa/ohReally
$ chmod 0300 fooledYa/
$ cd fooledYa/
$ ls
>>> ls: cannot open directory .: Permission denied
$ cd ohReally
$ ls -ld .
>>> drwxrwxr-x 2 user user 4096 2012-05-30 17:42 .
现在我不是 Linux 操作系统专家,所以我毫不怀疑有人会向我解释,从操作系统的角度来看,这是完全合乎逻辑的。但是,我的问题仍然存在,是否有可能欺骗(而不是破解)操作系统,让你查看你不应该查看的文件/inode 信息?如果我发出命令chmod 0000 fooledYa
,经验丰富的程序员能否找到一些迂回的方式来读取文件,例如fooledYa/ohReally/foo.txt
?
答案1
$ ls -lhd fooledYa/
d-wx------ #snip
首先,我可以写入目录(创建新条目),也可以cd
对目录执行()。但是,我无法读取目录。这意味着什么并不直观。
当您在 Unix 系统中使用目录时,目录指向索引节点,这与指针条目不同。能否在目录树中跟踪引用由位控制eXecute
。对于目录树中的每个目录级别,操作系统在下降到下一级之前都会检查执行位。
同时,Read
位控制访问 inode 的内容。文件系统上可以引用的所有内容都是 inode 条目。目录或文件都指向 inode。
ls -ldi fooledYa/
121100226 d-wx------ #snip
在这种情况下,目录 inode 为 121100226。读取权限告诉我是否可以在用户空间中访问该 inode 文件以读取其内容。目录 inode 的内容是对其他文件的引用。内核始终可以读取它。您作为用户受内核关于其中条目的决定控制。
因此,由于ls
尝试读取内容以告诉我那里有什么(由标志检查Read
),因此被拒绝。eXecute
但是,由于我仍然有权限,因此,如果我想要的文件上方的目录都允许我进入,则内核将允许我遍历我指定的文件eXecute
,无论我是否可以读取它们以查看引用的内容。
因此,总结一下目录,将执行视为主权限。没有它,您无法进入目录执行任何操作。之后,将它们视为一个两列文件。如果您具有读取权限,则可以看到条目。如果您具有写入权限,则可以添加或删除条目。如果您没有这两个权限但具有执行权限,则可以引用列表中的条目,但无法读取列表。
这是 inode 的一个很好的说明性示例,以及它们如何表示目录引用和磁盘引用上的文件块:http://teaching.idallen.com/dat2330/04f/notes/links_and_inodes.html
答案2
正如您所预料的,很多人都已经解释了您的示例是如何完全合乎逻辑的。“按设计工作。”
回答你的问题,如果您能够欺骗操作系统,让您查看不应该查看的文件/inode 信息,那么这将是一个严重的内核错误。 文件权限与 inode 本身相关联,并在您实际尝试打开文件时应用。如果您没有从其他答案中领悟到这一点,我要指出的是,目录和任何文件一样都有一个 inode,只是权限在应用于目录时含义略有(或很大)不同。
文件权限是原始的 Unix 安全机制,并且仍然是 Unix/Linux 安全的一个组成部分。任何看起来像是欺骗了系统的场景几乎肯定是你不了解正确行为的情况。如果你找到了一种绕过安全机制的合法方法,即使是黑客攻击,它也会被视为一个严重的安全漏洞,并且是需要修补的最高优先级之一。
例如,如果您能够读取您本不应该读取的文件的内容,那么您就可以窃取所有用户的(散列)密码、ssh
系统的私钥以及ssh
系统上每个人的私钥(尽管希望这些私钥是加密的),并通过设备 inode 读取系统内存的全部内容(甚至更多)。如果您可以读取您本不应该读取的文件信息,那么危险性会降低,但仍将被视为重大违规行为。
答案3
我认为欺骗您的具体原因是下面的每个目录/
至少有两个指向它的链接:目录在其父目录中的条目和目录.
本身内的条目(以及..
来自子目录的任何链接)。当您键入时,ls -ld .
它会查看.
当前目录中的链接(您有权限读取),而不是从父目录到当前目录的链接(您无权读取)。
对于 +x,我发现了解它在目录中如何工作的最简单方法是“进入”目录的权限。如果没有 +x,您根本无法进入目录,即使您有读写权限。如果您不被允许进入目录,则无论子目录是否设置了 +x,您都无法进入子目录。因此,如果您有并且是fooledYa/ohReally/foo.txt
chmod fooledYa
0000,假设没有其他 ACL 系统覆盖文件模式,只有 root 才能进入ohReally/
或打开,foo.txt
即使他们知道文件的路径,也不必列出目录内容。
这些权限的一个奇怪之处是,如果目录是 +r 而不是 +x,您有权读取目录内容,因此您可以从外部“窥视”并读取目录中的文件列表,但如果没有 +x,您将无法进入目录访问(stat
)单个文件。因此,如果您尝试访问ls -l
这样的目录,您将获得文件名,但文件大小、模式、所有权等所有其他字段都将被?
标记。