다음을 통해 공유


침투 테스트(디바이스 기본 사항)

디바이스 기본 사항 침투 테스트는 보안 테스트의 중요한 구성 요소인 다양한 형태의 입력 공격을 수행합니다. 공격 및 침투 테스트는 소프트웨어 인터페이스의 취약성을 식별하는 데 도움이 될 수 있습니다.

침투

침투 테스트에는 퍼지 테스트와 I/O Spy 및 I/O공격 테스트라는 두 가지 테스트 범주가 포함됩니다. 퍼지 테스트는 디바이스 경로 Exceriser 테스트 도구의 기능이기도 합니다.

테스트 설명

I/O Spy 사용 안 함

1개 이상의 디바이스에서 I/O Spy 를 사용하지 않도록 설정합니다.

이진 테스트: Devfund_IOSpy_DisableSupport.wsc

테스트 방법: DisableIoSpy

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

I/O Spy 지원 디바이스 표시

I/O Spy를 사용하도록 설정된 디바이스를 표시합니다.

이진 테스트: Devfund_IOSpy_DisplayEnabledDevices.wsc

테스트 방법: DisplayIoSpyDevices

I/O Spy 사용

하나 이상의 디바이스에서 I/O Spy 를 사용하도록 설정합니다.

이진 테스트: Devfund_IOSpy_EnableSupport.wsc

테스트 방법: EnableIoSpy

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

DFD - IoSpy 데이터 파일의 경로를 지정합니다. 기본 위치는 %SystemDrive%\DriverTest\IoSpy입니다.

퍼지 기타 API 테스트

퍼지 기타 API 테스트는 드라이버가 커널 모드 드라이버에서 다양한 일반적인 호출을 처리할 수 있는지 여부를 결정하는 테스트입니다.

테스트에는 다음 테스트가 포함됩니다.

  • ZwReadFileZwWriteFile을 호출하여 유효한 데이터 버퍼 포인터, 다양한 길이(0 포함) 및 0, -1 및 64비트 오프셋을 포함한 다양한 바이트 오프셋을 지정합니다.

  • 를 호출하여 I/0을 취소하고 버퍼를 플러시합니다.

  • 유효한 사용자 데이터 버퍼 포인터와 다양한 버퍼 길이(0 포함)가 있는 일반적인 파일 정보 클래스를 사용하는 일련의 디렉터리 쿼리 호출.

  • VDM(Virtual DOS Machine)의 제어하에 실행되는 프로그램에서 발급된 것과 비슷한 디렉터리 쿼리 호출.

  • 버퍼 크기와 길이가 다른 파일의 확장 특성을 검색하기 위한 호출.

  • 다양한 섹션 페이지 보호 및 단면 할당 특성(커밋된 섹션, 이미지 파일 섹션)을 사용하여 섹션 개체를 만들고 닫는 호출.

  • 파일 잠금 및 잠금 해제를 위한 호출.

  • 볼륨에 대한 할당량 항목을 검색하기 위한 호출.

  • 파일 특성 테스트는 ObjectAttributes 구조체에 대한 유효한 포인터가 있는 일련의 파일 특성 쿼리입니다.

    파일 특성 테스트에는 길이가 0인 선택적 테스트가 있습니다. 파일의 확장된 특성을 검색하려고 하는 동안, 퍼지 테스트는 비어 있고 길이가 0인 쿼리와 잘못된 버퍼 주소를 드라이버에 전달합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoMiscAPITest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

길이가 0인 쿼리 테스트가 있는 퍼지 기타 API

이 테스트는 Fuzz Misc API 테스트와 동일한 테스트를 수행하며, 이번에는 파일의 확장 특성을 검색하는 동안 빈(길이가 0인) 쿼리와 잘못된 버퍼 주소를 드라이버에 전달합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoMiscAPIWithZeroLengthTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 열기 및 닫기 테스트

이 테스트는 수천 개의 열려 있는 만들기 시퀀스를 수행합니다.

이 테스트에 대한 자세한 내용은 퍼지 열기 및 닫기 테스트 정보를 참조하세요.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoOpenCloseTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 쿼리 및 파일 정보 설정 테스트

이 테스트는 호출을 발급하여 디바이스의 개체, 파일 및 볼륨 정보를 검색하고 변경합니다.

쿼리 및 파일 정보 설정 테스트 중에 Fuzz 테스트는 Fuzz 하위 열기 테스트에서 수행한 작업을 포함하여 기본 열기 작업 및 기타 열린 작업에서 연 디바이스의 개체, 파일 및 볼륨 정보를 검색하고 변경하기 위해 호출합니다.

