본문 바로가기
정상을향해/OS·Kernel Driver·Rootkit

3장. 하드웨어 레벨의 지식 - 링 제로 (Ring Zero)

by 사이테일 2014. 1. 17.

인텔 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에서 동작하는 것은 은닉 기능을 수행하기 위한 핵심이다.