다음을 통해 공유


커널 주소 소독기(KASAN)

KASAN(커널 주소 삭제기)은 Windows 커널 드라이버에서 지원되는 버그 감지 기술로, 버퍼 오버플로 및 사용 후 사용 이벤트와 같은 여러 종류의 잘못된 메모리 액세스를 검색할 수 있습니다. 시스템에서 KASAN을 사용하도록 설정하고 커널 드라이버를 특정 MSVC 컴파일러 플래그로 다시 컴파일해야 합니다.

필수 구성 요소

KASAN을 사용하려면 다음이 필요합니다.

  • 커널 드라이버가 로드되는 대상 시스템의 OS 버전:
    • 클라이언트: Windows 11 24H2 이상.
    • 서버: Windows Server 2025 이상.
  • VisualStudio: 버전 17.11 이상.
  • WDK: 버전 10.0.26100.2161 이상

KASAN은 x64에서만 지원됩니다.

커널 드라이버에서 KASAN을 사용하도록 설정하는 방법

  1. 대상 시스템의 관리자 명령 프롬프트 창에 다음 명령줄을 입력합니다.

    reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
    
  2. 변경 내용을 적용하려면 대상 시스템을 다시 부팅합니다.

  3. MSVC 컴파일러에 새 플래그를 전달하여 KASAN 계측을 사용하도록 설정된 커널 드라이버를 다시 컴파일합니다. 다음 방법 중 하나를 사용할 수 있습니다.

    • GUI: VisualStudio에서 솔루션 탐색기 이동하여 커널 드라이버 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 속성 페이지에서 구성 속성>>C/C++>>일반으로 이동하고 커널 주소 소독자 사용 설정을 예설정합니다. 그런 다음 솔루션을 다시 빌드합니다.
    • 명령 프롬프트: /fsanitize=kernel-address 매개 변수를 컴파일러 명령줄에 추가합니다. 그런 다음 솔루션을 다시 빌드합니다.
  4. 다시 컴파일된 커널 드라이버를 대상 시스템에 로드하고 평소처럼 스트레스 테스트를 합니다. KASAN은 런타임에 작동하며 버그 확인 0x1F2: KASAN_ILLEGAL_ACCESS 통해 잘못된 메모리 액세스 이벤트를 보고합니다.

커널 드라이버에서 KASAN이 사용하도록 설정되어 있는지 확인하는 방법

KASAN으로 컴파일된 커널 드라이버에는 "KASAN"라는 PE 섹션이 있습니다. 개발자 명령 프롬프트에서 다음 명령을 실행하여 드라이버에서 KASAN이 사용하도록 설정되어 있는지 확인합니다.

dumpbin /ALL YourDriver.sys

출력에 "KASAN"라는 섹션이 포함되어 있으면 드라이버에서 KASAN이 활성화됩니다.

KASAN 보고서를 분석하는 방법

KASAN이 드라이버에서 잘못된 메모리 액세스를 감지하면 버그 검사 0x1F2 KASAN_ILLEGAL_ACCESS. 생성된 커널 메모리 덤프를 검사하여 드라이버가 잘못된 메모리 액세스를 정확히 수행한 위치를 확인합니다.

대상 시스템에 연결된 커널 디버거와 함께 KASAN을 사용하여 메모리 덤프를 사용한 사후 분석 대신 버그 검사가 실행되는 즉시 메모리를 동적으로 검사할 수 있습니다.

버그 검사 매개 변수

버그 검사 0x1F2 매개 변수 : KASAN_ILLEGAL_ACCESS 다음과 같습니다.

  1. 매개 변수 1: 불법으로 액세스되는 주소입니다.
  2. 매개 변수 2: 메모리 액세스의 크기입니다.
  3. 매개 변수 3: 잘못된 메모리 액세스를 수행하는 호출자의 주소입니다.
  4. 매개 변수 4: 메모리 액세스에 대한 추가 정보:
    • 비트 [0:7]: KASAN 섀도 코드입니다. 아래 표를 참조하세요.
    • 비트 8: 1 액세스가 쓰기인 경우 읽기 0 인 경우

KASAN 섀도 코드

