성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>windbg/sos - Error code - 0x000021BE</h1> <p> windbg에서 sos 로딩을 위한 cordll 명령어 실행 시 다음과 같은 오류가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>.cordll -lp C:\temp</span> Failed to verify signature of file: C:\temp\mscordacwks.dll Error code - 0x000021BE Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions is enabled, set to false to disable. dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions = false CLRDLL: Consider using ".cordll -lp <path>" command to specify .NET runtime directory. CLR DLL status: ERROR: Unable to load DLL C:\temp\mscordacwks_AMD64_AMD64_4.0.30319.18449.dll, Win32 error 0n87 </pre> <br /> 사실 오류 메시지에 답이 있으므로 잘 보셨다면 금방 해결할 수 있었을 텐데요, ^^ 단순히 다음과 같은 명령어를 windbg 명령어 입력 화면에서 수행하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions = false</span> @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions = false : false </pre> <br /> 혹은 출력 화면 자체에 <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/customizing-debugger-output-using-dml'>DML</a> 처리가 되어 있어 그냥 해당 링크를 눌러도 됩니다. 그런 다음, 다시 시도하면 로딩이 잘 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0:000> <span style='color: blue; font-weight: bold'>.cordll -lp C:\temp</span> CLR DLL status: Loaded DLL C:\temp\mscordacwks.dll </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, <a target='tab' href='https://www.sysnet.pe.kr/2/0/994'>메모리 덤프를 떴던 서버로부터 복사해 온 mscordacwks.dll</a>을 왜 서명 확인을 못하는 것일까요? 재미있는 건, 탐색기의 파일 속성 창으로는 정상적인 인증서로 서명된 것을 볼 수 있습니다.<br /> <br /> <img alt='windbg_cordll_error_1.png' src='/SysWebRes/bbs/windbg_cordll_error_1.png' /><br /> <br /> windbg에서 발생한 0x000021BE 오류 코드는 "The specified <a target='tab' href='https://www.encryptionconsulting.com/education-center/what-is-an-oid/'>OID</a> cannot be found."인데요, 구체적으로 어떤 OID 값인지 출력하지 않고 있으므로 딱히 더 추적해 볼 것이 없습니다.<br /> <br /> 혹시 <a target='tab' href='https://learn.microsoft.com/en-us/windows/win32/seccrypto/signtool'>signtool</a>로 결과를 좀 더 확인해 볼 수 있을까요?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>signtool verify c:\windows\system32\kernel32.dll</span> File: c:\windows\system32\kernel32.dll Index Algorithm Timestamp ======================================== 0 sha256 RFC3161 Successfully verified: c:\windows\system32\kernel32.dll C:\temp> <span style='color: blue; font-weight: bold'>signtool verify mscordacwks.dll</span> File: mscordacwks.dll Index Algorithm Timestamp ======================================== SignTool Error: The signing certificate is not valid for the requested usage. This error sometimes means that you are using the wrong verification policy. Consider using the /pa option. Number of errors: 1 </pre> <br /> kernel32.dll을 정상적으로 검증한 반면 mscordacwks.dll은 오류 항목이 하나 나옵니다. 보면, /pa 옵션을 넣어보라고 하는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>signtool verify /pa mscordacwks.dll</span> File: mscordacwks.dll Index Algorithm Timestamp ======================================== 0 sha1 Authenticode Successfully verified: mscordacwks.dll </pre> <br /> 아하... 문제가 밝혀졌군요. ^^ 다음의 문서를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Using SignTool to Verify a File Signature ; <a target='tab' href='https://learn.microsoft.com/en-us/windows/win32/seccrypto/using-signtool-to-verify-a-file-signature'>https://learn.microsoft.com/en-us/windows/win32/seccrypto/using-signtool-to-verify-a-file-signature</a> </pre> <br /> signtool은 기본적으로 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12214'>"Windows driver"에 해당</a>하는 검증 정책을 적용한다고 합니다. 그래서 단순히 S/W code 서명 인증서에 대해서는 저렇게 검증이 실패하는 것입니다. 그러니까, mscordacwks.dll은 정상적으로 코드 서명용 인증서로 서명이 되었지만, windbg는 커널을 다루는 응용 프로그램이기 때문에 안전을 위해 device driver에나 요구되는 인증서를 요구했던 차이가 있는 것입니다.<br /> <br /> 마이크로소프트는 커널이 아닌 사용자 모드의 응용 프로그램 디버깅을 위한 대안으로 특별히 ".NET"을 위해 "SecureLoadDotNetExtensions" 옵션을 둔 것 같고, 이 값을 false로 설정하면 그 보안 수준을 낮춰 적용할 수 있게 만든 듯합니다.<br /> <br /> 참고로, SecureLoadDotNetExtensions 옵션 설정은 windbg를 재시작해도 유지되므로 필요가 없어졌다면 보안을 위해 다시 켜는 것도 좋겠습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1876
(왼쪽의 숫자를 입력해야 합니다.)