ReparsePointAware クラス

定義

やり取りされるファイルとフォルダーがパスに Windows の再解析ポイントを持たないようにし、コード内のパスがディスク上の実際のパスと一致することを確認するファイルおよびディレクトリ ユーティリティ関数のコレクション。

再解析ポイントインジェクションは、セキュリティ悪用の既知または一般的なベクトルです。 それらに関する一般的な情報については、こちらを参照してください。 https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-points

この一連の関数の目的は、Windows ファイル ハンドルを取得し、それが予想されるパスにあることを確認し、同じハンドルですべてのファイル操作を実行することです。 攻撃者がファイルのチェックとファイルパスに基づくファイル操作との間の競合を悪用する可能性があるため、ファイルを検証してからファイルパスを使用して追加の操作を実行することは安全なパターンではありません。 このクラスの攻撃は、Time-of-Check/Time-of-Use (TOCTOU) と呼ばれます。 これを回避するために、このクラスはファイル ハンドルを保持し、ハンドルが正しい場所にあると見なされた後、ハンドルに対するすべての操作を実行します。 すべての操作はファイル ハンドルに基づいているため、正しいことを確認したファイルを変更していることがわかります。

public static class ReparsePointAware
type ReparsePointAware = class
Public Class ReparsePointAware
継承
ReparsePointAware

メソッド

CreateDirectory(String)

指定したパス内のすべてのディレクトリとサブディレクトリを作成します。 ディレクトリの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされます。

CreateText(String)

UTF-8 エンコードされたテキストの書き込み用にファイルを作成または開きます。 既存のファイルを開くと、ファイルは切り捨てられます。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException はスローされ、何も書き込まれありません。

DeleteFile(String)

指定されたファイルを削除します。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされ、何も削除されません。

GetFinalPath(SafeFileHandle)

指定された SafeFileHandle への完全な正規パスを取得し、すべての再解析ポイントを展開します。

HasReparsePoints(SafeFileHandle, String)

SafeFileHandle で表されるファイル システム オブジェクトに、指定された expectedPath と一致する正規パスがあるかどうかを確認します。

MoveFile(String, String)

指定したファイルを新しい場所に移動します。オプションで新しいファイル名を指定することもできます。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされます。

OpenFile(String, FileMode, FileAccess, FileShare)

指定したパスで System.IO.FileStream を開き、読み取り、書き込み、または読み取り/書き込みアクセス権を持つ指定されたモードと、指定した共有オプションを使用します。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされます。 OpenFile では、ファイル操作を実行する前に、最初にディレクトリがピン留めされます。 ディレクトリの固定に失敗した場合、またはディレクトリが ReparsePoint の場合、UnauthorizedAccessException がスローされます。

OpenRead(String)

読み取り用の既存のファイルを開きます。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされます。

OpenWrite(String)

書き込み用に、既存のファイルを開くか新しいファイルを作成します。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException がスローされます。

PinAndRequireNoReparsePoints(String, Boolean)

既存のファイルまたはディレクトリへの SafeFileHandle を開き、結果の正規パスが指定されたパスのパスと一致することを確認します。 結果の SafeFileHandle は IDisposable であり、using ステートメント内で使用して、後続のファイル操作が再解析ポイントなしでパスに書き込まれるようにすることができます。

PinHandle(String, Boolean)

移動できないように、既存のファイルまたはディレクトリのハンドルを受け取ります。

RequireNoReparsePoints(String, Boolean)

正規パスが expectedPath と同じでない場合は、UnauthorizedAccessException をスローします。

RequireSamePath(SafeFileHandle, String)

指定された SafeFileHandle の正規パスが expectedPath と同じでない場合は、UnauthorizedAccessException をスローします。

SetFileAttributeNormal(String)

FileAttribute = Normal を設定してファイルを削除できるかどうかを確認します。 属性を設定できない場合、ユーザーはアクセス権を持っていません

WriteAllText(String, String)

新しいファイルを作成し、指定した文字列をそのファイルに書き込んだ後、ファイルを閉じます。 既存のターゲット ファイルは上書きされます。 ファイルの正規パスに Windows Reparse Points が含まれている場合、UnauthorizedAccessException はスローされ、何も書き込まれありません。

適用対象