Проверка на наличие других особых случаев в IRP_MJ_CREATE
Во время обработки IRP_MJ_CREATE в файловой системе должна выполняться другая обработка особых случаев, если вызывающий объект не имеет SeChangeNotifyPrivilege. Например, файл, который можно открыть с помощью идентификатора файла или идентификатора объекта, может не позволить вызывающей объекту получить путь к этому файлу, так как вызывающий объект может не иметь разрешения на переход к объекту с помощью структуры дерева каталогов.
Варианты, которые вы можете рассмотреть в файловой системе:
FILE_OPEN_BY_FILE_ID — имя файла не должно быть доступно вызывающей. Так как эти сведения (разрешение на обход) известны только во время операции создания и не будут доступны во время вызова запроса сведений о файле, сведения о разрешении на обход должны вычисляться файловой системой во время IRP_MJ_CREATE.
SL_OPEN_TARGET_DIRECTORY — целевой файл может не существовать, и каталог должен быть проверен на доступ к созданию файла. Если целевой объект существует, может потребоваться удаление проверка доступа. Обычно удаление проверка доступа выполняется во время операции переименования во время обработки IRP_MJ_SET_INFORMATION.
FILE_SUPERSEDE и FILE_OVERWRITE — для разрушительных операций требуются дополнительные права доступа, даже если вызывающий объект не запрашивал их явным образом. Например, файловой системе может потребоваться доступ DELETE для выполнения операции замены.
FILE_CREATE, FILE_OPEN_IF и FILE_OVERWRITE_IF — для конструктивных операций требуется доступ к родительскому каталогу, в котором создается новый объект. Это проверка в содержавом каталоге, а не в самом объекте и, следовательно, аналогично предыдущему примеру кода.
SL_FORCE_ACCESS_CHECK — если это значение задано в расположении стека ввода-вывода, проверка должно выполняться так, как если бы вызов выполнялся в пользовательском режиме, а не в режиме ядра. Таким образом, вызовы подпрограмм монитора безопасности должны указывать UserMode , даже если вызов был создан на сервере режима ядра.
Удаление файла или каталога — это может быть основано на состоянии ACL файла (например, FILE_WRITE_DATA доступ разрешает неявное удаление; если вы можете удалить данные, у вас есть действующие разрешения на удаление файла), а также состояние ACL каталога (например, FILE_DELETE_CHILD разрешение на содержащий каталог).
В следующем примере кода демонстрируется обработка особых случаев для FILE_SUPERSEDE и FILE_OVERWRITE, когда дополнительный доступ неявно требуется вызывающему объекту, даже если он не был запрошен.
{
ULONG NewAccess = Supersede ? DELETE : FILE_WRITE_DATA;
ACCESS_MASK AddedAccess = 0;
PACCESS_MASK DesiredAccess =
&IrpSp->Paramters.Create.SecurityContext->DesiredAccess;
//
// If the caller does not have restore privilege, they must have write
// access to the EA and attributes for overwrite or supersede.
//
if (0 == (AccessState->Flags & TOKEN_HAS_RESTORE_PRIVILEGE)) {
*DesiredAccess |= FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES;
//
// Does the caller already have this access?
//
if (AccessState->PreviouslyGrantedAccess & NewAccess) {
//
// No - they need this as well
//
*DesiredAccess |= NewAccess;
}
//
// Now check access using SeAccessCheck (omitted)
//
}
Этот пример кода является хорошим примером того, где политика файловой системы имеет приоритет. Вызывающий объект не запрашивал доступ DELETE или FILE_WRITE_DATA доступ, но такой доступ присущ операции, выполняемой на основе семантики файловой системы.