KERNEL_SECURITY_CHECK_FAILURE 버그 검사의 값은 0x00000139입니다. 이 버그 검사는 커널이 중요한 데이터 구조의 손상을 감지했음을 나타냅니다.
버그 검사 0x139 KERNEL_SECURITY_CHECK_FAILURE 매개 변수
매개 변수 | 설명 |
---|---|
1 | 손상의 유형입니다. 자세한 내용은 다음 표를 참조하세요. |
2 | 버그 검사를 일으킨 예외에 대한 트랩 프레임의 주소 |
3 | 버그 검사를 일으킨 예외에 대한 예외 레코드의 주소 |
4 | 예약됨 |
다음 표에서는 매개 변수 1에 사용할 수 있는 값에 대해 설명합니다.
매개 변수 1 | 설명 |
---|---|
0 | 스택 기반 버퍼가 오버런되었습니다(레거시 /GS 위반). |
1 | VTGuard 계측 코드가 잘못된 가상 함수 테이블을 사용하려는 시도를 감지했습니다. 일반적으로 C++ 개체가 손상된 다음 손상된 개체의 this 포인터를 사용하여 가상 메서드 호출을 시도했습니다. |
2 | 스택 쿠키 계측 코드가 스택 기반 버퍼 오버런(/GS 위반)을 감지했습니다. |
3 | LIST_ENTRY가 손상되었습니다(예: 이중 제거). 자세한 내용은 다음 원인 섹션을 참조하세요. |
4 | 예약됨 |
5 | 잘못된 매개 변수가 잘못된 매개 변수를 치명적으로 간주하는 함수에 전달되었습니다. |
6 | 스택 쿠키 보안 쿠키가 로더에 의해 제대로 초기화되지 않았습니다. 이 문제는 Windows 8 실행되도록 드라이버를 빌드하고 이전 버전의 Windows 드라이버 이미지를 로드하려고 시도하여 발생할 수 있습니다. 이 문제를 방지하려면 이전 버전의 Windows에서 실행할 드라이버를 빌드해야 합니다. |
7 | 치명적인 프로그램 종료가 요청되었습니다. |
8 (여덟) | 컴파일러에 의해 삽입된 배열 경계 검사가 잘못된 배열 인덱싱 작업을 감지했습니다. |
9 | RtlQueryRegistryValues에 대한 호출이 RTL_QUERY_REGISTRY_TYPECHECK 없이 RTL_QUERY_REGISTRY_DIRECT 지정했으며 대상 값이 신뢰할 수 있는 시스템 하이브에 있지 않았습니다. |
10 | 간접 통화 가드 검사에서 잘못된 제어 전송을 감지했습니다. |
11 | 쓰기 가드 검사에서 잘못된 메모리 쓰기가 감지되었습니다. |
12 | 잘못된 파이버 컨텍스트로 전환하려고 했습니다. |
13 | 유효하지 않은 레지스터 컨텍스트를 할당하려고 했습니다. |
14 | 개체에 대한 참조 횟수가 잘못되었습니다. |
18 | 잘못된 jmp_buf 컨텍스트로 전환하려고 했습니다. |
19 | 읽기 전용 데이터를 안전하지 않게 수정했습니다. |
20 | 암호화 자체 테스트에 실패했습니다. |
21 | 잘못된 예외 체인이 검색되었습니다. |
22 (이십이) | 암호화 라이브러리 오류가 발생했습니다. |
23 | DllMain 내에서 잘못된 호출이 이루어졌습니다. |
24 | 잘못된 이미지 기본 주소가 감지되었습니다. |
이십오 (25) | 지연 로드 가져오기를 보호하는 동안 복구할 수 없는 오류가 발생했습니다. |
26 | 안전하지 않은 내선 번호로 전화를 걸었습니다. |
27 | 더 이상 사용되지 않는 서비스가 호출되었습니다. |
28 | 범위를 벗어난 버퍼 액세스가 감지되었습니다. |
이십구 | 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 를 사용하여 타이머 테이블을 검사하거나 타이머 목록 링크를 수동으로 탐색하여 손상된 타이머를 식별해야 할 수 있습니다. 경우에 따라 특수 풀이 있는 Driver Verifier는 범인을 추적하는 데 도움이 될 수 있습니다(손상된 KTIMER가 이미 해제된 풀 블록에 있는 경우).
- 드라이버가 내부 LIST_ENTRY 스타일 연결 목록을 잘못 관리했습니다. 일반적인 예는 두 RemoveEntryList 호출 사이에 목록 항목을 다시 삽입하지 않고 동일한 목록 항목에서 RemoveEntryList를 두 번 호출하는 것입니다. 동일한 목록에 항목을 두 번 삽입하는 것과 같은 다른 변형이 가능합니다.
- 드라이버가 해당 목록에서 데이터 구조를 제거하지 않고 LIST_ENTRY 포함된 데이터 구조를 해제하여 나중에 이전 풀 블록을 다시 사용한 후 목록을 검사할 때 손상이 감지됩니다.
- 드라이버가 적절한 동기화 없이 동시 방식으로 LIST_ENTRY 스타일 목록을 사용하여 목록이 찢어졌습니다.
대부분의 경우 연결된 목록을 앞뒤로 이동하고( dl 및 dlb 명령이 이 용도로 유용함) 결과를 비교하여 손상된 데이터 구조를 식별할 수 있습니다. 앞으로 걷기와 뒤로 걷기 사이에 목록이 일치하지 않는 곳은 일반적으로 손상의 위치입니다. 연결된 목록 업데이트 작업은 인접 요소의 목록 링크를 수정할 수 있으므로 손상된 목록 항목의 인접 항목이 근본 원인일 수 있으므로 인접 항목을 자세히 살펴봐야 합니다.
많은 시스템 구성 요소가 내부적으로 LIST_ENTRY 목록을 활용하기 때문에 시스템 API를 사용하는 드라이버의 다양한 유형의 리소스 관리 오류로 인해 시스템 관리 연결 목록에서 연결 목록이 손상될 수 있습니다.
해결 방법
이 문제의 원인을 확인하려면 일반적으로 디버거를 사용하여 추가 정보를 수집해야 합니다. 여러 덤프 파일을 검사하여 이 중지 코드가 나타날 때 실행되는 코드와 같은 유사한 특성이 있는지 확인해야 합니다.
자세한 내용은 Windows 디버거(WinDbg)를 사용한 크래시 덤프 분석, !analyze 확장 및!analyze를 참조하세요.
이벤트 로그를 사용하여 이 중지 코드까지 발생하는 더 높은 수준의 이벤트가 있는지 확인합니다.
이러한 일반적인 문제 해결 팁이 도움이 될 수 있습니다.
최근에 시스템에 하드웨어를 추가했다면 제거하거나 교체해 보세요. 또는 사용 가능한 패치가 있는지 제조업체에 문의합니다.
최근에 새 디바이스 드라이버 또는 시스템 서비스가 추가된 경우 제거하거나 업데이트해 보세요. 시스템에서 새 버그 확인 코드가 표시되도록 변경된 내용을 확인합니다.
시스템 로그인 이벤트 뷰어에서 오류를 일으키는 장치 또는 드라이버를 정확히 찾아내는 데 도움이 될 수 있는 추가 오류 메시지가 있는지 확인합니다. 블루 스크린과 같은 시간 범위에서 발생한 시스템 로그에서 치명적인 오류를 찾습니다.
장치 관리자에서 느낌표(!)가 표시된 장치가 있는지 확인합니다. 드라이버 속성에 표시된 이벤트 로그에서 오류가 있는 드라이버를 검토합니다. 관련 드라이버를 업데이트해 보세요.
바이러스 탐지 프로그램을 실행합니다. 바이러스는 Windows용으로 포맷된 모든 유형의 하드 디스크를 감염할 수 있으며 이로 인해 디스크 손상으로 인해 시스템 버그 검사 코드가 생성될 수 있습니다. 바이러스 감지 프로그램이 마스터 부트 레코드에 감염 여부를 확인하는지 확인합니다.
일반적인 추가 문제 해결 정보는 버그 검사 블루 스크린 데이터 분석을 참조하세요.