在 fstab 中使用 noexec 选项

Igo*_*gor 3 linux mount fstab

此链接解释了noexec在使用mount. 但是它列出了一个限制——如果我有一个 Perl/Python/shell 脚本或一个以#!并试图执行它的文件——我将能够这样做,无论我是否提供了该选项。

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

Kam*_*ski 8

这里有一个重大的误解。让我们把这些事情说清楚。

首先,正如所说的那样,您所指的限制是不正确的

然而,当一个脚本(与她邦行开始的文本文件,即与开头的行#!)是给一些炮弹(bash)的,它会运行一个名为该线路上的可执行文件(例如,/usr/bin/perl)和连接脚本文件的内容到该可执行文件的标准输入,可能不在该驱动器上。

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

那有什么问题呢?

1.绑定挂载是特定的

为了获得一些上下文,让我们看看当您尝试将 mount 绑定为只读时会发生什么。有一个问题:为什么挂载不尊重绑定挂载的只读选项?结论是:

要获得所需的结果,需要运行两个命令:

mount SRC DST -o bind
mount DST -o remount,ro,bind
Run Code Online (Sandbox Code Playgroud)

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

mount SRC DST -o bind,ro
Run Code Online (Sandbox Code Playgroud)

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

mount SRC DST -o bind,noexec
Run Code Online (Sandbox Code Playgroud)

忽略noexec,我需要重新安装。如果安装是通过/etc/fstab. 你可以实验。随时使用普通mount命令检查实际选项是什么。

我敢打赌提问者认为坐骑有noexec选项,但实际上并非如此。他或她能够从据称的noexec挂载点内执行脚本。这很奇怪,因此问题。

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

但…

2.贝壳读shebangs是一个普遍的神话;内核做

阅读#! Shebang工作?并注意那里的答案之一最初遵循神话,然后被纠正。

所以如果你有:

  • /mnt/foo/noexec选项的挂载点,
  • /mnt/foo/script.py否则可执行的脚本(例如chmod -x …被调用),
  • #!/usr/bin/python脚本中的第一行一样的shebang

你像这样运行它

/mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)

那么你的 Linux 内核不会让你因为noexec. 如果安装确实noexec在那里,它就会发生在另一个问题中;但我相信事实并非如此。

3. 不过,有两种方法可以“执行”脚本

来自评论:

“并将尝试执行它”如何?通过直接运行它还是将它传递给解释器?

直接运行它意味着:

 /mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)

这将兑现noexec上面详述的内容。可执行文件 script.py.

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

python /mnt/foo/script.py
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可执行文件是python. 是否foo/安装都没关系noexec; 是否script.py可执行并不重要;shebang是什么并不重要。重点script.py不是执行,而是读取

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

  • 感谢您提供如此完整且完美的解释。适当指出。 (2认同)