Использование опции noexec в fstab

1390
Igor

Эта ссылка объясняет преимущества использования noexecопции при использовании mount. Однако в нем перечислено одно ограничение - если у меня есть сценарий Perl / Python / shell или файл, который запускается #!и попытается его выполнить - я смогу сделать это независимо от того, предоставил ли я эту опцию или нет.

Есть ли способ предотвратить такое исполнение? Т.е. есть ли дополнительная опция, noexecкоторую я могу дать и выполнение сценариев будет невозможно?

1
"и попробуем его выполнить" Как? Запустив его напрямую или передав переводчику? Ignacio Vazquez-Abrams 6 лет назад 0
@ IgnacioVazquez-Abrams, в обе стороны. Я могу попробовать щелкнуть скрипт или просто набрать его в терминале. Igor 6 лет назад 0
Ни один из этих способов не отвечает на мой вопрос. Ignacio Vazquez-Abrams 6 лет назад 0
@ IgnacioVazquez-Abrams, ну, тогда, я думаю, я не понимаю вопроса. Не могли бы вы уточнить? Потому что я предположил, что секунда означает, что вы просто набираете `cd && python my_script.py`. Igor 6 лет назад 0
Это второй, да. И это не выполнит его, поэтому `noexec` не повлияет на это. Ignacio Vazquez-Abrams 6 лет назад 1
@ IgnacioVazquez-Abrams, ладно, наверное, я неправильно понял ответ на этот вопрос. Но допустим, у меня есть скрипт, который выполняет `cat / etc / passwd`. Затем, когда я попытаюсь запустить его, он выведет содержимое этого файла на стандартный вывод, верно? И извините за неправильное толкование этого ответа. Igor 6 лет назад 0
Это зависит от того, как вы «запускаете» его. Ignacio Vazquez-Abrams 6 лет назад 0
@ IgnacioVazquez-Abrams, второй способ. Смотрите мой ответ выше. Просто предположите, что я делаю `CD&& python my_script.py` и скрипт распечатает файл / etc / passwd. Я не очень знаком с Python, поэтому не могу поставить этот скрипт. Или просто представьте, что у меня есть скрипт bash. Igor 6 лет назад 0
Передача его интерпретатору не выполняет сценарий, он только читает его. Ignacio Vazquez-Abrams 6 лет назад 1
@ IgnacioVazquez-Abrams, так что же будет делать `noexec` в этом случае? Он просто напечатает `cat / etc / passwd`, но не фактический файл? Кроме того, что вы первый раз спрашивали в первом ответе? Igor 6 лет назад 0
`noexec` ничего не сделает. Интерпретатор прочитает сценарий и сделает все, что ему скажет. Ignacio Vazquez-Abrams 6 лет назад 0
Первый способ - запуск `path / to / script.py`. Это * выполнит * скрипт, если это возможно. Ignacio Vazquez-Abrams 6 лет назад 1
@ IgnacioVazquez-Abrams, поэтому содержимое файла / etc / passwd будет напечатано в этом случае? Я не хочу этого и хотел бы избежать этого. Igor 6 лет назад 0
@ IgnacioVazquez-Abrams, но первый путь будет предотвращен `noexec`. Igor 6 лет назад 0
`noexec` предотвратит выполнение сценария, но не его чтение. Ignacio Vazquez-Abrams 6 лет назад 0
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/69089/discussion-between-igor-and-ignacio-vazquez-abrams). Igor 6 лет назад 0
@ IgnacioVazquez-Abrams, по крайней мере, сейчас мне плевать на чтение. Мне просто нужно предотвратить выполнение двоичного файла и сценария. Так что, если я запусту скрипт с `python test_script.py`, как в приведенном выше примере, он напечатает содержимое скрипта или содержимое / etc / passwd? Igor 6 лет назад 0
@ IgnacioVazquez-Abrams Оказалось (на мой взгляд) было больше под поверхностью. Проверьте мой ответ, вы можете найти его интересным. Kamil Maciorowski 6 лет назад 0