Fuzz 테스트는 유효한 버퍼와 다양한 버퍼 길이 및 파일 정보 클래스를 사용하여 각 쿼리 또는 집합 호출을 최소 1024번 실행합니다. 각 유형의 하나의 요청은 유효하지 않은 버퍼 포인터와 0 버퍼 길이와 함께 전송됩니다.

보호 옵션을 설정하는 ChangeBufferProtectionFlags 매개 변수를 사용하는 경우 Fuzz 테스트는 각 쿼리 및 집합 호출에서 버퍼의 보안 설정을 변경합니다.

이 테스트는 또한 Fuzz 하위 열기 테스트를 수행합니다.

이 테스트는 ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFileZwSetVolumeInformationFile 함수를 사용합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoQueryAndSetFileInformationTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 쿼리 및 보안 테스트 설정

이 테스트는 호출을 발급하여 보안 설명자를 검색하고 디바이스의 보안 상태를 변경합니다.

쿼리 및 보안 설정 테스트 중에 퍼지 테스트는 보안 설명자를 검색하고 퍼지 하위 열기 테스트에서 수행한 작업을 포함하여 기본 열기 작업 및 기타 열린 작업에서 연 디바이스의 보안 상태를 변경하기 위해 호출합니다.

퍼지 테스트는 유효한 버퍼와 다양한 버퍼 길이 및 보안 정보 유형(OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION 및 정보 유형 없음)을 사용하여 각 쿼리 또는 집합 호출을 최소 1024번 발급합니다. 각 유형의 하나의 요청은 유효하지 않은 버퍼 포인터와 0 버퍼 길이와 함께 전송됩니다.

보호 옵션을 설정하는 ChangeBufferProtectionFlags 매개 변수를 사용하는 경우 퍼지 테스트는 각 쿼리 및 집합 호출에서 버퍼의 보안 설정을 변경합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoQueryAndSetSecurityTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 임의 FSCTL 테스트/퍼지 임의 IOCTL 테스트

이 테스트는 지정된 값 범위에서 임의로 선택된 함수 코드, 디바이스 유형, 데이터 전송 메서드 및 액세스 요구 사항을 사용하여 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 호출에는 유효하거나 유효하지 않은 버퍼 포인터와 길이가 있는 입력 및 출력 버퍼와 임의로 생성된 콘텐츠가 포함됩니다.

임의 테스트 중에 Fuzz 테스트는 지정된 값 범위에서 임의로 선택된 기능 코드, 디바이스 유형, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 호출에는 유효하거나 유효하지 않은 버퍼 포인터와 길이가 있는 입력 및 출력 버퍼와 임의로 생성된 콘텐츠가 포함됩니다.

퍼지 테스트는 기본 열기 작업 및 추가 공개 테스트 중에 열린 모든 디바이스에서 임의 테스트를 수행합니다. 다음 매개 변수를 사용하여 이 테스트를 사용자 지정할 수 있습니다.

  • MinFunctionCodeMaxFunctionCode를 사용하여 호출에 사용되는 IOCTL 또는 FSCTL 함수 코드 범위를 지정합니다.

  • MinDeviceTypeMaxDeviceType을 사용하여 호출에 사용되는 디바이스 유형 범위를 지정합니다.

  • SeedNumber를 사용하여 난수 생성 루틴의 시드 번호를 지정합니다.

Fuzz 테스트에서 테스트용 난수를 생성하는 데 사용하는 함수는 난수 생성 알고리즘의 시작 번호인 시드 번호를 사용합니다. 테스트 조건을 재현하려면 시드 번호 매개 변수를 사용하여 원래 테스트 시험에서 사용된 시드 번호를 지정합니다.

맞춤형 임의 테스트는 임의 테스트의 일부로 포함됩니다. 맞춤형 임의 테스트는 임의 테스트의 결과를 사용하여 IOCTL 또는 FSCTL 요청에 대한 드라이버 응답을 더 자세히 검사합니다. 맞춤형 임의 테스트는 임의 테스트가 놓친 영역과 임의 테스트 호출에서 반환된 상태를 기반으로 드라이버가 예상대로 응답하지 않은 영역을 조사합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoRandomIOCTLTest, DoRandomFSCTLTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 하위 열기 테스트

테스트는 디바이스의 네임스페이스에서 개체를 열기 위해 빠른 일련의 호출을 수행합니다. 이러한 호출에서는 디바이스로 시작하는 경로를 전달하고 임의의 이름과 다양한 길이와 콘텐츠의 넌센스 문자열을 포함합니다.

상대 열기 테스트(하위 열기 테스트라고도 함)에서 퍼지 테스트는 디바이스의 네임스페이스에서 개체를 열려고 시도합니다.

