침투 테스트(디바이스 기본 사항)
디바이스 기본 사항 침투 테스트는 보안 테스트의 중요한 구성 요소인 다양한 형태의 입력 공격을 수행합니다. 공격 및 침투 테스트는 소프트웨어 인터페이스의 취약성을 식별하는 데 도움이 될 수 있습니다.
침투
침투 테스트에는 퍼지 테스트 및 I/O Spy 및 I/O 공격 테스트의 두 가지 범주가 포함됩니다. 퍼즈 테스트는 디바이스 경로 익서사이저 테스트 도구의 기능이기도 합니다.
테스트 | 묘사 |
---|---|
I/O 스파이를 비활성화 |
1개 이상의 디바이스에서 I/O Spy 사용하지 않도록 설정합니다. 테스트 이진: Devfund_IOSpy_DisableSupport.wsc Test 메서드: DisableIoSpy 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DQ |
I/O Spy가 활성화된 장치 표시 |
I/O Spy 사용하도록 설정된 디바이스를 표시합니다. 바이너리 테스트: Devfund_IOSpy_DisplayEnabledDevices.wsc Test 메서드: DisplayIoSpyDevices |
I/O 스파이 활성화 |
하나 이상의 디바이스에서 I/O Spy 사용하도록 설정합니다. 테스트 이진: Devfund_IOSpy_EnableSupport.wsc Test 메서드: EnableIoSpy 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DQ DFD - IoSpy 데이터 파일의 경로를 지정합니다. 기본 위치는 %SystemDrive%\DriverTest\IoSpy입니다. |
퍼지 기타 API 테스트 |
Fuzz Misc API 테스트는 드라이버가 커널 모드 드라이버에서 다양한 일반 호출을 처리할 수 있는지 여부를 결정하는 테스트입니다. 테스트에는 다음 테스트가 포함됩니다.
테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoMiscAPITest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트 사이클 ChangeBufferProtectionFlags 사칭하다 FillZeroPageWithNull |
길이가 0인 쿼리 테스트로 Fuzz Misc API 수행하기 |
이 테스트는 Fuzz Misc API 테스트와 동일한 테스트를 수행하며, 이번에는 파일의 확장 특성을 검색하는 동안 빈(길이가 0인) 쿼리와 잘못된 버퍼 주소를 드라이버에 전달합니다. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 방법: DoMiscAPIWithZeroLengthTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트사이클 ChangeBufferProtectionFlags 가장하다 FillZeroPageWithNull |
퍼즈 열기 및 닫기 테스트 |
이 테스트는 수천 번의 생성-열기-닫기 시퀀스를 수행합니다. 이 테스트에 대한 자세한 내용은 퍼즈 열기 및 닫기 테스트을 참조하세요. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoOpenCloseTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ TestCycles ChangeBufferProtectionFlags 사칭하다 FillZeroPageWithNull |
퍼즈 쿼리 및 파일 정보 설정 테스트 |
이 테스트는 디바이스의 개체, 파일 및 볼륨 정보를 검색하고 변경하는 호출을 실행합니다. 쿼리 및 파일 정보 설정 테스트동안 Fuzz 테스트는, 기본 열기 작업 및 Fuzz 하위 열기 테스트를 포함해 여러 다른 열기 작업에서 개체, 파일 및 볼륨 정보를 검색하고 변경하기 위한 호출을 수행합니다. Fuzz 테스트는 유효한 버퍼와 다양한 버퍼 길이 및 파일 정보 클래스를 사용하여 각 쿼리 또는 집합 호출을 1024번 이상 실행합니다. 또한 각 형식에 대한 하나의 요청은 잘못된 버퍼 포인터와 버퍼 길이가 0으로 전송됩니다. 보호 옵션을 설정하는 ChangeBufferProtectionFlags 매개 변수를 사용하는 경우 Fuzz 테스트는 각 쿼리의 버퍼에 대한 보안 설정을 변경하고 호출을 설정합니다. 이 테스트는 퍼즈 서브-오픈 테스트도 수행합니다. 이 테스트는 ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile및 ZwSetVolumeInformationFile 함수를 사용합니다. 테스트 이진: Devfund_DevicePathExerciser.dll 시험 방법: DoQueryAndSetFileInformationTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트 사이클 ChangeBufferProtectionFlags 가장 FillZeroPageWithNull |
퍼즈 쿼리 및 보안 테스트 설정 |
이 테스트는 보안 설명자를 검색하고 디바이스의 보안 상태를 변경하는 호출을 실행합니다. 쿼리 및 보안 테스트 설정동안, Fuzz 테스트는 보안 설명자를 검색하고, 기본 열기 작업 및 Fuzz 하위 열기 테스트에서 수행된 작업을 포함한 다른 열기 작업에서 열린 장치의 보안 상태를 변경하는 호출을 실행합니다. Fuzz 테스트는 유효한 버퍼와 다양한 버퍼 길이 및 보안 정보 유형(OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION 및 정보 유형 없음)을 사용하여 각 쿼리 또는 설정 호출을 1024번 이상 실행합니다. 또한 각 형식에 대한 하나의 요청은 잘못된 버퍼 포인터와 버퍼 길이가 0으로 전송됩니다. 보호 옵션을 설정하는 ChangeBufferProtectionFlags 매개 변수를 사용하는 경우 Fuzz 테스트는 각 쿼리의 버퍼에 대한 보안 설정을 변경하고 호출을 설정합니다. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoQueryAndSetSecurityTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트사이클 ChangeBufferProtectionFlags 사칭하다 FillZeroPageWithNull |
퍼지 임의 FSCTL 테스트/퍼지 임의 IOCTL 테스트 |
이 테스트는 지정된 값 범위에서 임의로 선택된 함수 코드, 디바이스 형식, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 호출에는 유효하고 잘못된 버퍼 포인터와 길이가 있는 입력 및 출력 버퍼와 임의로 생성된 콘텐츠가 포함됩니다. 무작위 테스트 중에 Fuzz 테스트는 지정된 값 범위에서 임의로 선택된 함수 코드, 디바이스 형식, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 호출에는 유효하고 잘못된 버퍼 포인터와 길이가 있는 입력 및 출력 버퍼와 임의로 생성된 콘텐츠가 포함됩니다. Fuzz 테스트는 기본 열기 작업 및 추가 열기 테스트 중에 열린 모든 디바이스에서 임의 테스트를 수행합니다. 다음 매개 변수를 사용하여 이 테스트를 사용자 지정할 수 있습니다.
Fuzz 테스트에서 테스트의 난수를 생성하는 데 사용하는 함수는 난수 생성 알고리즘의 시작 번호인 시드 번호사용합니다. 테스트 조건을 재현하려면 시드 번호 매개 변수를 사용하여 원래 테스트 시험에서 사용된 시드 번호를 지정합니다. 맞춤형 임의 테스트 임의 테스트의 일부로 포함됩니다. 맞춤형 임의 테스트는 임의 테스트의 결과를 사용하여 IOCTL 또는 FSCTL 요청에 대한 드라이버 응답을 보다 자세히 검사합니다. 맞춤형 임의 테스트는 임의 테스트가 누락된 영역과 임의 테스트 호출에서 반환된 상태에 따라 드라이버가 예상대로 응답하지 않은 영역을 검색합니다. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoRandomIOCTLTest, DoRandomFSCTLTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 MinInBuffer maxInBuffer MinOutBuffer MaxOutBuffer MaxRandomCalls MaxTailoredCalls 시드번호 최소장치유형 최대장치유형 최소 함수 코드 maxFunctionCode DoPoolCheck DQ TestCycles ChangeBufferProtectionFlags 가장 FillZeroPageWithNull |
퍼즈 서브 열기 테스트 |
이 테스트는 디바이스의 네임스페이스에서 개체를 열기 위해 빠른 일련의 호출을 수행합니다. 이러한 호출에서는 디바이스로 시작하는 경로를 전달하고 임의의 이름과 다양한 길이와 콘텐츠의 넌센스 문자열을 포함합니다. 상대 열기 테스트(하위 열기 테스트라고도 함)에서 Fuzz 테스트는 디바이스의 네임스페이스개체를 열려고 시도합니다. 이 테스트 중에 Fuzz 테스트는 기본 열기 작업 및 기타 열린 작업을 사용하여 열린 디바이스의 네임스페이스에서 개체를 열기 위해 빠른 일련의 호출을 수행합니다. 이러한 호출에서 Fuzz 테스트는 디바이스로 시작하는 경로를 통과하고 임의의 이름과 다양한 길이 및 콘텐츠의 넌센스 문자열을 포함합니다. 이 테스트는 드라이버 또는 파일 시스템이 네임스페이스에서 열린 요청을 관리하는 방법을 결정합니다. 특히 드라이버가 네임스페이스에서 열린 요청을 지원하지 않는 경우 요청에 실패하거나 IoCreateDevice 또는 IoCreateDeviceSecure 사용하여 디바이스 개체를 만들 때 FILE_DEVICE_SECURE_OPEN 디바이스 특성을 설정하여 무단 액세스를 방지해야 합니다. 디바이스의 네임스페이스에 대한 자세한 내용은 과디바이스 네임스페이스 액세스 제어를 참조하세요. 테스트 바이너리: Devfund_DevicePathExerciser.dll Test 메서드: DoSubOpensTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트사이클 ChangeBufferProtectionFlags 가장 FillZeroPageWithNull |
스트림 테스트로 퍼즈 하위 기능 열기 |
이 테스트는 디바이스에서 다양한 명명된 데이터 스트림을 열려고 시도합니다. 이 테스트는 일부 디바이스에서 다른 용도로 사용할 수 있는 콘텐츠 및 문자와 함께 일련의 임의 스트림 이름을 사용합니다. 스트림 테스트동안 Fuzz 테스트는 디바이스에서 다양한 명명된 데이터 스트림을 열려고 시도합니다. 테스트는 일부 디바이스에서 다른 용도로 사용할 수 있는 콘텐츠 및 문자와 함께 일련의 임의 스트림 이름을 사용합니다. 이 테스트는 특히 드라이버가 데이터 스트림을 지원하거나 예상하지 않는 디바이스를 내보내는 경우 드라이버가 데이터 스트림 요청을 제대로 처리할 수 있는지 여부를 결정합니다. 파일 개체의 속성인 라는 명명된 데이터 스트림입니다. 파일 이름, 콜론 및 데이터 스트림의 이름을 작성하여 명명된 데이터 스트림을 지정합니다. 예를 들어 AccessDate 명명된 데이터 스트림인 "File01.txt:AccessDate", 즉 File01.txt 파일의 특성입니다. Fuzz 테스트는 테스트에 사용된 스트림 이름을 기록합니다. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoSubOpensWithStreamsTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DoPoolCheck DQ 테스트 사이클 ChangeBufferProtectionFlags 흉내내다 FillZeroPageWithNull |
퍼지 Zero-Length 버퍼 FSCTL 테스트/퍼지 Zero-Length 버퍼 IOCTL 테스트 |
이 테스트는 입력 및/또는 출력 버퍼 길이가 0인 DeviceIoControl 함수 대한 일련의 호출을 실행합니다. 이 테스트는 다양한 함수 코드, 디바이스 형식, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 다양한 파일 시스템 제어 코드를 생성합니다. Zero-Length 버퍼 테스트 중에 Fuzz 테스트는 입력 및/또는 출력 버퍼 길이가 0인DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 이 테스트는 다양한 함수 코드, 디바이스 유형, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 다양한 I/O 제어 코드를 생성합니다. I/O 컨트롤 코드의 내용에 대한 자세한 내용은 정의 I/O 컨트롤 코드참조하세요. 드라이버의 잘못된 버퍼 포인터 처리를 테스트하기 위해 이러한 사용자 모드 호출의 버퍼 포인터는 커널 가상 주소 공간(예: 0xFFFFFC00)에서 높은 주소를 지정합니다. Fuzz 테스트는 기본 및 추가 열린 테스트 중에 열린 모든 디바이스에서 Zero-Length 버퍼 테스트를 수행합니다. MinFunctionCode 및 MaxFunctionCode 명령 매개 변수를 사용하여 호출에 사용되는 IOCTL 또는 FSCTL 함수 코드의 범위를 지정하고 MinDeviceType 및 MaxDeviceType 호출에 사용되는 디바이스 유형의 범위를 지정하여 이 테스트를 사용자 지정할 수 있습니다. 테스트 이진: Devfund_DevicePathExerciser.dll 테스트 메서드: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 최소장치유형 maxDeviceType MinFunctionCode 맥스함수코드 DoPoolCheck TestCycles ChangeBufferProtectionFlags 사칭하다 FillZeroPageWithNull |
I/O 공격 실행 |
지정된 디바이스 또는 디바이스들에서 I/O 공격을 실행합니다. 테스트 이진: Devfund_IOAttack_DeleteDataFile.wsc 테스트 메서드: RunIoAttack 매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조 DQ |
퍼지 열기 및 닫기 테스트 정보
Fuzz 열기 및 닫기 테스트는 지정된 디바이스 또는 디바이스의 인스턴스를 열고 닫는 여러 가지 방법을 사용합니다. 기본 열기 작업, 직접 디바이스 열기 작업및 열기 및 닫기 테스트.
기본 열기 작업
기본 열기 작업동안 Fuzz 테스트는 다른 메서드와 옵션을 사용하여 지정된 디바이스 또는 지정된 드라이버에서 내보낸 디바이스의 인스턴스를 반복적으로 엽니다(생성).
퍼즈 테스트는 항상 기본 열기 작업을 수행합니다. 선택할 필요가 없으며 테스트 세션에서 제외할 수 없습니다.
Fuzz 테스트는 디바이스에 적합한 시스템 서비스(ZwXxx 루틴)를 호출하여 사용자 모드에서 열려 있는 모든 작업을 수행합니다. 열린 호출이 디바이스에 대한 핸들을 반환하는 경우 Fuzz 테스트는 핸들을 사용하여 테스트 세션에 대해 선택한 다른 디바이스 테스트를 수행합니다.
다음과 같은 다섯 가지 유형의 기본 열기 작업이 있습니다.
기본 열기. Fuzz 테스트는 디바이스를 비동기적으로 열고 네이티브 디바이스 이름만 지정합니다.
백슬래시를 추가하여 엽니다. Fuzz 테스트는 디바이스 이름에 대해 열린 호출을 실행한 다음, 디바이스 내에서 루트 디렉터리를 여는 것처럼 백슬래시(예: \device\cdrom\)를 실행합니다.
이 작업은 드라이버 또는 파일 시스템이 네임스페이스에서 열린 요청을 관리하는 방법을 결정합니다. 특히 디바이스가 네임스페이스에서 열린 요청을 지원하지 않는 경우 드라이버는 요청을 실패시키거나 디바이스 개체를 생성할 때 FILE_DEVICE_SECURE_OPEN 디바이스 특성을 설정함으로써 무단 액세스를 방지해야 합니다. 이를 위해 드라이버는 IoCreateDevice 또는 IoCreateDeviceSecure를 호출할 수 있습니다.
명명된 파이프로 엽니다. Fuzz 테스트는 디바이스를 열고 디바이스에 명명된 파이프를 설정합니다. 액세스 매개 변수(ShareAccess)는 처음에는 읽기 및 쓰기로 설정되지만 요청이 실패하면 조정됩니다. 디바이스가 명명된 파이프를 지원하지 않는 경우 요청에 실패해야 합니다.
메일 슬롯으로 엽니다. Fuzz 테스트는 디바이스를 메일슬롯으로 엽니다. 디바이스가 이러한 유형의 연결을 지원하지 않는 경우 요청에 실패해야 합니다.
트리 연결로 엽니다. Fuzz 테스트는 원격 네트워크 액세스에 사용할 트리 연결로 디바이스를 엽니다. 액세스 매개 변수(ShareAccess)는 처음에는 읽기 및 쓰기로 설정되지만 요청이 실패하면 조정됩니다. 디바이스가 이러한 유형의 연결을 지원하지 않는 경우 요청에 실패해야 합니다.
열린 호출에 사용되는 매개 변수는 디바이스의 특성을 수용하고 호출이 성공할 가능성이 높도록 다양합니다. 예를 들어 호출이 디바이스의 보안 요구 사항을 충족하지 않아 기본 열기 작업이 실패하는 경우 Fuzz 테스트는 더 적은 액세스에 대한 요청으로 열린 작업을 반복합니다. 예를 들어 쓰기 액세스를 요청한 열기 작업이 보안 위반 오류를 반환하는 경우 읽기 액세스 요청과 함께 열기가 반복됩니다.
직접 디바이스 열기 작업
직접 디바이스 열기 작업동안 Fuzz 테스트는 디바이스를 파일 시스템의 파일이 아닌 디바이스로 직접 엽니다. 직접 디바이스 열기 작업은 항상 동기적입니다. 호출에 성공하면 Fuzz 테스트는 제공된 핸들을 사용하여 선택한 다른 테스트를 수행합니다.
테스트 열기 및 닫기
열기 및 닫기 테스트동안 Fuzz 테스트는 여러 스레드를 만듭니다. 각 스레드는 수천 개의 개방형 닫기 시퀀스를 수행합니다. 이렇게 하면 단순하고 예상되는 호출의 특별한 볼륨을 처리하는 드라이버의 기능이 테스트됩니다.
열기 및 닫기 테스트에서는 기본 열기 작업 및 추가된 백슬래시 열기 테스트에서 사용되는 것과 동일한 옵션을 사용하며, 이러한 테스트 직전에 이 옵션들이 활용됩니다.
관련 항목
Visual Studio 사용하여 런타임에 드라이버를 테스트하는 방법
디바이스 기본 사항 테스트 선택하고 구성하는 방법
명령 프롬프트 런타임에 드라이버를 테스트하는 방법