다음을 통해 공유


버그 검사 0x139: KERNEL_SECURITY_CHECK_FAILURE

KERNEL_SECURITY_CHECK_FAILURE 버그 검사의 값은 0x00000139. 이 버그 검사는 커널이 중요한 데이터 구조의 손상을 감지했음을 나타냅니다.

Important

이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 파란색 화면 오류 코드를 받은 고객인 경우 파란색 화면 오류 문제 해결을 참조하세요.

버그 검사 0x139 KERNEL_SECURITY_CHECK_FAILURE 매개 변수

매개 변수 설명
1 손상 유형입니다. 자세한 내용은 다음 표를 참조합니다.
2 버그 검사를 발생시킨 예외에 대한 트랩 프레임의 주소
3 버그 검사를 발생시킨 예외에 대한 예외 레코드의 주소
4 예약됨

다음 표에서는 매개 변수 1에 사용할 수 있는 값을 설명합니다.

매개 변수 1 설명
0 스택 기반 버퍼가 오버런되었습니다(레거시 /GS 위반).
1 VTGuard 계측 코드에서 잘못된 가상 함수 테이블을 사용하려는 시도를 감지했습니다. 일반적으로 C++ 개체가 손상된 다음 손상된 개체의 포인터를 사용하여 가상 메서드 호출을 시도했습니다.
2 스택 쿠키 계측 코드에서 스택 기반 버퍼 오버런(/GS 위반)을 검색했습니다.
3 LIST_ENTRY 손상되었습니다(예: 이중 제거). 자세한 내용은 다음 원인 섹션을 참조하세요.
4 예약됨
5 잘못된 매개 변수가 잘못된 매개 변수를 치명적이라고 간주하는 함수에 전달되었습니다.
6 스택 쿠키 보안 쿠키가 로더에 의해 제대로 초기화되지 않았습니다. 이는 Windows 8에서만 실행할 드라이버를 빌드하고 이전 버전의 Windows에서 드라이버 이미지를 로드하려고 하여 발생할 수 있습니다. 이 문제를 방지하려면 이전 버전의 Windows에서 실행할 드라이버를 빌드해야 합니다.
7 치명적인 프로그램 종료가 요청되었습니다.
8 컴파일러에서 삽입한 배열 경계 검사에서 잘못된 배열 인덱싱 작업을 감지했습니다.
9 RTL_QUERY_REGISTRY_TYPECHECK 없이 RTL_QUERY_REGISTRY_DIRECT 지정하여 RtlQueryRegistryValues를 호출했으며 대상 값이 신뢰할 수 있는 시스템 하이브에 있지 않았습니다.
10 간접 호출 가드 검사에서 잘못된 제어 전송이 감지되었습니다.
11 쓰기 보호 검사에서 잘못된 메모리 쓰기가 감지되었습니다.
12 잘못된 파이버 컨텍스트로 전환하려고 했습니다.
13 잘못된 레지스터 컨텍스트를 할당하려고 했습니다.
14 개체에 대한 참조 수가 잘못되었습니다.
18 잘못된 jmp_buf 컨텍스트로 전환하려고 했습니다.
19 읽기 전용 데이터를 안전하지 않은 수정했습니다.
20 암호화 자체 테스트가 실패했습니다.
21 잘못된 예외 체인이 검색되었습니다.
22 암호화 라이브러리 오류가 발생했습니다.
23 DllMain 내에서 잘못된 호출이 발생했습니다.
24 잘못된 이미지 기본 주소가 검색되었습니다.
25 지연 부하 가져오기를 보호하는 동안 복구할 수 없는 오류가 발생했습니다.
26 안전하지 않은 확장에 대한 호출이 수행되었습니다.
27 사용되지 않는 서비스가 호출되었습니다.
28 범위를 벗어난 버퍼 액세스가 검색되었습니다.
29 RTL_BALANCED_NODE RBTree 항목이 손상되었습니다.
37 범위를 벗어난 스위치 점프 가능 항목이 호출되었습니다.
38 longjmp가 잘못된 대상에 대해 시도되었습니다.
39 내보내기 억제된 호출 대상을 유효한 호출 대상으로 만들 수 없습니다.

원인

매개 변수 1 테이블 및 덤프 파일을 사용하여 이 형식의 많은 버그 검사에 대한 원인을 좁힐 수 있습니다.

LIST_ENTRY 손상은 추적하기 어려울 수 있으며 이 버그 검사는 이중 연결 목록에 불일치가 도입되었음을 나타냅니다(개별 목록 항목 요소가 목록에 추가되거나 목록에서 제거될 때 감지됨). 아쉽게도 손상이 발생했을 때 불일치가 반드시 감지되지는 않으므로 근본 원인을 파악하기 위해 일부 형사 작업이 필요할 수 있습니다.