이 테스트 중에 퍼지 테스트는 기본 열기 작업 및 기타 열린 작업을 사용하여 연 디바이스의 네임스페이스에서 개체를 열기 위해 빠른 일련의 호출을 수행합니다. 이러한 호출에서 퍼지 테스트는 디바이스로 시작하는 경로를 통과하고 임의의 이름과 다양한 길이 및 콘텐츠의 넌센스 문자열을 포함합니다.

이 테스트는 드라이버 또는 파일 시스템이 네임스페이스에서 열린 요청을 관리하는 방법을 결정합니다. 특히 드라이버가 네임스페이스에서 열린 요청을 지원하지 않는 경우 요청을 실패하거나 IoCreateDevice 또는 IoCreateDeviceSecure를 사용하여 디바이스 개체를 만들 때 FILE_DEVICE_SECURE_OPEN 디바이스 특성을 설정하여 무단 액세스를 방지해야 합니다.

디바이스의 네임스페이스에 대한 자세한 내용은 디바이스 네임스페이스 액세스 제어를 참조하세요.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoSubOpensTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

스트림 테스트로 퍼지 하위 열기

이 테스트는 디바이스에서 다양한 명명된 데이터 스트림을 열려고 시도합니다. 이 테스트는 일부 디바이스에서 다른 용도로 유효할 수 있는 콘텐츠 및 문자와 함께 일련의 임의 스트림 이름을 사용합니다.

스트림 테스트 중에 퍼지 테스트는 디바이스에서 다양한 명명된 데이터 스트림을 열려고 시도합니다. 테스트는 일부 디바이스에서 다른 용도로 유효할 수 있는 콘텐츠 및 문자와 함께 일련의 임의 스트림 이름을 사용합니다. 이 테스트는 특히 드라이버가 데이터 스트림을 지원 또는 예상하지 않는 디바이스를 내보내는 경우 드라이버가 데이터 스트림 요청을 제대로 처리할 수 있는지 여부를 결정합니다.

명명된 데이터 스트림은 파일 개체의 특성입니다. 파일의 이름, 콜론 및 데이터 스트림의 이름(예: “File01.txt:AccessDate”, 여기서 AccessDate는 명명된 데이터 스트림. 즉, File01.txt 파일의 특성)을 작성하여 명명된 데이터 스트림을 지정합니다.

퍼지 테스트는 테스트에 사용된 스트림 이름을 기록합니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 메서드: DoSubOpensWithStreamsTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

퍼지 Zero-Length 버퍼 FSCTL 테스트/퍼지 Zero-Length 버퍼 IOCTL 테스트

이 테스트는 입력 및/또는 출력 버퍼 길이가 0인 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 이 테스트는 다양한 함수 코드, 디바이스 유형, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 다양한 파일 시스템 제어 코드를 생성합니다.

Zero-Length 버퍼 테스트 중에 퍼지 테스트는 입력 및/또는 출력 버퍼 길이가 0인 DeviceIoControl 함수에 대한 일련의 호출을 실행합니다. 이 테스트는 다양한 함수 코드, 디바이스 유형, 데이터 전송 방법 및 액세스 요구 사항을 사용하여 다양한 I/O 제어 코드를 생성합니다. I/O 제어 코드의 내용에 대한 자세한 내용은 I/O 제어 코드 정의를 참조하세요.

드라이버의 잘못된 버퍼 포인터 처리를 테스트하기 위해 이러한 사용자 모드 호출의 버퍼 포인터는 커널 가상 주소 공간에 많은 주소(예: 0xFFFFFC00)를 지정합니다.

퍼지 테스트는 기본 및 열린 추가 테스트 중에 열린 모든 디바이스에서 제로 길이 버퍼 테스트를 수행합니다. MinFunctionCodeMaxFunctionCode 명령 매개 변수를 사용하여 호출에 사용되는 IOCTL 또는 FSCTL 함수 코드의 범위를 지정하고 MinDeviceTypeMaxDeviceType을 사용하여 호출에 사용되는 디바이스 유형의 범위를 지정하여 이 테스트를 사용자 지정할 수 있습니다.

이진 테스트: Devfund_DevicePathExerciser.dll

테스트 방법: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

I/O 공격 실행

지정된 디바이스 또는 디바이스에서 I/O 공격을 실행합니다.

이진 테스트: Devfund_IOAttack_DeleteDataFile.wsc

테스트 방법: RunIoAttack

매개 변수: - 디바이스 기본 사항 테스트 매개 변수 참조

DQ

퍼지 열기 및 닫기 테스트 정보

퍼지 열기 및 닫기 테스트는 지정된 디바이스 또는 디바이스의 인스턴스를 열고 닫는 여러 가지 방법을 사용합니다. 기본 열기 작업, 직접 디바이스 열기 작업열기 및 닫기 테스트.

기본 열기 작업