KASAN에서는 모든 커널 메모리가 8바이트에 정렬된 8바이트 셀의 연속된 청크로 나뉩니다. KASAN을 사용하면 커널 메모리의 각 8 바이트 셀에는 셀의 유효성을 나타내는 1 바이트 정수인 섀도 코드 가 연결되어 있습니다. 섀도 코드의 인코딩은 다음과 같습니다.

의미
0x00 셀은 전적으로 유효합니다. 셀의 8바이트 모두에 대한 액세스는 합법적입니다.
0x01 ->0x07 셀이 부분적으로 유효합니다. 셀의 첫 번째 바이트는 유효하지만 나머지는 유효하지 않습니다.
>= 0x80 셀이 완전히 유효하지 않습니다. 셀의 8바이트 모두에 대한 액세스가 잘못되었습니다.

완전히 잘못된 셀에 대해 여러 하위 코드가 사용되어 셀이 연결된 메모리의 유형과 해당 셀이 잘못된 이유를 추가로 나타냅니다.

  • 0x81: alloca의 왼쪽 redzone입니다.
  • 0x82: 알로카의 중간 redzone입니다.
  • 0x83: 알로카의 오른쪽 redzone입니다.
  • 0x84: 전역 변수의 오른쪽 redzone입니다.
  • 0x85: 제네릭 레드존.
  • 0x86: 풀 메모리의 오른쪽 redzone입니다.
  • 0x87: 해제된 메모리입니다.
  • 0x8A: 연속 메모리의 왼쪽 redzone입니다.
  • 0x8B: 연속 메모리의 오른쪽 redzone입니다.
  • 0x8C: lookasidelist 메모리를 해제했습니다.
  • 0x8D: 풀 메모리의 왼쪽 redzone입니다.
  • 0xF1: 스택 변수의 왼쪽 redzone입니다.
  • 0xF2: 스택 변수의 중간 redzone입니다.
  • 0xF3: 스택 변수의 오른쪽 redzone입니다.
  • 0xF5: used-after-ret 스택 변수입니다.
  • 0xF8: 범위를 벗어난 스택 변수입니다.

KASAN 버그 검사 이해: 예제

다음 매개 변수를 사용하여 드라이버가 실행 중일 때 KASAN이 버그 검사를 실행했다고 가정합니다.

  1. 매개 변수 1: 0xFFFFFFFFFFFFABCD
  2. 매개 변수 2: 0x0000000000000004
  3. 매개 변수 3: 0xFFFFFFFF12345678
  4. 매개 변수 4: 0x0000000000000184

매개 변수 1 은 드라이버가 주소 0xFFFFFFFFFFFFABCD 에 액세스하려고 시도했으며 이 액세스가 불법임을 알려줍니다. 매개 변수 2 는 4 바이트 액세스임을 알려줍니다. 매개 변수 3 은 드라이버가 잘못된 액세스를 수행한 명령 포인터의 주소를 제공합니다. 매개 변수 4 는 이것이 쓰기 액세스이며, 터치되는 메모리가 전역 변수의 올바른 redzone임을 알려줍니다.

즉, 드라이버가 전역 변수에 대한 쓰기 버퍼 오버플로를 수행하려고 했을 가능성이 큽니다. 이 정보를 사용하여 드라이버에서 이 버그를 해결하는 위치와 방법을 조사하고 확인합니다.

KASAN의 성능 영향

KASAN은 커널 메모리 사용량을 증가시키고 KASAN을 사용하도록 설정된 드라이버에서 약 2배의 속도 저하를 도입합니다.

드라이버 검증 도구와 비교

KASAN 및 드라이버 검증 도구는 완전히 별개의 기능이지만 상호 호환됩니다.

KASAN은 잘못된 메모리 액세스를 검색하는 데 중점을 두고 있으며, 보다 세분화된 접근 방식을 사용하고 더 많은 메모리 영역을 커버하기 때문에 해당 도메인의 드라이버 검증 도구보다 더 효율적입니다. 드라이버 검증 도구에는 KASAN이 감지하지 않는 다른 유형의 버그를 찾는 것을 목표로 하는 드라이버별 규칙이 있습니다. 자세한 내용은 Microsoft: Microsoft 플랫폼에서 커널 소독제 소개를 참조 하세요.

드라이버 검증 도구와 함께 KASAN을 사용하여 드라이버의 버그 감지를 최대화합니다.

리소스