Бөлісу құралы:


Проблемы безопасности для объектов секций и представлений

Драйверы, создающие разделы и представления, которые не используются для общего доступа к пользовательскому режиму, должны использовать следующий протокол при работе с разделами и представлениями:

  • Драйвер должен использовать дескриптор ядра при открытии дескриптора объекта раздела. Драйверы могут убедиться, что дескриптор является дескриптором ядра, создав его в системном процессе или указав атрибут OBJ_KERNEL_HANDLE для дескриптора. Дополнительные сведения см. в разделе Обработчики объектов.

  • Представление должно быть сопоставлено только из системного потока. (В противном случае представление доступно из процесса, в контексте которого оно создается.) Драйвер может убедиться, что представление сопоставляется к системному процессу с помощью рабочего потока системы, чтобы выполнить операцию сопоставления. Дополнительные сведения см. в разделе " Системные рабочие потоки " и "Контекст потока драйвера".

Драйверы, которые совместно используют вид с процессом в пользовательском режиме, должны использовать следующий протокол при работе с секциями и видами:

  • Драйвер, а не процесс пользовательского режима, должен создать объект раздела и сопоставить представления.

  • Как упоминалось ранее, драйвер должен использовать дескриптор ядра при открытии дескриптора объекта раздела. Драйверы могут убедиться, что дескриптор является дескриптором ядра, создав его в системном процессе или указав атрибут OBJ_KERNEL_HANDLE для дескриптора. Дополнительные сведения см. в разделе Обработчики объектов.

  • Представление проецируется в контексте нити процесса, который разделяет это представление. Драйвер высокого уровня может гарантировать, что представление сопоставляется в текущем контексте процесса, выполняя операцию сопоставления в подпрограмме отправки, например DispatchDeviceControl. Подпрограммы отправки драйверов нижнего уровня выполняются в произвольном контексте потока и поэтому не могут безопасно сопоставить представление в подпрограмме отправки. Дополнительные сведения см. в разделе "Контекст потока драйвера".

  • Все операции доступа к памяти в представлении внутри драйвера должны быть защищены конструкциями try-except. Вредоносное приложение в режиме пользователя может отменить сопоставление представления или изменить состояние защиты представления. Либо то, либо другое приведет к сбою системы, если не защищено блоком try-except. Для получения дополнительной информации см. Обработка исключений.

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

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

  • Драйвер, а не процесс пользовательского режима, должен создать объект раздела. Драйверы никогда не должны использовать дескриптор, переданный из пользовательского режима.

  • Перед тем как передать дескриптор в пользовательский режим, драйвер должен вызвать ObReferenceObjectByHandle, чтобы получить ссылку на объект раздела. Это предотвращает вредоносное приложение от удаления объектa разделa при закрытии дескриптора. Ссылка на объект должна храниться в расширении устройства драйвера.

  • После того как драйвер больше не использует объект раздела, он должен вызвать ObDereferenceObject , чтобы освободить ссылку на объект.

В системах под управлением Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий только драйверы в режиме ядра могут открывать \Device\PhysicalMemory. Однако драйверы могут решить предоставить дескриптор пользовательскому приложению. Чтобы предотвратить проблемы с безопасностью, доступ к \Device\PhysicalMemory должен быть предоставлен только пользователям, которым доверяет драйвер.