기본 열기 작업 중에 Fuzz 테스트는 다른 메서드와 옵션을 사용하여 지정된 디바이스 또는 지정된 드라이버에서 내보낸 디바이스의 인스턴스를 반복적으로 열거나 만듭니다.

Fuzz 테스트는 항상 기본 열기 작업을 수행합니다. 선택할 필요가 없으며 테스트 세션에서 제외할 수 없습니다.

Fuzz 테스트는 디바이스에 적합한 시스템 서비스(ZwXxx 루틴)를 호출하여 사용자 모드에서 열려 있는 모든 작업을 수행합니다. 열기 호출이 디바이스에 대한 핸들을 반환하면 Fuzz 테스트는 핸들을 사용하여 테스트 세션에 대해 선택된 다른 디바이스 테스트를 수행합니다.

기본 열기 작업에는 5가지 유형이 있습니다.

  • 표준이 열려 있습니다. Fuzz 테스트는 디바이스를 비동기적으로 열고 네이티브 디바이스 이름만 지정합니다.

  • 백슬래시가 추가된 상태에서 엽니다. Fuzz 테스트는 디바이스 이름에 대해 열린 호출을 수행한 다음, 디바이스 내에서 루트 디렉터리를 여는 것처럼 \device\cdrom\과 같은 백슬래시()를 호출합니다.

    이 작업은 드라이버 또는 파일 시스템이 네임스페이스에서 열린 요청을 관리하는 방법을 결정합니다. 특히 디바이스가 네임스페이스에서 열린 요청을 지원하지 않는 경우 드라이버는 요청에 실패하거나 IoCreateDevice 또는 IoCreateDeviceSecure를 호출하여 디바이스 개체를 만들 때 FILE_DEVICE_SECURE_OPEN 디바이스 특성을 설정하여 무단 액세스를 방지해야 합니다.

  • 명명된 파이프로 엽니다. 퍼지 테스트는 디바이스를 열고 디바이스에 명명된 파이프를 설정합니다. 액세스 매개 변수(ShareAccess)는 처음에 읽기 및 쓰기로 설정되지만 요청이 실패하면 조정됩니다. 디바이스가 명명된 파이프를 지원하지 않으면 요청에 실패해야 합니다.

  • mailslot으로 엽니다. 퍼지 테스트는 디바이스를 mailslot으로 엽니다. 디바이스가 이러한 유형의 연결을 지원하지 않으면 요청에 실패해야 합니다.

  • 트리 연결로 엽니다. Fuzz 테스트는 원격 네트워크 액세스에 사용할 트리 연결로 디바이스를 엽니다. 액세스 매개 변수(ShareAccess)는 처음에 읽기 및 쓰기로 설정되지만 요청이 실패하면 조정됩니다. 디바이스가 이러한 유형의 연결을 지원하지 않으면 요청에 실패해야 합니다.

열기 호출에 사용되는 매개 변수는 디바이스의 특성을 수용하고 호출이 성공할 가능성이 높도록 하기 위해 달라집니다. 예를 들어 호출이 디바이스의 보안 요구 사항을 충족하지 않아 기본 열기 작업이 실패하면 Fuzz 테스트는 더 적은 액세스 권한을 요청하여 열기 작업을 반복합니다. 예를 들어 쓰기 권한을 요청한 열기 작업이 보안 위반 오류를 반환하면 읽기 권한 요청과 함께 열기가 반복됩니다.

직접 디바이스 열기 작업

직접 디바이스 열기 작업 중에 Fuzz 테스트는 파일 시스템의 파일이 아니라 디바이스로 직접 디바이스를 엽니다. 직접 디바이스 열기 작업은 항상 동기식입니다. 호출이 성공하면 Fuzz 테스트는 제공된 핸들을 사용하여 선택한 다른 테스트를 수행합니다.

열기 및 닫기 테스트

열기 및 닫기 테스트 동안 Fuzz 테스트는 여러 스레드를 만들며, 각 스레드는 수천 개의 만들기-열기-닫기 시퀀스를 수행합니다. 이는 간단하고 예상되는 엄청난 양의 전화를 처리하는 운전자의 기능을 테스트합니다.

열기 및 닫기 테스트는 기본 열기 작업 및 추가된 백슬래시 테스트를 사용하여 열기에 사용되는 것과 동일한 옵션을 사용하며 이러한 테스트 직전에 수행됩니다.

Visual Studio를 사용하여 런타임에 드라이버를 테스트하는 방법

디바이스 기본 사항 테스트를 선택 및 구성하는 방법

디바이스 기본 사항 테스트

제공된 WDTF 간단한 I/O 플러그 인

명령 프롬프트에서 런타임에 드라이버를 테스트하는 방법