인텔 x86 계열의 마이크로 프로세서는 접근 제얼르 위해서 링(Ring)이라는 개념을 사용한다.
링은 링 0(Ring Zero)부터 링 3까지 총 네 가지 레벨이 있으며, 링 0가 가장 권한이 높고 링 3가 가장 권한이 낮은 것을 의미한다.
내부적으로 각각의 링은 숫자로 저장된다.
실제로 마이크로 칩에 물리적인 링이 존재하는 것은 아니다.
윈도우 운영체제의 모든 커널 코드는 링 0로 동작한다.
따라서 커널 안에서 동작하는 루트킷 또한 링 0로 동작하는 것이다.
커널 안에서 동작하지 않는 유저 모드 프로그램들은 링 3 프로그램이라고 부른다.
윈도우와 리눅스를 포함해서 많은 운영체제들이 링 1, 2는 이용하지 않고 링 0과 링 3만을 이용한다.
(윈도우 아키텍처에서는 링 1, 2를 사용하지 않는다.)
링 0는 가장 권한이 높은 레벨이기 때문에 루트킷 개발자들은 그들의 코드가 링 0로 동작하게 하기 위해 노력한다.
소프트웨어 코드와 메모리 각각에 어떤 링이 할당되는지 끊임없이 관리하는 것은 CPU가 담당해야 하는 역할이다.
링간의 접근 제한을 수행하는 것 또한 CPU의 역할이다.
일반적으로 모든 소프트웨어 프로그램은 링 번호를 할당 받는다.
그리고 자신이 할당 받은 링 번호보다 낮은 번호의 링 영역에는 접근할 수 없다.
예를 들면, 링 3 프로그램은 링 0 프로그램에 접근할 수 없는 것이다.
만약 링 3 프로그램이 링 0 영역의 메모리에 접근하려하면 CPU는 인터럽트를 발생시킨다.
대부분의 경우에는 운영체제에 의해서 접근이 차단된다.
그런 접근 시도는 경우에 따라서 프로그램 자체가 중지되는 결과를 낳을 수도 있다.
내부적으로 꽤 많은 코드에 의해서 접근 제어가 이뤄진다.
특별한 조건하에서 프로그램이 높은 권한의 링에 접근할 수 있도록 허용해 주는 코드도 있다.
예를 들면, 프린터 드라이버를 커널 레벨로 로딩하려면, 로딩된 디바이스 드라이버(링 0 커널 모듈)에 접근할 수 있는 관리자 프로그램(링 3 프로그램)이 필요하다.
일단 커널 모드 루트킷이 로드되기만 하면 그것의 코드는 링 0 권한으로 실행되기 때문에 접근제어에 의한 통제를 받지 않는다.
루트킷을 탐지하는 툴은 주로 링 3에서 관리자 프로그램으로서 동작한다.
루트킷 개발자는 그런 관리자 툴보다 높은 권한을 획득하는 방법을 알아야 한다.
루트킷이 관리자 툴보다 권한이 높으면 관리자 툴로부터 루트킷을 숨길 수 있거나 관리자 툴을 무력화시킬 수 있다.
루트킷은 로더(loader) 프로그램을 이용해서 설치된다.
로더 프로그램은 링 3 애플리케이션이기 때문에 루트킷을 커널 레벨로 로드하기 위해서는 링 0에 접근하기 위한 특별한 함수를 이용해야 한다.
권한에 따라 메모리에 접근할 수 있는 권한이 구별되듯이 실행되는 명령 또한 구별될 수 있다.
즉 명령 중에는 링 0에서만 사용할 수 있는 명령이 있다.
그런 명령들을 이용하면 CPU의 동작을 변경시키거나 하드웨어에 직접적으로 접근할 수 있다.
다음은 x86 시스템의 링 0에서만 사용할 수 있는 명령들이다.
- cli : 인터럽트 처리 disable (현재 CPU에서)
- sti : 인터럽트 처리 enable (현재 CPU에서)
- in : 하드웨어 포트에서 데이터를 읽는다.
- out : 하드웨어 포트로 데이터를 쓴다.
루트킷이 링 0에서 동작하면 얻게 되는 장점이 많다.
즉, 하드웨어나 다른 소프트웨어가 실행되고 있는 환경을 조작할 수 있다.
또한 루트킷이 링 0에서 동작하는 것은 은닉 기능을 수행하기 위한 핵심이다.
'정상을향해 > OS·Kernel Driver·Rootkit' 카테고리의 다른 글
3. 응용프로그램과의 통신 (0) | 2015.03.09 |
---|---|
2. 드라이버 개발 환경 구축 (0) | 2015.03.09 |
1. 윈도우 디바이스 드라이버(Windows Device Driver) (0) | 2014.12.16 |
2장. 커널 조작 - 재부팅시 자동 시작 (0) | 2014.01.15 |
2장. 커널 조작 - 파일 핸들 생성 및 심볼릭 링크 추가 (1) | 2014.01.10 |
2장. 커널 조작 - 디바이스 드라이버 기본 개념 (0) | 2014.01.10 |