“仅执行”文件权限的有效用例是什么?


20

我正在阅读chmod及其八进制模式。我看到那1只是执行。仅执行权限的有效用例是什么?要执行文件,通常需要读取和执行权限。

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo

Answers:


41

Shell脚本要求执行读取权限,但二进制文件则不需要:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

显示文件的内容并执行它们是两件事。使用shell脚本,这些事情是相关的,因为如果您可以简化,可以通过将它们“读”到新的shell(或当前的shell)中来“执行”。这就是为什么您需要能够阅读它们的原因。二进制文件不使用该机制。

对于目录,执行权限略有不同。这意味着你可以做一些事情来的文件该目录(例如读取或执行它们)。假设您有一套工具/tools,希望人们能够使用,但前提是他们了解他们。chmod 711 /tools。然后,其中的可执行文件/tools可以显式运行(例如/tools/mytool),但ls /tools/将被拒绝。类似地,可以/private-docs并且仅当已知文件名时才可以在其中读取文档。


1
顺便说一句,除非您运行匿名ftp,否则不再需要在系统二进制文件上设置仅执行。
约书亚

1
同样,在目录上设置可执行位也可以访问该目录cd
gardenhead

1
也可以使
phuclv

1
顺便说一句,这里不需要包含C标头stdio.h。我建议将其删除。
Spikatrix

1
@Kevin:可能因为没有ls完成制表符而使维护工作变得烦人,并且几乎没有提供任何实际的安全益处。攻击者可能会对大多数文件感兴趣的地方还是位于已知的标准位置,或者可以从其他文件中的数据间接发现它们的位置(否则合法使用这些文件的程序将如何知道在哪里找到它们?)。
Ilmari Karonen

4

在Gentoo上,拒绝setuid(设置为使用其所有者而不是其调用者的权限运行)的可执行程序的读取访问权限(模式4711)。这是为防止利用漏洞增加一层保护,以帮助特权升级。

如果没有特权的攻击者可以读取setuid文件,并且知道允许返回libc式攻击的错误,则他们可以使用文件的内容来预测某些有用的函数或库可能在哪里程序调用时将其放置在内存中。

现代系统通常包括更有效的附加保护,例如ASLR,但是32位平台中存在的限制可能会使它们更易于利用。


请注意,该保护仅适用于基于源的发行版。使用基于二进制的发行版,攻击者可以只查看他们自己的程序副本,找出有趣的地方。
标记

只能执行的二进制文件也可以具有嵌入式密码。用户可以运行该程序,并且可以将密码发送到服务器,但是用户将无法从服务器获取密码(系统也不应该允许他们进行核心转储)。
Barmar

1

看起来“仅执行”的值对文件没有多大用处,但可用于防止文件读取目录的内容。

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied

1
值得一提的是,这样做很有用,是因为如果知道文件名,您仍然可以读取foo / bar。我已经在Web服务器上使用了它。
Random832 '17

0

您需要具有读取和执行权限才能执行脚本。读取脚本的内容是使脚本能够执行的原因,因此您需要能够执行脚本read and execute。否则,没有脚本就无法运行脚本。

仅执行权限的有效用例是什么?

安全。有些人可能想要保护自己的文件,并阻止其他人执行或使用它们。


2
chmod 000除了以外,其他任何人都不会考虑许可root。有时,您不必为了保护而走得太远-这取决于用户的意图。为了让我们说“重新chmod”文件回到可读和可写的权限,您必须通过做到这一点root。如果您无法访问root,那么将非常困难。
乔丹·萨维尔

2
假设您有一套工具/tools,希望人们能够使用,但前提是他们了解他们。 chmod 711 /tools。然后可执行的东西 /tools可以明确地运行,但ls /tools/将被拒绝。
DopeGhoti

1
好答案!那里也教了我一些东西。为什么二进制文件不需要执行读取权限?
乔丹·萨维尔

2
因为显示文件的内容并执行它们是两回事。通过将Shell脚本“读取”到新的Shell中(如果您不做任何简化)来“执行” Shell脚本,这就是为什么您需要能够读取它们的原因。二进制文件不使用该机制。
DopeGhoti

1
啊常识。我以为那不一样-谢谢!
乔丹·萨维尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.