Каков действительный вариант использования разрешения «только для выполнения» в файле?

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
popedotninja
источник

Ответы:

41

Сценарии оболочки требуют выполнения разрешения на чтение, но двоичные файлы этого не делают:

$ 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

Отображение содержимого файла и его выполнение - это две разные вещи. С сценариями оболочки эти вещи связаны, потому что они «выполняются» путем «чтения» их в новую оболочку (или текущую), если вы простите упрощение. Вот почему вы должны иметь возможность читать их. Двоичные файлы не используют этот механизм.

Для каталогов разрешение на выполнение немного отличается; это означает, что вы можете делать что-то с файлами в этом каталоге (например, читать или выполнять их). Допустим, у вас есть набор инструментов, /toolsкоторые вы хотите, чтобы люди могли использовать, но только если они знают о них. chmod 711 /tools, Тогда исполняемые файлы /toolsмогут быть запущены явно (например /tools/mytool), но ls /tools/будут отклонены. Точно так же могут храниться документы, /private-docsкоторые можно прочитать, если и только если известны имена файлов.

DopeGhoti
источник
1
Между прочим, больше нет смысла устанавливать «только для выполнения» в системных двоичных файлах, если вы не запускаете анонимный ftp.
Джошуа
1
Кроме того, установка исполняемого бита в каталоге позволяет вам cdэто сделать.
садовник
1
Можно также выполнить скрипт без разрешения на чтение
phuclv
1
Кстати, нет необходимости включать заголовок C stdio.hздесь. Я предлагаю удалить это.
Spikatrix
1
@Kevin: Вероятно, потому что отсутствие работы lsи завершение табуляции делает работу по обслуживанию раздражающей, и это дает мало фактических преимуществ безопасности. Большинство файлов, которые могут заинтересовать злоумышленника, в любом случае находятся в известных стандартных местоположениях, или их местоположения могут быть обнаружены косвенно из данных в других файлах (иначе как программы, которые законно используют эти файлы, узнают, где их найти?).
Ильмари
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
popedotninja
источник
1
Стоит отметить, что причина этого полезна в том, что вы все равно можете прочитать foo / bar, если знаете имя файла. Я использовал это на веб-серверах.
Random832
0

Вы должны иметь права на чтение и выполнение, чтобы выполнить скрипт. Чтение содержимого скрипта - это то, что позволяет ему выполняться, поэтому вам нужно уметь это делать read and execute. В противном случае вы не сможете запустить скрипт без него.

Каков действительный вариант использования разрешения только на выполнение?

Безопасность. Некоторые могут захотеть защитить свои файлы и помешать другим запускать или использовать их.

Джордан Савелл
источник
2
chmod 000Будут рассматривать разрешения никому, кроме root. Иногда вам не нужно заходить так сильно только для защиты - это зависит от намерений пользователя. Для того, чтобы, скажем, «повторно смоделировать» файл обратно с правами на чтение и запись, вы должны сделать это через root. Если вы не можете получить доступ root, это будет трудно.
Джордан
2
Допустим, у вас есть набор инструментов, /toolsкоторые вы хотите, чтобы люди могли использовать, но только если они знают о них. chmod 711 /tools, Затем выполнимые вещи в /tools могут быть запущены в явном виде, но ls /tools/будет отказано.
DopeGhoti
1
Хороший ответ! Обучил меня что-то там тоже. Почему бинарным файлам не нужно разрешение на чтение для выполнения?
Джордан
2
Потому что отображение содержимого файла и его выполнение - это две разные вещи. Сценарии оболочки «выполняются» путем «чтения» их в новую оболочку (если вы простите упрощение), поэтому вам необходимо иметь возможность читать их. Двоичные файлы не используют этот механизм.
DopeGhoti
1
Ах, здравый смысл. Я думал, что это было что-то другое - спасибо!
Джордан