カーネル拡張属性
Windows 8 以降、NTFS はカーネル拡張属性 (カーネル EA) をサポートします。 イメージの署名の検証はコストのかかる操作です。 以前に検証されたバイナリが変更されているかどうかに関する情報を保存すると、イメージの完全な署名チェックが必要になるインスタンスの数が減ります。 この理由でカーネル EA を使用すると、イメージ ファイルの署名検証のパフォーマンスが向上します。
名前プレフィックス$Kernel
を持つ EA は、カーネルモードからのみ変更できます。 この文字列で始まる EA は、カーネル EA とみなされます。 必要な更新シーケンス番号 (USN) を取得する前に、まず、FSCTL_WRITE_USN_CLOSE_RECORD を発行して、以前に発生した可能性のあるファイルに対する保留中の USN ジャーナル更新をコミットすることをお勧めします。 それ以外の場合は、FileUSN 値は、カーネル EA を設定した直後に変更される場合があります。
カーネル EA には少なくとも次の情報を含めることをお勧めします。
USN USNJournalID
- UsnJournalID フィールドは、USN ジャーナル ファイルの現在の具体化を識別する GUID です。 USN ジャーナルはボリュームごとにユーザー モードから削除および作成できます。 USN ジャーナルが作成されるたびに、新しい UsnJournalID GUID が生成されます。 このフィールドを使用すると、USN ジャーナルが無効になっていた期間があったかどうかを確認でき、再検証できます。
- この値は、FSCTL_QUERY_USN_JOURNAL を使用して取得できます。
- UsnJournalID フィールドは、USN ジャーナル ファイルの現在の具体化を識別する GUID です。 USN ジャーナルはボリュームごとにユーザー モードから削除および作成できます。 USN ジャーナルが作成されるたびに、新しい UsnJournalID GUID が生成されます。 このフィールドを使用すると、USN ジャーナルが無効になっていた期間があったかどうかを確認でき、再検証できます。
USN FileUSN
- FileUSN 値には、ファイルに加えられた最後の変更の USN ID が含まれており、指定されたファイルのマスター ファイル テーブル (MFT) レコード内で追跡されます。
- USNジャーナルが削除されると、FileUSN は、ゼロにリセットされます。
- FileUSN 値には、ファイルに加えられた最後の変更の USN ID が含まれており、指定されたファイルのマスター ファイル テーブル (MFT) レコード内で追跡されます。
この情報は、特定の使用法に必要な他の情報とともに、カーネル EA としてファイルに設定されます。
カーネル EA を設定するには、プレフィックスで始まる必要があります。"$Kernel."
有効な EA 名の文字列が続きます。 ユーザー モードからカーネル EA を設定しようとしても、通知なしで無視されます。 リクエストは STATUS_SUCCESS を返しますが、実際の EA の変更は行われません。 SMB はネットワーク全体の EA の設定をサポートし、それらの要求はサーバー上のカーネル モードから発行されるため、ZwSetEaFile や FltSetEaFile などの API を呼び出してカーネル モードからカーネル EA を設定するだけでは不十分です。
カーネル EA を設定するには、呼び出し元は IRP (I/O 要求パケット) の MinorFunction フィールドに IRP_MN_KERNEL_CALL 値も設定する必要があります。 このフィールドを設定する唯一の方法はカスタム IRP を生成することであるため、ルーチン FsRtlSetKernelEaFile は、カーネル EA を設定するためのサポート関数として FsRtl パッケージからエクスポートされています。
Windows 10 バージョン 1803 以降では、ユーザー EA とカーネル EA を混在させることができます。 カーネル EA を設定しても、USN ジャーナルに USN_REASON_EA_CHANGE レコードは生成されません。 ユーザー EA が設定されている場合、システムは USN_REASON_EA_CHANGE を生成します。
ユーザー モードからファイル上の EA をクエリすると、通常の EA とカーネル EA の両方が返されます。 アプリケーションの互換性の問題を最小限に抑えるために、ユーザー モードに戻されます。 通常の ZwQueryEaFile操作と FltQueryEaFile 操作は、ユーザー モードとカーネル モードの両方から通常の EA とカーネル EA の両方を返します。
FileObject のみが使用可能な場合は、FsRtlQueryKernelEaFile を使用して、カーネル モードからカーネル EA を照会する方が便利な場合があります。
FSCTL_QUERY_USN_JOURNAL 操作には、IRP の MinorFunction フィールドに IRP_MN_KERNEL_CALL 値が設定されていない限り、カーネル モードから発行された場合でも SE_MANAGE_VOLUME_PRIVILEGE が必要です。 ルーチンFsRtlKernelFsControlFile は、カーネルの FsRtl パッケージからエクスポートされており、カーネル モード コンポーネントがこの USN 要求を簡単に発行できるようにします。
注: Windows 10 バージョン 1703 以降では、この操作に SE_MANAGE_VOLUME_PRIVILEGE は必要なくなりました。
ファイルの USN ID が変更されたために単純にファイルを再スキャンすると、ファイルに USN 更新がポストされる可能性がある多くの無害な理由があるため、コストがかかる可能性があります。 これを簡素化するために、カーネル EA の自動削除機能が NTFS に追加されました。
このシナリオではすべてのカーネル EA を削除する必要はないため、拡張 EA プレフィックス名が使用されます。 カーネル EA が次の文字列で始まる場合、"$Kernel.Purge."
次のいずれかの USN 理由が USN ジャーナルに書き込まれると、NTFS は、指定された名前付け構文に準拠するそのファイルに存在するすべてのカーネル EA を削除します。
- USN_REASON_DATA_OVERWRITE
- USN_REASON_DATA_EXTEND
- USN_REASON_DATA_TRUNCATION
- USN_REASON_REPARSE_POINT_CHANGE
このカーネル EA の削除は、メモリ不足の状況でも成功します。
ユーザーモード コンポーネントはカーネル EA を改ざんできません。 カーネル EA は、通常の EA と同じファイルに存在できます。
FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile