脚本可以执行但不可读吗?

脚本可以执行但不可读吗?

如果没有权限读取脚本,是否可以执行该脚本?在 root 模式下,我制作了一个脚本,我希望其他用户执行该脚本但不读取它。我确实chmod禁止读取和写入但允许执行,但是在用户模式下,我看到了消息:权限被拒绝。

答案1

问题是脚本不是正在运行的,而是解释器(bashperlpython等)。口译员需要阅读脚本。这与“常规”程序(例如 )不同,ls因为该程序像解释器一样直接加载到内核中。由于内核本身正在读取程序文件,因此不需要担心读取访问。解释器需要读取脚本文件,就像需要读取普通文件一样。

答案2

这仅适用于二进制文件。

$ chown foo:foo bar
$ chmod 701 bar

作为非特权用户:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

现在,问题来了。虽然通过传统方式无法读取该文件,但您实际上无法阻止读取该文件。这实际上是一个挑战http://smashthestack.org/(13级)。有一个众所周知的实用程序,hktrace它允许您使用ptrace.

答案3

前面的说法只说对了一半。您可以设置一个脚本,使其不被用户读取,但仍然可执行。该过程有点冗长,但可以通过在 /etc/sudoer 中设置例外来实现,以便用户可以暂时以自己的身份运行脚本,而不会提示输入密码。此方法: - 绕过其他发行版的 setuid 补丁。 - 允许您临时为特定脚本授予提升的权限,而不向用户授予对所有内容的 sudo 权限。

请按照这篇文章中的说明进行操作: 文件权限仅执行

答案4

我认为你可以用 来做到这一点setuid

但你不能,因为大多数发行版(显然)已经setuid禁用,因为这是一个巨大的安全漏洞。它在我的上被禁用,所以我实际上不知道这个答案是否有效,无论如何我都会发布它,因为我认为它应该

不管怎样,如果我想做你想做的事——而且我有一个setuid启用了脚本的发行版——我会做类似的事情:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

也就是说,我会编写另一个脚本,其唯一目的是调用 root 只读脚本,将其更改为 root 所有,并为其授予 setuid 权限。 (以及其他人随之而来的不可写状态。)

由于 myscript-nonroot 函数对每个人都是可读的,因此它可以被读取和执行,并且当您获得实际执行脚本的两行时 ( bash myscript),它正在以 root 身份(或您想要的任何其他人,确切的用户)运行没关系,只要包装文件由同一用户拥有即可。)

相关内容