Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 111 стр.

UptoLike

нии потоков, а вот в дальнейшем поток может работать от имени какого-
либо иного пользователя, используя собственный маркер воплощения
(impersonation).
Процессы и потоки в Windows являются с одной стороны «представи-
телями» пользователя, выступающими от его имени, а с другой стороны –
защищаемыми объектами, при доступе к которым выполняется проверка
прав, то есть они обладают одновременно и маркерами доступа, и деск-
рипторами безопасности.
Описатели объектов ядра в Windows позволяют разным процессам и
потокам взаимодействовать с объектами с учетом их контекстов безопас-
ности, располагаемых прав и требуемого режима доступа. Примерами за-
щищаемых объектов являются процессы, потоки, файлы, большинство
синхронизирующих примитивов (события, семафоры и т.д.), проекции
файлов в память и многое другое.
Для создания большинства объектов ядра используются функции,
начинающиеся на слово «Create» и возвращающие описатель созданного
объекта, например функции CreateFile, CreateProcess, CreateEvent и т.д.
Многие объекты при их создании могут получить собственное имя или ос-
таться неименованными.
Любой процесс или поток может ссылаться на объекты ядра, создан-
ные другим процессом или потоком. Для этого предусмотрено три меха-
низма:
Объекты могут быть унаследованы дочерним процессом при его
создании. В этом случае объекты ядра должны быть «наследуемы-
ми», и родительский процесс должен принять меры к тому, чтобы
потомок мог узнать их описатели. Возможность передавать опи-
сатель потомкам по наследованию явно указывается в большин-
стве функций, так или иначе создающих объекты ядра (обычно
такие функции содержат аргумент «BOOL bInheritHandle», кото-
рый указывает возможность наследования).
Объект может иметь собственное уникальное имя – тогда мож-
но получить описатель этого объекта по его имени. Для разных
типов объектов Win32 API предоставляет набор функций, начи-
нающийся на Open...например, OpenMutex, OpenEvent и т.д.
Процесс-владелец объекта может передать его описатель любо-
му другому процессу. Для этого процесс-владелец объекта дол-
жен получить специальный описатель объекта для «экспорта» в
указанный процесс. В Win32 API для этого предназначена функ-
ция DuplicateHandle, создающая для объекта, заданного описа-
телем в контексте данного процесса, новый описатель, коррект-
ный в контексте нового процесса:
Основы многозадачности
209
ядро операционной системы вынуждено проверять полномочия каждого
процесса при их попытках доступа к защищаемым объектам.
Для того чтобы ядро операционной системы могло контролировать
доступ к тем или иным объектам, сами объекты должны управляться
ядром системы. Это приводит к понятию объектов ядра (kernel objects), ко-
торые создаются по запросу процессов ядром системы, управляются
ядром, и доступ к которым также контролируется ядром системы.
6.2.3.1. Объекты ядра
Объекты ядра представлены в качестве некоторых структур и типов
данных, управляемых ядром операционной системы и размещенных в па-
мяти, принадлежащей ядру. Пользовательские процессы, как правило,
не имеют возможности доступа к этим объектам напрямую. Для того чтобы
пользовательский процесс мог оперировать такими объектами, введено по-
нятие описатель (handle) объекта ядра. Так, например, объектами ядра явля-
ются файлы, процессы, потоки, события, почтовые ящики и многое другое.
Все созданные описатели объектов ядра должны удаляться с помо-
щью функции
BOOL CloseHandle( HANDLE hKernelObject ),
которая уменьшает счетчик использования объекта и уничтожает его,
когда на объект никто больше не ссылается.
Доступ к защищаемым объектам в Windows задается так называемы-
ми дескрипторами безопасности (Security Descriptor). Дескриптор содержит
информацию о владельце объекта и первичной группе пользователей и два
списка управления доступом (ACL, Access Control List): один список задает
разрешения доступа, другой – необходимость аудита при доступе к объек-
ту. Список содержит записи, указывающие права выполнения действий, и
запреты, назначенные конкретным пользователям и группам. При досту-
пе к защищаемым объектам для начала проверяются запреты – если для
данного пользователя и группы имеется запрет доступа, то дальнейшая
проверка не выполняется и попытка доступа отклоняется. Если запретов
нет, то проверяются права доступа – при отсутствии разрешений доступ
отклоняется. Запрет обладает более высоким «приоритетом», чем наличие
разрешений – это позволяет разрешить доступ, к примеру, целой группе
пользователей и выборочно запретить некоторым ее членам.
Объект, осуществляющий доступ (выполняющийся поток), облада-
ет так называемым маркером доступа (access token). Маркер идентифици-
рует пользователя, от имени которого предпринимается попытка досту-
па, а также его привилегии и умолчания (например, стандартный ACL
объектов, создаваемых этим пользователем). В Windows маркерами дос-
тупа обладают как потоки, так и процессы. С процессом связан так на-
зываемый первичный маркер доступа, который используется при созда-
208
CIL и системное программирование в Microsoft .NET
208                          CIL и системное программирование в Microsoft .NET   Основы многозадачности                                              209


