Проблемы безопасности для объектов и представлений раздела
Драйверы, создающие разделы и представления, к которым не следует предоставлять общий доступ в пользовательском режиме, должны использовать следующий протокол при работе с разделами и представлениями:
Драйвер должен использовать дескриптор ядра при открытии дескриптора для объекта section. Драйверы могут убедиться, что дескриптор является дескриптором ядра, создав его в системном процессе или указав атрибут OBJ_KERNEL_HANDLE для дескриптора. Дополнительные сведения см. в разделе Дескрипторы объектов.
Представление должно быть сопоставлено только из системного потока. (В противном случае представление доступно из процесса, контекст которого оно создается.) Драйвер может убедиться, что представление сопоставлено с системным процессом, используя системный рабочий поток для выполнения операции сопоставления. Дополнительные сведения см. в разделах Потоки системной рабочей роли и Контекст потока драйвера.
Драйверы, которые совместно используют представление с процессом пользовательского режима, должны использовать следующий протокол при работе с разделами и представлениями:
Драйвер, а не процесс пользовательского режима, должен создать объект раздела и сопоставить представления.
Как упоминалось ранее, драйвер должен использовать дескриптор ядра при открытии дескриптора для объекта section. Драйверы могут убедиться, что дескриптор является дескриптором ядра, создав его в системном процессе или указав атрибут OBJ_KERNEL_HANDLE для дескриптора. Дополнительные сведения см. в разделе Дескрипторы объектов.
Представление сопоставляется в контексте потока процесса, который предоставляет общий доступ к представлению. Драйвер самого высокого уровня может гарантировать сопоставление представления в текущем контексте процесса, выполняя операцию сопоставления в подпрограмме диспетчеризации, например DispatchDeviceControl. Подпрограммы диспетчеризации драйверов более низкого уровня выполняются в произвольном контексте потока и поэтому не могут безопасно сопоставить представление в подпрограмме диспетчеризации. Дополнительные сведения см. в разделе Контекст потока драйвера.
Все доступы к представлению в драйвере в памяти должны быть защищены с помощью try-за исключением блоков. Вредоносное приложение в пользовательском режиме может отменить сопоставление представления или изменить состояние защиты представления. Любой из этих вариантов приведет к сбою системы, если не будет защищен блоком try-except . Дополнительные сведения см. в разделе Обработка исключений.
Драйвер также должен проверять содержимое представления при необходимости. Модуль записи драйверов не может предполагать, что доступ к представлению будет иметь только доверенный компонент пользовательского режима.
Драйвер, который должен совместно использовать объект section с приложением пользовательского режима (которое должно иметь возможность создавать собственные представления), должен использовать следующий протокол:
Драйвер, а не процесс пользовательского режима, должен создать объект раздела. Драйверы никогда не должны использовать дескриптор, переданный из пользовательского режима.
Перед передачей дескриптора в пользовательский режим драйвер должен вызвать ObReferenceObjectByHandle , чтобы получить ссылку на объект section. Это предотвращает удаление объекта раздела вредоносным приложением путем закрытия дескриптора. Ссылка на объект должна храниться в расширении устройства драйвера.
После того как драйвер больше не использует объект section, он должен вызвать ObDereferenceObject , чтобы освободить ссылку на объект.
В системах под управлением Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий только драйверы режима ядра могут открывать \Device\PhysicalMemory. Тем не менее, драйверы могут решить передать дескриптор пользовательскому приложению. Чтобы избежать проблем с безопасностью, доступ к \Device\PhysicalMemory должен быть предоставлен только приложениям пользователей, которым доверяет драйвер.