IRP_MJ_CREATE 기타 특수 사례 확인

호출자에게 SeChangeNotifyPrivilege가 없는 경우 파일 시스템 내에서 IRP_MJ_CREATE 처리하는 동안 다른 특수 사례 처리가 발생해야 합니다. 예를 들어 파일 ID 또는 개체 ID를 사용하여 열 수 있는 파일은 호출자가 디렉터리 트리 구조를 통해 개체에 액세스하는 트래버스 권한이 없을 수 있으므로 호출자가 해당 파일의 경로를 가져오도록 허용하지 않을 수 있습니다.

파일 시스템에서 고려할 수 있는 경우:

  • FILE_OPEN_BY_FILE_ID — 파일 이름을 호출자가 사용할 수 없도록 설정하면 안 됩니다. 이 정보(트래버스 권한)는 만들기 작업 중에만 알려져 있으며 파일 정보 쿼리 호출 중에는 사용할 수 없으므로 IRP_MJ_CREATE 동안 파일 시스템에서 트래버스 권한에 대한 정보를 계산해야 합니다.

  • SL_OPEN_TARGET_DIRECTORY — 대상 파일이 없을 수 있으며 디렉터리에서 파일 만들기 액세스를 확인해야 합니다. 대상이 있는 경우 삭제 액세스 확인이 필요할 수 있습니다. 일반적으로 삭제 액세스 검사는 IRP_MJ_SET_INFORMATION 처리하는 동안 이름 바꾸기 작업 시 수행됩니다.

  • FILE_SUPERSEDEFILE_OVERWRITE — 파괴적인 작업에는 호출자가 명시적으로 요청하지 않은 경우에도 추가 액세스 권한이 필요합니다. 예를 들어 대체 작업을 수행하려면 파일 시스템에 DELETE 액세스 권한이 필요할 수 있습니다.

  • FILE_CREATE, FILE_OPEN_IFFILE_OVERWRITE_IF 건설적인 작업을 수행하려면 새 개체가 만들어지는 부모 디렉터리에 액세스해야 합니다. 이는 개체 자체가 아니라 포함하는 디렉터리에 대한 검사이므로 이전 코드 샘플과 유사합니다.

  • SL_FORCE_ACCESS_CHECK - 이 값이 I/O 스택 위치에 설정된 경우 커널 모드가 아닌 사용자 모드에서 호출된 것처럼 검사를 수행해야 합니다. 따라서 보안 모니터 루틴에 대한 호출은 커널 모드 서버 내에서 호출이 시작된 경우에도 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 액세스를 요청하지 않았지만 이러한 액세스는 파일 시스템의 의미 체계에 따라 수행되는 작업에 내재되어 있습니다.