Unix 执行权限很容易被绕过。是多余的,还是背后的意图?

信息安全 linux 文件系统 权限 Unix
2021-09-06 09:49:35

unix 读取权限实际上与执行权限相同,因此如果一个进程具有写入权限,它也能够执行同一个文件。

这可以很容易地完成:首先,此过程必须将要执行的文件内容加载到缓冲区中。之后,它从共享库中调用一个函数,该函数解析缓冲区中的 ELF 并将其加载到正确的地址(可能在调用 execvp 时像往常一样覆盖旧进程)。代码跳转到新程序的入口点并且它正在被执行。

我很确定丹尼斯·里奇和肯·汤普森都知道这个问题。那么,如果它不能阻止任何具有读取权限的用户的任何进程执行,他们为什么还要发明这个权限,它背后的意图是什么,它的意义是什么?有这种感觉还是多余的?

这甚至可能是一个严重的安全问题,是否有任何系统依赖于 rw- 或 r- 权限的强度?

4个回答

还有一种更简单的方法可以绕过“执行”权限:将程序复制到您拥有的目录中并设置“执行”位。

“执行”权限不是安全措施。安全性在较低级别提供,操作系统限制特定操作。这样做是因为在许多类 Unix 系统上(尤其是在 Ritchie 和 Thompson 时代),假设用户能够创建自己的程序。在这种情况下,使用“执行”权限作为安全措施是没有意义的,因为用户可以简单地创建自己的敏感程序副本。

举个具体的例子,fdisk以非特权用户身份运行,尝试打乱硬盘的分区表:

$ /sbin/fdisk /dev/sda 

Welcome to fdisk (util-linux 2.24.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

...

Changed type of partition 'Linux' to 'Hidden NTFS WinRE'.

Command (m for help): w
fdisk: failed to write disklabel: Bad file descriptor

最后一行fdisk试图获取硬盘驱动器的“写入”文件描述符并失败,因为我正在运行它的用户没有这样做的权限。

“执行”权限的目的有两个:1) 告诉操作系统哪些文件是程序,以及 2) 告诉用户他们可以运行哪些程序。这两者都是建议性的,而不是强制性的:您可以在未经许可的情况下创建功能完善的操作系统,但它可以改善用户体验。

正如 R.. 指出的那样,有一种特殊情况是“执行”权限用于安全性:当程序还设置了“setuid”位时。在这种情况下,“执行”权限可用于限制允许谁运行程序。任何绕过“执行”权限的方法也会去除“setuid”状态,所以这里没有安全风险。

您可以在可执行文件上设置执行位,但不能设置读取位。这样,没有人可以复制该文件,但人们仍然可以执行它。

这在今天毫无意义,因为 a) 它仅适用于已编译的程序,不适用于脚本(在大多数系统上);b) 如今,90% 的 unix 都是 linux,人们几乎可以从任何地方复制可执行文件,并且 c) 复制的可执行文件占用的磁盘空间并不重要。

尽管如此,在过去还是有它的用途。

30 年前我在学校使用的 Unix 系统的 RAM 和磁盘空间非常有限。尤其是/usr/tmp文件系统很小,当有人试图编译一个大程序时,就会出现问题。当然,无论如何,学生不应该写“大程序”。大型程序通常是从“某处”复制的源代码。我们中的许多人复制/usr/bin/cc/home/<myname>/cc,并用于dd修补二进制文件以使用/tmp而不是/usr/tmp更大的 。当然,这只会让问题变得更糟——这些副本占用的磁盘空间在当时确实很重要,现在/tmp经常被填满,甚至阻止其他用户编辑他们的文件。在他们发现发生了什么之后,系统管理员做了一个chmod go-r /bin/* /usr/bin/* 它“修复”了问题,并删除了我们所有的 C 编译器副本。

另一个用途是告诉 shell 哪些文件打算执行,哪些不打算执行。您不希望执行随机文本文件,因为您输入了它的名称;x 位提供了一种防止这种情况的方法。(这些天,shell 可以只查看文件的开头,并且只有在它以 开头时才执行它#!,但这是在很久以后才介绍的)。bash的完成功能也将仅在您键入命令时建议具有可执行位的文件。

有一种现成的方法可以执行任意文件:将其作为参数传递给动态链接器(这是动态加载的可执行文件的适当解释器)。例如在 Linux 下,

cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/ld-linux.so.2 /tmp/ls

但是,这与读取文件并跳转到代码具有相同的限制:不评估setuid位。

在过去,我们经常有像这样的二进制文件/bin/su

-rwsr-xr-- root wheel  ...  /bin/su

只有该wheel组的成员(系统管理员一直将其修剪为知道root密码的人)才能执行该su命令,因此即使该二进制文件中存在缓冲区溢出,允许调用者绕过安全性,该漏洞利用也只能由人使用反正谁知道密码。

我很惊讶没有人提到 +x 位的另一种用法:目录。也许您在 /bin (shell 脚本或其他)中执行(示例)某些内容之后,但执行位比文件更多(当然,目录是文件,但它是不同类型的文件)。

如果您对某个目录具有 +x 访问权限,但对同一目录具有 -r 访问权限,那么您将具有以下功能:

  • 如果您知道该目录中的文件(或目录)的名称,您可以列出它(例如,ls 就可以了)。但是,您必须知道名称。
  • 您无法更改为它(通过 cd 命令或 chdir 系统调用)。

但是,如果您有 -x 和 +r,则可以执行以下操作:

  • 您不能更改到目录(与上述相同)。
  • 您可以列出文件。但是由于您没有对该目录的 +x 访问权限,因此您无法访问文件本身。
  • 这也意味着您无法更新(仅时间戳或其他方式),也无法在文本编辑器(或 cat 或 ...)中打开它们。

如果你有 +rx 那么你可以做所有这些(除了你需要 +w 写入目录本身,也就是说创建新文件;编辑文件有效,删除无效,创建无效)

是的,这意味着可以让某些人查看或编辑文件,但前提是他们知道文件的确切路径(只要他们有权编辑,无论如何)。是的: ls 是列表,用于搜索目录。总而言之:执行目录正在更改为它(无论出于何种原因)。当然,这些位在一起才是真正重要的。