Почему do_execve () выполняет проверку исполняемого файла в два этапа вместо одного? - PullRequest
0 голосов
/ 20 сентября 2018

Понимание ядра Linux говорит о реализации execve():

do_execve( ) выполняет следующие операции:

  1. Динамически выделяет linux_binprm структура данных, которая будет заполнена данными, касающимися нового исполняемого файла.

  2. Вызывает path_lookup(), dentry_open() и path_release() для получения объекта dentry, объекта файла и индексаобъект, связанный с исполняемым файлом.В случае ошибки возвращается правильный код ошибки.

  3. Проверяет, что файл является исполняемым текущим процессом ;также проверяет, что файл не записывается, просматривая поле i_writecount в inode;хранит -1 в этом поле, чтобы запретить дальнейший доступ для записи.

  4. В многопроцессорных системах он вызывает функцию sched_exec(), чтобы определить наименее загруженный ЦП, который может выполнять новую программу, и выполнить миграцию.текущий процесс к нему (см. главу 7).

  5. Вызывает init_new_context(), чтобы проверить, использовал ли текущий процесс пользовательскую таблицу локальных дескрипторов (см. раздел «LDT Linux» вГлава 2);в этом случае функция выделяет и заполняет новый LDT для использования новой программой.

  6. Вызывает функцию prepare_binprm( ) для заполнения структуры данных linux_binprm.Эта функция, в свою очередь, выполняет следующие операции:

    a. Еще раз проверяет, является ли файл исполняемым (установлено хотя бы одно право доступа на выполнение) ;если нет, возвращает код ошибки.( Предыдущая проверка на шаге 3 недостаточна , поскольку процесс с набором возможностей CAP_DAC_OVERRIDE всегда удовлетворяет проверке; см. Раздел «Учетные данные и возможности процесса» ранее в этой главе).

...

Выполняют ли шаг 3 и шаг 6a проверку, что бит разрешения на выполнение исполняемого файла установлен для процесса?

Каковы их различия и отношения?

Не учитывает ли шаг 3 производительность процесса CAP_DAC_OVERRIDE, а шаг 6a -?Является ли это единственной разницей между двумя шагами?

Зачем нам нужна двухэтапная проверка, а не одноэтапная проверка путем объединения всех проверок в шаг 3 или шаг 6a?

Спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете и должны прочитать сам исходный код ядра (это в fs / exec.c).Шаги 2 и 3 в основном вызывают общую функцию open со специальными EXEC флажками «открыть файл с намерением выполнить», тогда как вторая проверка является частью серии проверок «какие права»должен ли новый процесс иметь ".

, чтобы более конкретные биты:

  • что это должно предотвратить?=> вероятно, root выполняет неисполняемые двоичные файлы по ошибке
  • почему бы не выполнить проверку в 3?=> это повторное использование более общей операции - open with flags - эта операция должна завершиться успешно, если у вас есть возможность для этого
  • почему бы не выполнить всю проверку в 6?=> 3 делает много дополнительных проверок, которые были бы здесь непрактичными, например «мы на смонтированном fs noexec?»

В любом случае, ваш вопрос слишком открыт, не уверен, что мой ответ вас удовлетворит,Идите и прочитайте вместо этого исходный код ядра.: -)

...