저자: Oktay Altunergil, 역 한빛리포터 2기 서성용
루트킷은 희생양이 되는 컴퓨터에 초기 접근을 수행한 후 침입자와 함께 따라오는 일련의 도구 모음으로 시스템 칩임 사실을 감추기 위한 도구를 말한다. 루트킷은 일반적으로 네트워크 스니퍼, 로그 수정 스크립트 그리고
ps,
netstat,
ifconfig,
killall 등과 같은 핵심 시스템 유틸리티들의 트로이의 목마와 같은 대체물인 척하는 것들을 포함한다. 루트킷을 설치하기 전에 침입자들은 여전히 희생양이 되는 시스템에 침입해야 하지만 사용의 용이성과 엄청난 일으키는 파괴량으로 인해 침입자들은 루트킷 애용하며 이는 시스템 관리자에게 큰 위협이 아닐 수 없다.
루트킷의 주목적은 나중에 침입자들이 손상된 시스템에 돌아왔을 때 탐지되지 않고 시스템에 접속하는 것이다. 루트킷은 백도어 원격 접속 데몬을 설치함으로써 이와같은 작업을 아주 쉽게 하는데 이러한 대몬에는
telnetd 또는
sshd의 수정된 버전이 있다. 수정 버전은 이러한 데몬들이 디폴트로 칩임을 감시하는 포트보다는 다른 포트에서 실행된다.
대부분의 루트킷은 목표 시스템 상에서 기존 것을 교체하는 수정된 시스템 바이너리를 제공한다. 적어도
ps,
w,
who,
netstat,
ls,
find 같은 핵심 바이너리와 서버의 활동 상태를 모니터링하는데 사용되는 기타 바이너리들이 교체되어 침입자들과 그들이 실행하는 프로세스는 부주의한 시스템 관리자에게는 그 모습을 드러내지 않은 채로 실행된다.
대개 루트킷은 원본 시스템 파일을 감염된 버전으로 갈아치우면서 파일의 생성 날짜와 크기를 원본과 똑같이 생성해내기 때문에 이러한 파일들의 통계를 기록하는 것은 충분하지 못하다. 따라서 서버에서 일어나는 수상한 활동을 확인하기 위해 사용될 수 있는 시스템 파일 정보 목록을 만들기 위한 최선의 방법은 이러한 파일들의 암호화된 체크섬을 계산하여 이 정보를 CD와 같은 안전한 곳에 저장하는 것이다.
Tripwire 혹은
AIDE 같은 서드파티 도구는 이와 같은 파일 서명의 계산을 자동으로 해주기 때문에 이 과정을 보다 쉽고 확실하게 해준다.
아래 정의는 어느 웹사이트에 있는 Tripwire에 대한 간략 설명이다.
"Tripwire는 시스템에서 변경된 사항을 알아내기 위한 검사 실행하는 하는 도구이다. 이 프로그램은 바이너리 서명, 용량, 예상되는 용량 변화 등등을 포함해 절대 바뀌어서는 안될 파일의 중요한 속성을 점검한다."
확실히 이 과정은 현재 보다 많은 소프트웨어 및 기타 파일들이 시스템에 도입될 때마다 반복되어야 한다. 레드햇이나 수세같은 RPM 기반의 리눅스 시스템에서는 파일의 현재 MD5 서명과 RPM 설치 데이터베이스에 있는 서명을 비교하기 위해 RPM 서명을 이용할 수 있다. 하지만 불행하게도 침입자들이 잠재적으로 RPM 애플리케이션 그 자체와 로컬 RPM 데이터베이스를 조작할 수 있기 때문에 이들이 정확한 정보를 제공한다고는 신뢰할 수 없다.
어떤 루트킷은 스니퍼 혹은 키로거(keylogger) 애플리케이션을 포함하고 있기도 하다. 이것들은 다른 시스템에 대한 패스워드를 수집하고 기밀 정보에 대한 트래픽을 청취하는데 사용된다. 이와 같이 하기위해 루트킷은 목표 머신의 네트워크 인터페이스 카드(NIC)에
PROMISCUOUS 모드를 설정한다. 정상적인 작동상태에서 네트워크 인터페이스 카드는 오직 자신에게 보내진 트래픽과 모두가 청취하는 브로드캐스트 주소를 통해 오는 트래픽을 청취한다.
"난잡하지 않은" 상태의 네트워크 어댑터에서 다른 네트워크 인터페이스로 배달되는 패킷들은 그 안에 들어있는 실제 데이터가 확인되지도 않은 채 조용히 버려진다. 그렇지만 직접 연결된 컴퓨터를 사용할 때나 기본적이고 스위칭이 되지 않는 허브를 사용하는 네트워크를 사용할 때 인터페이스가
PROMISCUOS 모드로 설정되어 있다면 모든 트래픽을 청취 할 수 있다.
비교적 거대한 네트워크에서 침입자가 이 트래픽을 청취한다면 결과는 매우 절망일 것이다. 머신들 중 한 대가 침범당했다고 할지라도 전체 네트워크를 보호하기 위해 직접적인 케이블 연결과 기본적인 허브들은 피해야한다. 스위칭 허브 및 기타 진보된 네트워크 장비는 네트워크에 연결된 모든 머신에 트래픽을 브로드캐스트하지 않고 트래픽을 받을 것으로 예상되는 머신에만 전송하여 결과적으로 네트워크 상에 있는 모든 머신들을 보호한다.
시스템 관리자가 이상한 행동을 감시하기 위해 하는 첫번째 일이 시스템 로그 파일을 분석하는 것이기 때문에 루트킷이 시스템 로그를 수정하는 유틸리티를 포함하는 것은 아주 흔한 일이다. 극단적인 경우, 루트킷은 로깅하는 것을 모두 중지시키기도 하며 기존의 모든 로그를 폐기한다. 향후 침입 활동 개시를 위한 진출 기지로서 연장 시간동안 서버를 사용하려 한다면 대개 침입자들은 그들의 존재를 누설할 수 있는 로그의 일부분만을 지울 것이다. 왜냐하면 로그파일이 아예 없거나 로그 활동이 중지되는 것은 그 자체로 의심스러운 행동의 징후가 된다. 따라서 치고 도망가는 방식을 택한 공격자들만이 무분별하게 모든 로그를 폐기하는 방식을 선택할 것이다.
성공적이든 아니든 상관없이 관리자가 침입 시도에 관한 로그를 보존하는 방법은 네트워크 이상을 탐지해서 통지 이메일 메시지를 보내거나 로그 파일을 통해서 시스템 관리자에게 경고를 하는 시스템을 고안하는 것이다. 분명한 것은 네트워크 침입 탐지와 주기적인 로그파일 전송 방식은 침입자가 머신에 접근 통로를 얻은 후에는 신뢰할 수 없다는 사실이다.
루트킷이 일으킬 수 있는 시스템 보안상 가장 심각한 위협은 틀림없이 LKM(Loadable Kernel Module:적재 가능 커널 모듈) 트로이를 사용하는 것에서부터 야기된다. 적재 가능한 커널 모듈이란 커널 재 컴파일이 필요 없이 작동중인 운영체제 커널에 기능을 추가하기 위한 기법이다. LKM 사용상의 이점은 널리 인정되기는 하지만 악의적인 목적을 위해서 커널 모듈-적재 기법을 사용하는 침입자들이 이를 악용할 수도 있기 때문에 반대하기도 한다. LKM에 트로이에 감염된 시스템을 리부팅 한다해도 LKM 프로세스는 부팅 과정에서 다른 커널 모듈들과 마찬가지로 그것을 다시 적재할 것이다. 적재 가능한 커널 모듈은 현재 리눅스, 솔라리스, FreeBSD를 포함한 많은 운영체제에서 사용되고 있다.
SANS에 따르면 "커널 [LKM] 루트킷은 시스템 바이너리를 교체하는 것이 아니라, 커널을 통해서 그것들을 파괴한다. 예를 들어
ps는
/proc(procfs)로부터 프로세스 정보를 얻는다. 커널 루트킷은
procfs로부터 특정 프로세스를 숨기기 위해 커널을 파괴한다. 따라서
ps나 벤더가 제공한 미디어에서 나온 정상적인 사본조차도 거짓된 정보를 보고하려고 할 것이다."라고 한다.
암호화를 통해 커널 모듈에 서명하는 것이 가능한 것으로 생각되지만 이와 같은 보안 위협에 대처하는 최선의 예방책은 모든 기능을 정적으로 커널에 집어넣어 컴파일하고 LKM 기능을 비활성화 하는 것이다(추후에 부가적인 커널 기능을 필요로 하지 않을 서버 시스템에서 특히 요구됨).
Knark, Adore, 그리고 Rtkit은 수많은 LKM 루트킷 중에서 현재 이용할 수 있는 몇 가지에 속한다.
시스템에 루트킷이 설치되지 않도록 하는 유일한 방법은 루트킷이 시스템에 들어오기 전에 막는 것이다. 루트킷은 침입자가 시스템에 접근하는 것을 돕도록 고안되지는 않다는 사실을 기억하라. 루트킷은 침입자가 편안히 작업할 수 있도록 그리고 침입한 시스템에서 방해받지 않고 조용히 작업할 수 있도록 설계된 것이다. 루트킷을 설치하기 위해 이미 잘 알려진 취약점을 공격한다든가 사교적인 방법을 동원하여 순진한 사람으로부터 패스워드 정보를 얻어내는 등의 전통적인 방법은 아직까지도 서버에 인정받지 못한 엑세스를 획득하기 위해 침입자들이 자주 사용하는 수법이다.
미래의 골칫거리를 피하기 위해 네트워크의 유형에 상관없이 접근 가능한 머신에는 항상 방화벽을 설치하고, 발표된 모든 패치를 소프트웨어에 적용하고, 절대적으로 필요하지 않은 서비스는 비활성화 해야 한다. 강력한 패스워드와 SSL 및 SSh와 같은 보안 프로토콜을 적용가능한 곳에 도입하여 꾸준히 실천한다면 시스템은 절대로 손상되지 않을 것이라 확신할 수 있다.
그런데... 그렇다고 하더라도 확실하지는 않다. 시스템의 보안을 위해 가능한 최대의 노력을 한다 해도 누군가가 당신의 시스템을 파괴하고 들어와서 한 두 개의 루트킷을 설치할 가능성은 여전히 높기 때문이다.
Oktay Altunergil는 유닉스 관리자와 PHP 프로그래머로 일하고 있다.