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


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

Ответы:


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которые можно прочитать, если и только если известны имена файлов.


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

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
Ах, здравый смысл. Я думал, что это было что-то другое - спасибо!
— Джордан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.