목록 항목 손상의 일반적인 원인은 다음과 같습니다.

  • 드라이버가 KEVENT와 같은 커널 동기화 개체를 손상했습니다(예: 스레드가 동일한 KEVENT에서 대기하는 동안 KEVENT를 두 번 초기화하거나 다른 스레드가 해당 KEVENT를 사용하는 동안 스택 기반 KEVENT가 범위를 벗어나도록 허용). 이러한 유형의 버그 검사는 일반적으로 nt! Ke* 또는 nt! Ki* 코드. 스레드가 동기화 개체에서 대기를 완료하거나 코드에서 동기화 개체를 신호 상태로 전환하려고 할 때 발생할 수 있습니다. 일반적으로 신호를 받는 동기화 개체는 손상된 개체입니다. 경우에 따라 특수 풀이 있는 드라이버 검증 도구가 원인(손상된 동기화 개체가 이미 해제된 풀 블록에 있는 경우)을 추적하는 데 도움이 될 수 있습니다.
  • 드라이버가 주기적인 KTIMER을 손상시켰습니다. 이러한 유형의 버그 검사는 일반적으로 nt! Ke* 또는 nt! Ki* 코드는 타이머에 신호를 주거나 타이머 테이블에서 타이머를 삽입하거나 제거하는 작업을 포함합니다. 조작되는 타이머는 손상된 타이머일 수 있지만 !timer(또는 타이머 목록 링크를 수동으로 탐색)를 사용하여 타이머 테이블을 검사하여 손상된 타이머를 식별해야 할 수 있습니다. 경우에 따라 특수 풀이 있는 드라이버 검증 도구는 손상된 KTIMER이 이미 해제된 풀 블록에 있는 경우 범인을 추적하는 데 도움이 될 수 있습니다.
  • 드라이버가 내부 LIST_ENTRY 스타일 연결된 목록을 잘못 관리했습니다. 일반적인 예는 두 RemoveEntryList 호출 사이에 목록 항목을 다시 삽입하지 않고 동일한 목록 항목에서 RemoveEntryList를 두 번 호출하는 것입니다. 동일한 목록에 항목을 이중 삽입하는 것과 같은 다른 변형이 가능합니다.
  • 드라이버는 해당 목록에서 데이터 구조를 제거하지 않고 LIST_ENTRY 포함하는 데이터 구조를 해제했으므로 이전 풀 블록을 다시 사용한 후 목록을 검사할 때 나중에 손상이 감지됩니다.
  • 드라이버가 적절한 동기화 없이 동시에 LIST_ENTRY 스타일 목록을 사용하므로 목록이 업데이트되었습니다.

대부분의 경우 연결된 목록을 앞뒤로 이동하고( dldlb 명령은 이 용도에 유용함) 결과를 비교하여 손상된 데이터 구조를 식별할 수 있습니다. 목록이 정방향 및 뒤로 이동 간에 일치하지 않는 위치는 일반적으로 손상의 위치입니다. 연결된 목록 업데이트 작업은 인접 요소의 목록 링크를 수정할 수 있으므로 손상된 목록 항목의 인접 항목이 기본 원인일 수 있으므로 자세히 확인해야 합니다.

많은 시스템 구성 요소가 내부적으로 LIST_ENTRY 목록을 활용하기 때문에 시스템 API를 사용하는 드라이버의 다양한 유형의 리소스 잘못된 관리로 인해 시스템 관리형 연결된 목록에서 연결된 목록이 손상될 수 있습니다.

해결

이 문제의 원인을 확인하려면 일반적으로 디버거를 사용하여 추가 정보를 수집해야 합니다. 중지 코드가 나타날 때 실행되는 코드와 같이 이 중지 코드에 유사한 특성이 있는지 확인하기 위해 여러 덤프 파일을 검사해야 합니다.

자세한 내용은 Windows 디버거(WinDbg)를 사용하여 !analyze 확장 및 !analyze를 사용하여 크래시 덤프 분석을 참조하세요.

이벤트 로그를 사용하여 이 중지 코드로 이어지는 더 높은 수준의 이벤트가 있는지 확인합니다.

이러한 일반적인 문제 해결 팁이 유용할 수 있습니다.

  • 최근에 시스템에 하드웨어를 추가했다면 제거하거나 교체해 보세요. 또는 사용 가능한 패치가 있는지 제조업체에 문의합니다.

  • 최근에 새 디바이스 드라이버 또는 시스템 서비스가 추가된 경우 제거하거나 업데이트해 보세요. 시스템에서 새 버그 확인 코드가 표시되도록 변경된 내용을 확인합니다.

  • 시스템 로그인 이벤트 뷰어 오류를 유발하는 디바이스 또는 드라이버를 정확히 파악하는 데 도움이 될 수 있는 추가 오류 메시지를 확인합니다. 자세한 내용은 이벤트 뷰어 열기를 참조하세요. 블루 스크린과 같은 시간 범위에서 발생한 시스템 로그에서 치명적인 오류를 찾습니다.

  • 장치 관리자 확인하여 느낌표(!)로 표시된 디바이스가 있는지 확인합니다. 드라이버 속성에 표시된 이벤트 로그에서 오류가 발생한 드라이버에 대해 검토합니다. 관련 드라이버를 업데이트해 보세요.

  • 바이러스 탐지 프로그램을 실행합니다. 바이러스는 Windows용으로 포맷된 모든 유형의 하드 디스크를 감염할 수 있으며 이로 인해 디스크 손상으로 인해 시스템 버그 검사 코드가 생성될 수 있습니다. 바이러스 탐지 프로그램이 마스터 부팅 레코드에서 감염을 검사하는지 확인합니다.

  • 일반적인 추가 문제 해결 정보는 버그 검사 블루 스크린 데이터 분석을 참조 하세요.

참고 항목

Windows 디버거를 사용한 크래시 덤프 분석(WinDbg)

WinDbg를 사용하여 커널 모드 덤프 파일 분석