Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 11개 있습니다.)

보호 모드와 필수 무결성 제어(신뢰도 등급)(MIC: Mandatory Integrity Control)


이번엔, 보호 모드에 대해서 설명을 해드리겠습니다.

"보호 모드(Protected Mode)"라... 많이 들어보셨죠? ^^ 그렇습니다. IE 7 비스타 버전을 실행시키면 보호 모드라는 것을 제공합니다. 어디, 진짜 있나 한번 확인해 볼까요? ^^

explain_protected_mode_1.png

IE 7에서는 위와 같이 "인터넷", "로컬 인트라넷", "제한된 사이트" 영역에 대해서 "보호 모드"를 기본적으로 설정해 놓고 있으며, 오직 "신뢰할 수 있는 사이트"에 대해서만 해제해 놓고 있습니다.

천천히 설명드리겠지만, "보호 모드"는 "UAC"와는 다른 의미를 가집니다. 보호 모드를 해제한다고 해서 UAC 확인창을 완전히 벗어날 수 있는 것은 아니라는 의미입니다. 따라서, "신뢰할 수 있는 사이트"를 제외한 모든 사이트들은 이 "보호 모드" 하에서 실행되어지며, "신뢰할 수 있는 사이트"에 속한 사이트를 방문해서 실행되는 모든 코드들은 여러분들이 일반적인 탐색기에서 응용 프로그램을 실행시키는 것과 동일한 UAC 제약 정도만을 받게 됩니다.

그런데, 이 동작이 어찌 보면 불편합니다. "보호 모드"에서 사이트 방문을 하다가, "신뢰할 수 있는 사이트"를 방문하게 되면 별도의 새로운 IE 인스턴스가 뜨고 그 안에서 사이트 방문이 이뤄집니다. 음... 이걸로 추측해 볼때 보호 모드라는 것은 "스레드 단위"의 보안이 아닌 "프로세스 단위"의 보안이라는 것을 알 수 있습니다.




개인적으로, 초기에 IE 7로 웹 사이트 방문을 하게 되면서 궁금했던 점이 있습니다. 바로 "보호 모드"와 UAC의 차이점이 뭐냐는 것입니다. 사실 신뢰할 수 있는 사이트를 방문할 때도 관리 권한에 위배되는 동작을 ActiveX가 하게 되면 UAC 확인창이 뜹니다. 즉, 굳이 "보호 모드"가 아니더라도 충분히 "안전한다고" 여길 수 있었기 때문에 왜 굳이 "보호 모드"라는 설정을 옵션으로 제공하는 것일까? 라는.

"도대체 보호 모드와 UAC의 차이가 뭐야?"

