Могут ли возможности использоваться в сценариях без setcap'а двоичного файла интерпретатора?

14

Прямо сейчас я использую cap_net_bind_service MY_USERNAMEв /etc/security/capability.conf.
Теперь мне просто нужно установить cap_net_bind_service+iинтерпретатор моего любимого языка сценариев, чтобы иметь возможность добавлять CAP_NET_BIND_SERVICEк эффективному набору через libcap [-ng].

Это прекрасно работает, но мне интересно, есть ли способ достичь того же самого, не устанавливая заглавные буквы для двоичного файла интерпретатора. Хотя это не большая проблема (другие учетные записи пользователей не имеют ограничения, поэтому они не могут использовать его даже с битом, установленным в двоичном файле интерпретатора), это несколько раздражает, так как мне приходится переустанавливать флаг каждый раз, когда интерпретатор обновлено.

ThiefMaster
источник

Ответы:

4

Обычно возможности передаются по наследству детям. Как указано в справочной странице :

Дочерний объект, созданный с помощью fork (2), наследует копии наборов возможностей своего родителя.

Проблема со сценариями заключается в том, что они не являются непосредственно исполняемыми файлами. Ядро проходит список проверок (код ядра находится по адресу fs / binfmt _ *. C). Одним из них является «binfmt_script.c», который проверяет первую строку на наличие шебанга, а затем вызывает реальный интерпретатор (тот, что в шебанге) с вашим скриптом в качестве аргумента. Таким образом, вызывается стандартный / общий интерпретатор, который просто читает ваш сценарий в качестве аргумента.

Это означает, что вы должны будете установить возможности интерпретатора, а не сценария. То же самое относится к suidбитам и другим специальным флагам.

Так что либо вы делаете копию своего интерпретатора, устанавливаете нужные вам возможности (также проверяете, что никто не может получить к нему доступ через chmod / chown), и вызываете этот скопированный интерпретатор в своем шебанге. Вы также можете использовать логику setcap в своем скрипте.

Адриен М.
источник
Хорошо, не видел, чтобы вопрос задавался 2 года назад, но никогда не закрывался ... Кроме того, похоже на дубликат unix.stackexchange.com/questions/87348/…
Adrien M.
но только i(наследовать), проходит мимо exec. И iничего не делает сам по себе, он работает только в том случае, если у файла есть соответствующее совпадение i, и я указываю e(эффективный) бит (если только это не установлен в скрипте / исполняемом файле). Это еще сложнее, чем setuid, это не скрипт-эффект.
Ctrl-Alt-Delor
1
Я думал, что ядро ​​было прочитано, а не оболочкой? ( stackoverflow.com/questions/3009192/how-does-the-shebang-work/… )
Филипп Коулинг
Коулинг ты прав. Это было неверное истолкование, которое я понял позже. Я исправил это с помощью подсказок о том, где находится код ядра для выполнения скриптов.
Адриен М.