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)
13314정성태4/9/20234013개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치
13313정성태4/9/20234036개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/20234095Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/20234554C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
13310정성태4/6/20234212C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library
13309정성태4/5/20234333.NET Framework: 2107. .NET 6+ FileStream의 구조 변화
13308정성태4/4/20234238스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법
13307정성태4/4/20233986.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법
13306정성태4/3/20233783Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법
13305정성태4/1/20234166Windows: 242. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (쉬운 버전)파일 다운로드1
13304정성태3/31/20234482VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법
13303정성태3/30/20233838Windows: 241. 환경 변수 %PATH%에 DLL을 찾는 규칙
13302정성태3/30/20234467Windows: 240. RDP 환경에서 바뀌는 %TEMP% 디렉터리 경로
13301정성태3/29/20234588Windows: 239. C/C++ - Windows 10 Version 1607부터 지원하는 /DEPENDENTLOADFLAG 옵션파일 다운로드1
13300정성태3/28/20234240Windows: 238. Win32 - Modal UI 창에 올바른 Owner(HWND)를 설정해야 하는 이유
13299정성태3/27/20233999Windows: 237. Win32 - 모든 메시지 루프를 탈출하는 WM_QUIT 메시지
13298정성태3/27/20233984Windows: 236. Win32 - MessageBeep 소리가 안 들린다면?
13297정성태3/26/20234650Windows: 235. Win32 - Code Modal과 UI Modal
13296정성태3/25/20233985Windows: 234. IsDialogMessage와 협업하는 WM_GETDLGCODE Win32 메시지 [1]파일 다운로드1
13295정성태3/24/20234241Windows: 233. Win32 - modeless 대화창을 modal처럼 동작하게 만드는 방법파일 다운로드1
13294정성태3/22/20234425.NET Framework: 2105. LargeAddressAware 옵션이 적용된 닷넷 32비트 프로세스의 가용 메모리 - 두 번째
13293정성태3/22/20234487오류 유형: 853. dumpbin - warning LNK4048: Invalid format file; ignored
13292정성태3/21/20234595Windows: 232. C/C++ - 일반 창에도 사용 가능한 IsDialogMessage파일 다운로드1
13291정성태3/20/20234970.NET Framework: 2104. C# Windows Forms - WndProc 재정의와 IMessageFilter 사용 시의 차이점
13290정성태3/19/20234455.NET Framework: 2103. C# - 윈도우에서 기본 제공하는 FindText 대화창 사용법파일 다운로드1
13289정성태3/18/20233671Windows: 231. Win32 - 대화창 템플릿의 2진 리소스를 읽어들여 자식 윈도우를 생성하는 방법파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  [13]  14  15  ...