다음을 통해 공유


ReparsePointAware 클래스

정의

상호 작용하는 파일 및 폴더의 경로에 Windows 재분석 지점이 없고 코드의 경로가 디스크의 실제 경로와 일치하도록 하는 파일 및 디렉터리 유틸리티 함수의 컬렉션입니다.

재분석 지점 주입은 보안 악용의 알려진/일반적인 벡터입니다. 자세한 내용은 여기를 참조하세요. https://docs.microsoft.com/en-us/windows/win32/fileio/reparse-points

이 함수 집합의 목표는 Windows 파일 핸들을 가져와 예상 경로에 있는지 확인한 다음 동일한 핸들로 모든 파일 작업을 수행하는 것입니다. 공격자가 파일의 검사 파일 경로에 따라 파일 작업 간의 경합을 악용할 수 있으므로 파일을 확인한 다음 파일 경로를 사용하여 추가 작업을 수행하는 것은 안전한 패턴이 아닙니다. 이 공격 클래스를 TOCTOU(Time of Check/Time-of-Use)라고 합니다. 이를 방지하기 위해 이 클래스는 파일 핸들을 유지하고 올바른 위치에 있는 것으로 간주되면 핸들에 대한 모든 작업을 수행합니다. 모든 작업은 파일 핸들을 기반으로 하므로 올바른 것으로 확인된 파일을 수정하고 있습니다.

public static class ReparsePointAware
type ReparsePointAware = class
Public Class ReparsePointAware
상속
ReparsePointAware

메서드

CreateDirectory(String)

지정된 경로에 모든 디렉터리 및 하위 디렉터리를 만듭니다. 디렉터리의 정식 경로에 Windows 재분석 지점이 포함된 경우 UnauthorizedAccessException이 throw됩니다.

CreateText(String)

UTF-8로 인코딩된 텍스트를 쓰기 위해 파일을 만들거나 엽니다. 기존 파일을 열면 파일이 잘립니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw되고 아무 것도 기록되지 않습니다.

DeleteFile(String)

지정한 파일을 삭제합니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw되고 아무 것도 삭제되지 않습니다.

GetFinalPath(SafeFileHandle)

모든 재분석 지점이 확장된 지정된 SafeFileHandle에 대한 전체 정식 경로를 가져옵니다.

HasReparsePoints(SafeFileHandle, String)

SafeFileHandle이 나타내는 파일 시스템 개체에 지정된 expectedPath와 일치하는 정식 경로가 있는지 확인합니다.

MoveFile(String, String)

지정된 파일을 새 위치로 이동하고 새 파일의 이름을 지정할 수 있는 옵션을 제공합니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw됩니다.

OpenFile(String, FileMode, FileAccess, FileShare)

지정된 경로에서 System.IO.FileStream을 열고 읽기, 쓰기 또는 읽기/쓰기 권한이 있는 지정된 모드와 지정된 공유 옵션을 갖습니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw됩니다. OpenFile은 파일 작업을 수행하기 전에 먼저 디렉터리를 고정합니다. 디렉터리 고정에 실패하거나 디렉터리가 ReparsePoint인 경우 UnauthorizedAccessException이 throw됩니다.

OpenRead(String)

읽기용으로 기존 파일을 엽니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw됩니다.

OpenWrite(String)

쓰기 위해 기존 파일을 열거나 새 파일을 만듭니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw됩니다.

PinAndRequireNoReparsePoints(String, Boolean)

기존 파일 또는 디렉터리에 대한 SafeFileHandle을 열고 결과 정식 경로가 지정된 경로의 경로와 일치하는지 확인합니다. 결과 SafeFileHandle은 IDisposable이며 using 문 내에서 사용하여 후속 파일 작업이 재분석 지점 없이 경로에 쓰도록 할 수 있습니다.

PinHandle(String, Boolean)

기존 파일 또는 디렉터리에 대한 핸들을 사용하여 이동할 수 없도록 합니다.

RequireNoReparsePoints(String, Boolean)

정식 경로가 expectedPath와 같지 않으면 UnauthorizedAccessException을 throw합니다.

RequireSamePath(SafeFileHandle, String)

지정된 SafeFileHandle의 정식 경로가 expectedPath와 같지 않으면 UnauthorizedAccessException을 throw합니다.

SetFileAttributeNormal(String)

FileAttribute = Normal을 설정하여 파일을 삭제할 수 있는지 확인합니다. 특성을 설정할 수 없는 경우 사용자에게 액세스 권한이 없습니다.

WriteAllText(String, String)

새 파일을 만들고 지정된 문자열을 파일에 쓴 다음 파일을 닫습니다. 대상 파일이 이미 있으면 덮어씁니다. 파일의 정식 경로에 Windows 재분석 지점이 포함되어 있으면 UnauthorizedAccessException이 throw되고 아무 것도 기록되지 않습니다.

적용 대상