我今天遇到了这个例子,我想知道 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
?
首先是第一件事:我可以写入目录(创建新条目)并且可以
cd
对目录执行 ( )。不过,我无法读取该目录。这意味着不直观。当您在 Unix 系统中使用目录时,目录指向inode,这与指针条目不同。能够在目录树中跟踪引用是由
eXecute
位控制的。对于树下的每个目录级别,操作系统在下降到下一个级别之前检查执行位。同时,该
Read
位控制对 inode 内容的访问。您可以在文件系统上引用的所有内容都是 inode 条目。目录或文件,它们指向一个inode。在这种情况下,目录 inode 是 121100226。读取权限告诉我是否可以访问用户空间中的 inode 文件以读取其内容。目录 inode 的内容是对其他文件的引用。内核总是可以读取它。作为用户,您受内核关于其中条目的决定的控制。
因此,由于
ls
试图读取内容以告诉我那里有什么(由Read
标志检查),它被拒绝了。但是,由于我仍然有eXecute
权限,如果我想要的文件上面的目录都允许我进入,内核将允许我遍历到我指定的文件eXecute
,无论我是否可以读取它们以查看引用。因此,总结一下目录,将执行视为主权限。没有它,你不能进入目录做任何事情。之后,将它们视为两列文件。如果您具有读取权限,则可以查看条目。如果您具有写入权限,则可以添加或删除条目。如果您缺少这两个权限但具有执行权限,则可以引用列表中的条目,但不能读取列表。
这是 inode 的一个很好的说明性示例,以及它们如何表示磁盘引用上的目录引用和文件块:http: //teaching.idallen.com/dat2330/04f/notes/links_and_inodes.html
正如您所预料的那样,很多人已经解释了您的示例如何完全合乎逻辑。“按设计工作。”
要回答您的问题,如果您能够欺骗操作系统让您查看您不应该查看的文件/inode 信息,那将是一个严重的内核错误。 文件权限与 inode 本身相关联,并在您实际尝试打开文件时应用。如果您没有从其他答案中找到它,我会指出一个目录像任何文件一样有一个索引节点,只是权限在应用于目录时意味着略有(或很大)不同。
文件权限是最初的 Unix 安全机制,现在仍然是 Unix/Linux 安全的组成部分。任何你可以编造的看起来你已经愚弄了系统的场景几乎肯定是你不理解正确行为是什么的情况。如果你找到了绕过安全的合法方法,即使是黑客攻击,它也会被认为是一个严重的安全漏洞,并且会成为最优先修补的漏洞之一。
例如,如果你能够读取一个你不应该读取的文件的内容,你就可以窃取所有用户的(散列)密码和
ssh
系统的私钥ssh
以及每个人的私钥系统(尽管希望那些将被加密)并通过设备 inode 读取系统内存的全部内容(以及更多)。如果您可以读取您不应该读取的文件信息,那么危险性就会降低,但它仍然会被视为重大违规行为。我相信愚弄你的具体事情是下面的每个目录
/
至少有两个链接:目录在其父目录中的条目和它.
自身(加上..
来自子目录的任何链接)。当您键入ls -ld .
它时,它会查看.
当前目录中的链接(您有权读取),而不是从父目录(您无权读取)到当前目录的链接。对于 +x,我发现了解它如何在目录上工作的最简单方法是“进入”目录的权限。没有 +x 根本无法进入目录,即使您有读写权限。如果不允许您进入目录,则无论子目录是否设置了 +x,您都无法进入。因此,如果您拥有
fooledYa/ohReally/foo.txt
并且fooledYa
是 chmod 0000,假设没有其他 ACL 系统覆盖文件模式,则只有 root 能够进入ohReally/
或打开foo.txt
,即使他们知道文件的路径而不必列出目录内容。这些权限的一个奇怪之处在于,如果目录是 +r 而不是 +x,则您有权读取目录内容,因此您可以从外部“窥视”并读取目录中的文件列表,但没有 + x 您将无法进入目录以访问 (
stat
) 单个文件。因此,如果您尝试访问ls -l
这样的目录,您将获得文件名,但文件大小、模式、所有权等所有其他字段都将是?
标记。