Набор разрешенных возможностей процесса определяет то, какие именно возможности процесс может задействовать. Набор действующих возможностей процесса определяет возможности, задействованные процессом на текущий момент — то есть набор, на основе которого ядро решает, обладает ли процесс достаточными привилегиями для выполнения конкретной операции.

Набор разрешенных возможностей устанавливает верхнюю границу действующего набора. Процесс может расширить действующий набор, но только если возможность является частью разрешенного набора.

Отношения между действующим и разрешенным наборами аналогичны тому, как соотносятся действующий и сохраненный пользовательские идентификаторы в программах, которые устанавливают UID администратора. Удаление возможности из действующего набора аналогично временному отказу от нулевого пользовательского идентификатора и сохранению его для будущего применения. Удаление возможности из обоих наборов аналогично полному отказу от привилегий администратора, когда действующему и сохраненному идентификаторам присваиваются ненулевые значения.

39.3.4. Для чего нужны разрешенные и действующие возможности файла

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

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

• Программа может не поддерживать возможности (будучи написанной в традиционной манере с установкой UID администратора). Такая программа не будет знать о том, что ей нужно включить возможности в действующий набор, чтобы иметь возможность выполнять привилегированные операции. В этом случае в результате вызова exec() все разрешенные возможности процесса, которые он только что приобрел, должны быть автоматически включены в действующий набор. Это достигается путем установки действующего бита.

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

39.3.5. Для чего нужны наследуемые возможности процесса и файла

На первый взгляд использование разрешенного и действующего наборов для процессов и файлов может показаться вполне достаточным для регулирования возможностей. Однако в некоторых случаях этого недостаточно. Представьте, к примеру, что процесс, выполняющий exec(), хочет сохранить некоторые из его текущих возможностей во время выполнения новой программы. Казалось бы, этого можно достичь, просто сохранив разрешенные возможности процесса на время выполнения exec(). Но такой подход не учитывает двух моментов.

• Выполнение exec() может потребовать определенных привилегий (например, CAP_DAC_OVERRIDE), которые мы не хотим сохранять на протяжении работы программы.

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

По этим причинам разрешенные возможности процесса не сохраняются во время работы вызова exec(). Для этих целей предусмотрен отдельный набор возможностей — наследуемый. Он предоставляет механизм, с помощью которого процесс может сохранить некоторые из своих возможностей при запуске программы.

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

Существует более глубокая, философская причина, по которой разрешенные возможности процесса не сохраняются на время выполнения exec(). Идея системы возможностей состоит в том, что все привилегии, выданные процессу, регулируются файлом, который тот выполняет. И хотя наследуемые возможности передаются исполняемой программе, к ним применяется маска наследуемого набора самого файла.

Перейти на страницу:

Похожие книги