用户如何能够在未经许可的情况下执行文件?

用户如何能够在未经许可的情况下执行文件?

我创建了一个回显的 Bash 脚本“你好世界”。我还创建了一个测试用户,鲍勃, 使用adduser

没有人有权执行该文件,如下所示ls

$ ls -l hello.sh 
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh

从上面我们可以看到该文件的所有者是乔治他只有读取和写入访问权限,但没有执行访问权限。但登录为乔治我可以直接执行脚本:

$ . hello.sh 
Hello World

更糟糕的是,我登录为鲍勃,我只有读取权限,但我仍然能够执行该文件:

$ su bob
Password: 
$ . /home/george/testdir/hello.sh 
Hello World

这是怎么回事?

答案1

在您的示例中,您没有执行文件,而是采购他们。

执行将通过

$ ./hello.sh

为此,需要执行许可。在这种情况下,将打开一个子 shell,在其中执行脚本文件的命令。

采购, IE

$ . hello.sh

(中间有一个空格)仅文件和外壳您从中调用. hello.sh命令的地方然后直接按照读取的方式执行命令,即不打开子 shell。由于该文件是只读的,因此读取权限足以进行操作。 (另请注意,像这样声明脚本文件名调用PATH搜索hello.sh,所以如果你的中有另一个PATH 将会有货源!使用显式路径,例如. ./hello.sh确保您获取“正确的路径”。

如果您想防止这种情况发生,您还必须删除任何不应该使用该脚本的用户的读取权限。这无论如何也是合理的如果您确实担心未经授权使用该脚本,因为

  • 非授权用户只需将脚本内容复制并粘贴到新文件中即可轻松绕过缺少的执行权限,他们可以向该文件授予自己执行权限,并且
  • 正如 Kusalananda 所指出的,否则未经授权的用户仍然可以通过调用脚本来轻松使用该脚本
    sh ./hello.sh
    
    代替
    ./hello.sh
    

因为这也只需要对脚本文件的读取权限(请参阅这个答案例如)。

作为一般说明,请记住,获取脚本和执行脚本之间存在细微的差异(请参阅这个问题例如)。

答案2

执行权限只是意味着这个文件可以被处决。但是,当您获取它(. hello.shsource hello.sh)或将其作为参数传递给 shell 解释器(sh hello.sh)时,您并没有执行该文件,而是执行另一个命令(.sh)并且将文件作为参数传递到该命令。

因此,为了回答您的问题,您可以“执行”文件的原因与. hello.sh您可以运行的原因相同cat hello.sh:您只是阅读文件,而不是执行它。

为了显示:

$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh

$ cat ./foo.sh 
#!/bin/sh
echo Hello

$ ./foo.sh
bash: ./foo.sh: Permission denied

$ sh ./foo.sh
Hello

正如您所看到的,我实际上无法执行该脚本,但我可以很好地阅读它(无论是使用cat还是使用sh)。

答案3

最简短的版本是:你不是执行文件。你是阅读它进入 shell,然后执行它。

注意一些语言解释器会检查要求执行的文件的执行权限,如果用户没有适当的权限,则会拒绝这样做。但这完全是由特定解释器的作者自行决定的检查,并且不是由操作系统强制执行的。

让我们做一个小小的思想实验。

我想我们都可以同意如果一个程序有可执行权限,我应该被允许执行这个程序。我想我们也可以同意应该允许这个程序将字符串“Hello World”打印到控制台。

此外,我们可能还同意,只要文件具有读取权限,程序就应该能够读取该文件。该文件的内容是什么并不重要,只要该文件设置了读取权限位,就应该允许程序读取它。

好吧,既然我们已经同意应该允许程序在控制台上打印“Hello World”,并且我们已经同意应该允许程序读取文件,那么您在逻辑上也必须同意应该允许程序读取文件将“Hello World”打印到控制台。而且我们也说了,是否允许程序读取文件取决于权限,而不是内容,所以也应该允许程序读取文件,如果内容允许则在控制台打印“Hello World”文件的内容是echo Hello World.

现在,您是否也同意,由于允许程序读取文件并且允许程序将“Hello World”打印到控制台,因此也允许检查文件的内容并仅有的echo Hello World如果文件的内容是?,则将“Hello World”打印到控制台

好吧,但是然后它换句话说,“解释”执行文件,并且您刚刚同意我的每一步都应该允许这样做!

这正是这里正在发生的事情。 shell 只是读取一个文本文件,这是允许的,因为该文本文件具有读取权限。和贝壳正在执行文本文件中的指令,这是允许这样做的,因为贝壳有执行权限。

相关内容