在 fstab 中使用 noexec 选项

在 fstab 中使用 noexec 选项

此链接noexec解释了使用 时使​​用选项的好处mount。但是它列出了一个限制 - 如果我有一个以 开头的 Perl/Python/shell 脚本或文件#!并尝试执行它 - 无论我是否提供了选项,我都可以这样做。

有没有办法阻止这种执行?即是否有其他选项noexec可以让我提供,并且脚本将无法执行?

答案1

这里有一个重大误解。让我们把这些事情澄清一下。

首先,限制你说的,正如所说的,不是真的

但是,当将脚本(以 she-bang 行开头的文本文件;即以 开头的行#!)提供给某些 shell(bash)时,它将运行该行上命名的可执行文件(例如/usr/bin/perl),并将脚本文件的内容连接到该可执行文件的标准输入,而该可执行文件可能不在该驱动器上。

令人惊讶的是,它似乎解释了执行能力,尽管noexec。我认为提问者一开始就完全搞错了,这不是他的错!问题中的一个错误假设导致了答案中的另一个错误假设。

那有什么问题呢?

1. Bind mount 是特定的

为了了解一些背景信息,让我们看看当您尝试将挂载绑定为只读时会发生什么。有这样一个问题:为什么 mount 不尊重绑定挂载的只读选项?结论是:

为了达到预期的结果,需要运行两个命令:

mount SRC DST -o bind
mount DST -o remount,ro,bind

较新版本的 mount (util-linux >=2.27) 在运行时会自动执行此操作

mount SRC DST -o bind,ro

但是当您尝试使用noexec而不是 时ro,您仍然需要两个命令!在我的 Kubuntu 中,我有util-linux 2.27.1-6ubuntu3.3这个命令:

mount SRC DST -o bind,noexec

忽略noexec,我需要重新挂载。如果通过 挂载,情况也一样/etc/fstab。您可以试验。随时使用普通mount命令检查实际选项是什么。

我敢打赌,提问者以为挂载是noexec有选项的,但实际上不是。他或她能够从所谓的noexec挂载点内执行脚本。这很奇怪,因此才有这个问题。

然后答案作者对此进行了解释,好像是 shell 读取了 shebang,调用了另一个可执行文件,而不必担心noexec脚本。如果挂载点确实如此noexec,那么这将是一个合理的推测。

但…

2. 一个普遍的误解是,shell 读取 shebangs,而 kernel 却读取 shebang。

#! shebang 如何工作?并注意到其中一个答案最初遵循了神话,然后被纠正了。

因此如果你有:

  • /mnt/foo/带有选项的挂载点noexec
  • 一个可以执行的脚本/mnt/foo/script.py(例如chmod -x …被调用的脚本),
  • #!/usr/bin/python就像剧本第一行那样的事情

然后像这样运行它

/mnt/foo/script.py

那么你的 Linux 内核将不会让你这样做,因为noexec。如果安装确实存在,那么在另一个问题中就会发生这种情况noexec;但我相信它不存在。

3. 尽管如此,仍然有两种方法可以“执行”脚本

来自评论:

“并尝试执行它”怎么做?直接运行还是传递给解释器?

直接运行它意味着:

 /mnt/foo/script.py

这将遵守noexec上述规定。可执行文件 script.py

将其传递给解释器意味着:

python /mnt/foo/script.py

在这种情况下,可执行文件是。是否使用 挂载python并不重要;是否可执行并不重要;shebang 是什么也不重要。重点是不执行,它是foo/noexecscript.pyscript.py

只要用户可以读取文件并运行正确的解释器,就无法阻止将文件传递给解释器;但执行的不是文件。

相关内容