그것은 제가 아직 UAC만 알고 MIC(Mandatory Integrity Control: 필수 무결성 제어(신뢰도 등급)을 몰랐을 때의 의문이었습니다. 사실, UAC가 하도 소란스러워서 MIC는 상대적으로 부각되지 않았는데요. 이러한 보호 모드를 알기 위해서는 바로 이 MIC에 대한 이해가 선행되어져야 합니다.

MIC는 1970 년대에 컴퓨터 과학 분야에서 이미 나왔던 개념이라고 합니다. 하지만, 실제 운영체제에서 구현된 것은 비스타가 최초여서 마이크로소프트 측의 직원들의 글을 보면 이를 매우 자랑스럽게 생각한다는 문구를 종종 볼 수 있습니다. MIC에 대해서는, 원론적인 이야기 보다는 실제 비스타에 구현된 방식을 가지고 설명을 드리는 것이 편하겠지요! ^^

비스타는 사용자가 로그인할 때, 기존의 SID 말고도 MIC 구현을 위해 별도로 "integrity SID"를 사용자 액세스 토큰에 할당합니다. 액세스 토큰에 할당되었다는 것은 곧, 그와 관련된 커널 동기화 객체들을 포함한 윈도우즈의 모든 보안 자원(파일, 폴더, 파이프, 프로세스, 스레드... 등)들에 "integrity SID"가 할당될 수 있다는 것을 의미합니다. 이로 인해, ACL 개념이 다음과 같이 2개로 불어났습니다.

DACL (discretionary access control list)
SACL (system access control list)

기존의 접근 권한을 관리하던 DACL과 구분하기 위해, SACL이라는 용어를 사용하게 되었습니다. 게다가, SACL에 대한 보안 검사는 DACL보다 먼저 실시하도록 되어 있습니다.

이렇게 비스타에 구현된 MIC에 의해서 제공되는 Integrity 단계는 "low", "medium", "high", "system"이 있습니다. 보통의 일반 프로세스가 "medium" 단계인 반면, IE 7의 보호모드는 "low"로 설정되어 있습니다. 아하... 여기서, 의문의 해답이 나오게 되는군요. 그렇습니다. IE 7의 보호 모드는 일반 프로세스보다도 더 낮은 "low" 레벨의 권한으로 실행되게 됩니다. 그러니까 신뢰할 수 있는 사이트를 방문할 때는 "medium" 레벨, 그렇지 않은 사이트에 대해서는 "low" 레벨의 권한에서 실행되기 때문에, 일반적인 프로세스에 대한 UAC 확인창보다도 더 강화된 보안 제약을 받도록 설정이 됩니다. (사실, 엄밀히 UAC는 MIC 권한 레벨을 높이기 위한 "안전한 확인창"을 띄우는 기능일 뿐입니다.)

뭐, 대강 아래와 같이 정리할 수 있겠지요.

medium: 표준 사용자
high: 관리 권한을 획득한 사용자 (UAC 등에 의해서)
system: 시스템 서비스
low: IE 7 보호모드 등에서 사용.

그렇다고 해서, 모든 보안 자원에 integrity SID 값이 할당되어져 있는 것은 아닙니다. 비스타는 그런 경우 기본값으로 "medium" 권한을 적용한다고 되어 있습니다. 자, 이쯤 되면 ^^ 왠지 원하는 프로세스에 대해서 현재의 "integrity" 값을 알 수 있는 방법이 없을까 고민하게 됩니다. 이를 위해 최근에 업데이트 된 SysInternals의 "Process Explorer" 를 사용할 수 있습니다.

Process Explorer for Windows v10.21 By Mark Russinovich
; https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer

기존에 이미 다운로드 받은 경우일지라도, 수고스럽겠지만 다시 받아야 합니다. 버전 "10.2" 이상에서만 비스타의 "integrity" 레벨을 확인하실 수 있기 때문입니다. 다운로드 받았으면 이제 테스트를 해보셔야죠! 아래의 화면은 일반 웹 사이트를 방문했을 때 - 즉 보호 모드 하에서 실행되고 있는 IE 7의 "integrity" 레벨을 보여주고 있습니다.

explain_protected_mode_2.png

그리고, 아래의 그림은 "신뢰할 수 있는 사이트"를 방문한 이후, 즉 보호 모드가 아닌 IE 7의 "integrity" 레벨을 보여주고 있습니다.

explain_protected_mode_3.png

이 외에도, "integrity" 레벨이 medium이 아닌 프로세스들을 확인해 볼 수 있습니다. 예를 들어, "작업 관리자" 같은 경우에 처음에는 "medium" 권한으로 실행되지만, "Show processes from all users" 버튼을 눌러서 새롭게 "작업 관리자" 인스턴스가 실행된 이후에는 "high" 권한으로 설정되어 있습니다. 또한 일반 실행 파일을 오른쪽 버튼으로 누른 후 "Run as administrator"로 실행시키게 되면 역시 UAC 확인창이 뜬 후 "high"로 바뀌게 됩니다. NT 서비스들은 "system"으로 되어 있고.

마지막으로 다소 쓸데없는 이야기 하나 추가하자면.
integrity와 관련된 라벨 상수값이 있는데, 지난 TechED 때만 해도 low, medium, high, system 에 대해 각각 100/200/300/400이었다가, 지금은 hex 값으로 1000/2000/3000/4000으로 바뀌었다고 합니다. (아직 일부 문서에서는 예전 값으로 표기된 것이 남아 있기도 합니다.) 어쨌든, 그 말은 곧, integrity 판단을 위해 직접적인 라벨값을 비교해서는 안된다는 것입니다. (향후에도 값은 얼마든지 바뀔 수 있기 때문에.)




그렇다면, 도대체 어느 경우에 우리가 MIC를 고려해야 할 경우가 생길지 살펴보겠습니다.

이에 대한 예로 "인터넷 메일 클라이언트"를 들겠습니다.

기존에는 인터넷 메일에 첨부된 실행 파일을 "설령 그것이 실수일 지언정" 실행시키게 되면, 거의 99%는 악성 코드 실행으로 여러분의 PC가 안전하지 않은 상태로 되었다고 판단해야 했을 것입니다. 하지만, 이제는 그러한 메일에 속한 파일을 실수로 실행시킨다고 해도 MIC에 의해서 여러분들의 시스템을 안전하게 지켜낼 수 있게 되었습니다. 물론, 이를 위해서는 여러분들이 만들게 될 "인터넷 메일 클라이언트" 프로그램에서 MIC를 지원해야 합니다.

자, 그럼 어떻게 해야 할까요? 방법은 간단합니다. 해당 프로그램에서 "첨부 파일"을 로컬에 저장할 때 기본적으로 "low" integrity SID 값을 부여하는 것입니다. 그렇겠죠! "low" 권한의 실행 파일은 실행 시에 "low" 권한의 프로세스로 실행될 테고 이러한 프로세스는 직접적인 "medium", "high" 자원에 대해 쓰기/삭제 권한에서 거부되고 맙니다.

실제로, 이러한 시나리오가 IE 7에서도 그대로 적용됩니다. "신뢰할 수 있는 사이트"를 제외한 일반적인 인터넷 웹 사이트로부터 다운로드 받거나 실행되는 ActiveX 컨트롤들의 코드들은 이제 더 이상 "medium", "high" 권한의 자원들에 접근할 수가 없는, 최소 권한의 "low" 자원만을 이용하도록 강제화되었습니다. 어떠세요? 인터넷 생활이 이전보다는 더 안전하게 될 것 같지요? ^^




응용 사례까지 알아 보았지만, 우리는 이 쯤에서 만족할 수 없습니다. 그렇습니다. ^^ 실제 코드를 짚고 넘어가봐야 직성이 풀리기 때문입니다. 블랙박스로 여겨지던 IE 7의 "보호 모드" 프로세스를 우리가 직접 생성해 보는 것은 "즐거운 일"이 아닐 수 없습니다. ^^

제가 직접 모든 코드를 설명드리고 싶지만,,, 사실 전형적인 코드 복사에 불과하기 때문에 간단한 과정 설명으로 대신하고 소스 코드는 URL을 알려드리겠습니다.

여러분들이 보호 모드 프로세스를 띄우기 위한 정형화된 구현 단계는 다음과 같습니다.

1. 현재 "medium" 레벨이라면?
  1.1. 현재 프로세스의 토큰을 구함 (OpenProcessToken)
  1.2. 프로세스 토큰을 복제 (DuplicateTokenEx)
  1.3. 프로세스 토큰에 "low integrity"로 설정 (SetTokenInformation)
  1.4. 자기 자신의 프로세스를 새로운 토큰으로 다시 실행 (CreateProcessAsUser)

물론, 시작을 위한 프로세스를 만들어 두고 그것을 통해서 다른 이름의 새로운 프로세스를 만들어도 무방합니다. 단지 위의 "1.4" 단계는 "IE 7"이나 "작업관리자"처럼 동작하는 방식의 이해를 돕기 위해 설명드린 것 뿐입니다.

그리고, 위의 각 단계별 구체적인 소스 코드는 다음의 사이트에 자세히 실려져 있기 때문에 생략합니다.


- "Low" 권한으로 프로세스를 실행하는 함수
- 파일명을 입력받아서 "low" 권한으로 설정해 주는 함수
- 현재 프로세스의 "Integrity" 권한을 확인하는 함수

Understanding and Working in Protected Mode Internet Explorer
; http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ProtectedMode.asp
; https://kb.digital-detective.net/display/BF/Understanding+and+Working+in+Protected+Mode+Internet+Explorer




이것으로 모든 설명은 끝났습니다. 마지막으로 하나 더 말씀드리면... 물론 여기 있는 지식들이 전부 제 머리에서 "스스로" 나온 거라고 생각하실 분들은 없을 거라 봅니다. 저 역시 다음의 참고 자료에서 지식을 얻었으며, 실제로 위에 설명된 것들은 아래의 기사에 대한 축약본 정도로 봐주시면 될 것 같습니다.

Creating a Process in Protected Mode on Windows Vista 
; http://blogs.msdn.com/cjacks/archive/2007/01/08/creating-a-process-in-protected-mode-on-windows-vista.aspx
; https://techcommunity.microsoft.com/t5/windows-blog-archive/creating-a-process-in-protected-mode-on-windows-vista/ba-p/228466

Mandatory integrity control in Windows Vista 
; http://www.rojo.com/story/BF1iAW0xrWzTeP0p

아무튼... 알면 알수록... 비스타는 참 멋진 운영체제라는 생각이 듭니다. ^^



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 1/9/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2007-09-20 02시41분
[Chan] 구글을 떠 돌다가 왔습니다. ^_^ 정말로 쉽게 잘 설명해 주셨네요 ^_^ 감사 합니다. ^_^
[guest]
2007-09-20 03시04분
^^ 도움을 받으셨다니, 저도 흐뭇합니다.
kevin25
2007-11-07 11시14분
[라잇] 감사합니다. 많은 도움 되었습니다. ㅡㅡ;
 요구사항으로 신뢰사이트 등록을 위해 엑티브엑스를 만들었는데...
 보호모드 설정 되어 있으면 엑티브 엑스가 설치가 안되더군요.

 보호모드에도 설치되려면 신뢰사이트 등록 되어야 한다니.... 닭이 먼저인지 알이 먼저인지 원....
 보안과 편의성은 언제나 충돌이군요..쩝
[guest]

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13607정성태4/25/2024185닷넷: 2248.C# - 인터페이스 타입의 다중 포인터를 인자로 갖는 C/C++ 함수 연동
13606정성태4/24/2024201닷넷: 2247. C# - tensorflow 연동 (MNIST 예제)파일 다운로드1
13605정성태4/23/2024374닷넷: 2246. C# - Python.NET을 이용한 파이썬 소스코드 연동파일 다운로드1
13604정성태4/22/2024408오류 유형: 901. Visual Studio - Unable to set the next statement. Set next statement cannot be used in '[Exception]' call stack frames.
13603정성태4/21/2024704닷넷: 2245. C# - IronPython을 이용한 파이썬 소스코드 연동파일 다운로드1
13602정성태4/20/2024801닷넷: 2244. C# - PCM 오디오 데이터를 연속(Streaming) 재생 (Windows Multimedia)파일 다운로드1
13601정성태4/19/2024850닷넷: 2243. C# - PCM 사운드 재생(NAudio)파일 다운로드1
13600정성태4/18/2024879닷넷: 2242. C# - 관리 스레드와 비관리 스레드
13599정성태4/17/2024869닷넷: 2241. C# - WAV 파일의 PCM 사운드 재생(Windows Multimedia)파일 다운로드1
13598정성태4/16/2024892닷넷: 2240. C# - WAV 파일 포맷 + LIST 헤더파일 다운로드2
13597정성태4/15/2024880닷넷: 2239. C# - WAV 파일의 PCM 데이터 생성 및 출력파일 다운로드1
13596정성태4/14/20241068닷넷: 2238. C# - WAV 기본 파일 포맷파일 다운로드1
13595정성태4/13/20241052닷넷: 2237. C# - Audio 장치 열기 (Windows Multimedia, NAudio)파일 다운로드1
13594정성태4/12/20241069닷넷: 2236. C# - Audio 장치 열람 (Windows Multimedia, NAudio)파일 다운로드1
13593정성태4/8/20241084닷넷: 2235. MSBuild - AccelerateBuildsInVisualStudio 옵션
13592정성태4/2/20241219C/C++: 165. CLion으로 만든 Rust Win32 DLL을 C#과 연동
13591정성태4/2/20241199닷넷: 2234. C# - WPF 응용 프로그램에 Blazor App 통합파일 다운로드1
13590정성태3/31/20241079Linux: 70. Python - uwsgi 응용 프로그램이 k8s 환경에서 OOM 발생하는 문제
13589정성태3/29/20241154닷넷: 2233. C# - 프로세스 CPU 사용량을 나타내는 성능 카운터와 Win32 API파일 다운로드1
13588정성태3/28/20241268닷넷: 2232. C# - Unity + 닷넷 App(WinForms/WPF) 간의 Named Pipe 통신 [2]파일 다운로드1
13587정성태3/27/20241170오류 유형: 900. Windows Update 오류 - 8024402C, 80070643
13586정성태3/27/20241336Windows: 263. Windows - 복구 파티션(Recovery Partition) 용량을 늘리는 방법
13585정성태3/26/20241131Windows: 262. PerformanceCounter의 InstanceName에 pid를 추가한 "Process V2"
13584정성태3/26/20241249개발 환경 구성: 708. Unity3D - C# Windows Forms / WPF Application에 통합하는 방법파일 다운로드1
13583정성태3/25/20241471Windows: 261. CPU Utilization이 100% 넘는 경우를 성능 카운터로 확인하는 방법
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...