ядро операционной системы вынуждено проверять полномочия каждого                 нии потоков, а вот в дальнейшем поток может работать от имени какого-
процесса при их попытках доступа к защищаемым объектам.                          либо иного пользователя, используя собственный маркер воплощения
     Для того чтобы ядро операционной системы могло контролировать               (impersonation).
доступ к тем или иным объектам, сами объекты должны управляться                       Процессы и потоки в Windows являются с одной стороны «представи-
ядром системы. Это приводит к понятию объектов ядра (kernel objects), ко-        телями» пользователя, выступающими от его имени, а с другой стороны –
торые создаются по запросу процессов ядром системы, управляются                  защищаемыми объектами, при доступе к которым выполняется проверка
ядром, и доступ к которым также контролируется ядром системы.                    прав, то есть они обладают одновременно и маркерами доступа, и деск-
                                                                                 рипторами безопасности.
6.2.3.1. Объекты ядра                                                                 Описатели объектов ядра в Windows позволяют разным процессам и
     Объекты ядра представлены в качестве некоторых структур и типов             потокам взаимодействовать с объектами с учетом их контекстов безопас-
данных, управляемых ядром операционной системы и размещенных в па-               ности, располагаемых прав и требуемого режима доступа. Примерами за-
мяти, принадлежащей ядру. Пользовательские процессы, как правило,                щищаемых объектов являются процессы, потоки, файлы, большинство
не имеют возможности доступа к этим объектам напрямую. Для того чтобы            синхронизирующих примитивов (события, семафоры и т.д.), проекции
пользовательский процесс мог оперировать такими объектами, введено по-           файлов в память и многое другое.
нятие описатель (handle) объекта ядра. Так, например, объектами ядра явля-            Для создания большинства объектов ядра используются функции,
ются файлы, процессы, потоки, события, почтовые ящики и многое другое.           начинающиеся на слово «Create» и возвращающие описатель созданного
     Все созданные описатели объектов ядра должны удаляться с помо-              объекта, например функции CreateFile, CreateProcess, CreateEvent и т.д.
щью функции                                                                      Многие объекты при их создании могут получить собственное имя или ос-
     BOOL CloseHandle( HANDLE hKernelObject ),                                   таться неименованными.
     которая уменьшает счетчик использования объекта и уничтожает его,                Любой процесс или поток может ссылаться на объекты ядра, создан-
когда на объект никто больше не ссылается.                                       ные другим процессом или потоком. Для этого предусмотрено три меха-
     Доступ к защищаемым объектам в Windows задается так называемы-              низма:
ми дескрипторами безопасности (Security Descriptor). Дескриптор содержит                 • Объекты могут быть унаследованы дочерним процессом при его
информацию о владельце объекта и первичной группе пользователей и два                      создании. В этом случае объекты ядра должны быть «наследуемы-
списка управления доступом (ACL, Access Control List): один список задает                  ми», и родительский процесс должен принять меры к тому, чтобы
разрешения доступа, другой – необходимость аудита при доступе к объек-                     потомок мог узнать их описатели. Возможность передавать опи-
ту. Список содержит записи, указывающие права выполнения действий, и                       сатель потомкам по наследованию явно указывается в большин-
запреты, назначенные конкретным пользователям и группам. При досту-                        стве функций, так или иначе создающих объекты ядра (обычно
пе к защищаемым объектам для начала проверяются запреты – если для                         такие функции содержат аргумент «BOOL bInheritHandle», кото-
данного пользователя и группы имеется запрет доступа, то дальнейшая                        рый указывает возможность наследования).
проверка не выполняется и попытка доступа отклоняется. Если запретов                     • Объект может иметь собственное уникальное имя – тогда мож-
нет, то проверяются права доступа – при отсутствии разрешений доступ                       но получить описатель этого объекта по его имени. Для разных
отклоняется. Запрет обладает более высоким «приоритетом», чем наличие                      типов объектов Win32 API предоставляет набор функций, начи-
разрешений – это позволяет разрешить доступ, к примеру, целой группе                       нающийся на Open...например, OpenMutex, OpenEvent и т.д.
пользователей и выборочно запретить некоторым ее членам.                                 • Процесс-владелец объекта может передать его описатель любо-
     Объект, осуществляющий доступ (выполняющийся поток), облада-                          му другому процессу. Для этого процесс-владелец объекта дол-
ет так называемым маркером доступа (access token). Маркер идентифици-                      жен получить специальный описатель объекта для «экспорта» в
рует пользователя, от имени которого предпринимается попытка досту-                        указанный процесс. В Win32 API для этого предназначена функ-
па, а также его привилегии и умолчания (например, стандартный ACL                          ция DuplicateHandle, создающая для объекта, заданного описа-
объектов, создаваемых этим пользователем). В Windows маркерами дос-                        телем в контексте данного процесса, новый описатель, коррект-
тупа обладают как потоки, так и процессы. С процессом связан так на-                       ный в контексте нового процесса:
зываемый первичный маркер доступа, который используется при созда-