1 ответ на вопрос

3
Kamil Maciorowski

Здесь есть серьезное недоразумение. Давайте проясним эти вещи.

Прежде всего, указанное вами ограничение не так :

Однако, когда сценарий (текстовый файл, начинающийся со строки she-bang; т.е. строки, начинающейся с #!) дается некоторым оболочкам (bash), он запускает исполняемый файл, названный в этой строке (например, /usr/bin/perl), и подключает содержимое файла сценария на стандартный ввод этого исполняемого файла, который может отсутствовать на этом диске.

Удивительно, но, кажется, объяснить способность выполнять, несмотря наnoexec . Я думаю, что спрашивающий там все понял неправильно, и это была не его вина! Одно неверное предположение в вопросе вызвало другое неправильное предположение в ответе.

Что тогда не так?

1. Привязка является специфической

Чтобы получить некоторый контекст, давайте посмотрим, что происходит, когда вы пытаетесь связать mount только для чтения. Возникает вопрос: почему mount не поддерживает параметр только для чтения для bind mounts? Вывод:

Для достижения желаемого результата нужно запустить две команды:

mount SRC DST -o bind mount DST -o remount,ro,bind 

Более новые версии mount (util-linux> = 2.27) делают это автоматически при запуске

mount SRC DST -o bind,ro 

Но когда вы пытаетесь использовать noexecвместо ro, вам все равно нужны две команды! В моем Kubuntu у меня есть util-linux 2.27.1-6ubuntu3.3и эта команда:

mount SRC DST -o bind,noexec 

игнорирует noexec, мне нужно перемонтировать. То же самое, если монтаж через /etc/fstab. Вы можете экспериментировать. В любое время проверьте с помощью простой mountкоманды, каковы фактические параметры.

Бьюсь об заклад, аскер думал, что крепление было с noexecопцией, но на самом деле это не так. Он или она смогли выполнить сценарий из предположительно точки noexecмонтирования. Это было странно, отсюда и вопрос.

Затем автор ответа интерпретировал это так, как если бы это была оболочка, которая читает shebang, вызывает другой исполняемый файл и не заботится о noexecсценарии. Если точка монтирования была действительно, noexecто это было бы разумным предположением.

Но…

2. Это распространенный миф, что ракушки читают шебанги; ядро делает

Прочитайте, как работает #! шебанг работа? и обратите внимание, что один из ответов там изначально следовал мифу, а затем был исправлен.

Так что если у вас есть:

  • точка монтирования /mnt/foo/с noexecопцией,
  • скрипт, /mnt/foo/script.pyкоторый в противном случае исполняется (например, chmod -x …был вызван),
  • Шебанг, #!/usr/bin/pythonкак в первой строке сценария

и вы запускаете это так

/mnt/foo/script.py 

тогда ваше ядро ​​Linux не позволит вам из-за noexec. Это произошло бы в этом другом вопросе, если бы монтаж был на самом деле noexecтам; но я считаю, что это не так.

3. Тем не менее, есть два способа «выполнить» скрипт

Из комментариев:

"и попробуем его выполнить" Как? Запустив его напрямую или передав переводчику?

Запуск его напрямую означает:

 /mnt/foo/script.py 

Это будет чести, noexecкак описано выше. Исполняемый файл есть script.py .

Передача его переводчику означает:

python /mnt/foo/script.py 

В этом случае исполняемый файл есть python. Неважно, если foo/установлен с noexec; не имеет значения, script.pyявляется ли он исполняемым вообще; Неважно, что такое Шебанг. Суть script.pyне выполнена, она прочитана .

Пока пользователь может читать файл и запускать правильный интерпретатор, нет способа предотвратить передачу файла интерпретатору; но это не файл, который выполняется.

спасибо за такое полное и отлично поставленное объяснение. Верно подмечено. Igor 6 лет назад 0

Похожие вопросы