GNU/Linux는 매우 안정적인 운영체제이지만, 많은 사용자가 이를 과신하며 '안전한 환경에서 작업하니 아무 문제도 생기지 않을 것'이라는 잘못된 생각에 빠지기 쉽습니다. 실제로 Linux 환경용 악성코드는 드물지만, Linux 시스템 역시 언제든 침해당할 가능성은 존재합니다. 특히 루트킷(rootkit)과 같은 공격 가능성을 염두에 두는 것은 시스템 관리자의 필수적인 업무입니다.
루트킷이란 제3자가 정당한 권한 없이 컴퓨터 시스템에 접근한 후 사용하는 도구 모음을 의미합니다. 이를 통해 공격자는 정당한 사용자가 모르는 사이에 파일을 조작할 수 있습니다. unhide 패키지는 바로 이처럼 은닉된 악성 소프트웨어를 빠르게 찾아낼 수 있는 기술을 제공합니다.
unhide 설치 방법
unhide는 대부분의 주요 Linux 배포판 저장소에서 제공됩니다. Debian이나 Ubuntu 계열에서는 다음 명령어로 간단히 설치할 수 있습니다:
sudo apt-get install unhide
GUI 환경의 서버라면 Synaptic 패키지 관리자를 이용해도 됩니다. Fedora와 Arch 배포판 역시 각자의 패키지 관리 시스템용으로 미리 빌드된 버전을 제공합니다. 설치가 완료되면 시스템 관리자는 여러 가지 방식으로 이 도구를 활용할 수 있습니다.
방법 1: 프로세스 ID 무차별 대입 검사
가장 기본적인 기법은 각 프로세스 ID(PID)를 하나씩 무차별 대입(bruteforce)하여 사용자에게 숨겨진 프로세스가 있는지 확인하는 것입니다. root 권한이 없다면 CLI 프롬프트에서 다음 명령어를 입력하세요:
sudo unhide brute -d
여기서 -d 옵션은 검사를 두 번 실행하여 오탐(false positive) 횟수를 줄여줍니다.
출력 결과는 매우 단순합니다. 저작권 메시지가 표시된 후 unhide가 수행하는 검사 내용을 안내하는데, 다음과 같은 문구가 나타납니다:
[*]Starting scanning using brute force against PIDS with fork()
[*]Starting scanning using brute force against PIDS with pthread functions
이 외에 추가 출력이 없다면 걱정할 필요가 없습니다. 만약 brute 서브루틴이 무언가를 발견하면 다음과 같은 메시지를 출력합니다:
Found HIDDEN PID: 0000
'0000' 자리에는 실제 PID 번호가 표시됩니다. 단순히 일시적(transitory) 프로세스라고만 표시된다면 오탐일 가능성이 있으므로, 깨끗한 결과가 나올 때까지 여러 번 검사를 반복해 보세요. 추가 정보가 함께 표시된다면 후속 점검이 필요할 수 있습니다. 로그 파일이 필요하다면 -f 스위치를 사용하여 현재 디렉터리에 로그 파일을 생성할 수 있습니다. 최신 버전에서는 unhide-linux.log라는 이름의 일반 텍스트 파일로 저장됩니다.
방법 2: /proc과 /bin/ps 비교
/bin/ps와 /proc의 프로세스 목록을 비교하여 Unix 파일 트리 내의 두 개별 목록이 일치하는지 확인할 수도 있습니다. 불일치가 발견되면 프로그램이 비정상적인 PID를 보고합니다. Unix 규칙상 실행 중인 프로세스는 반드시 이 두 목록에 ID 번호를 표시해야 합니다. 다음 명령어로 검사를 시작하세요:
sudo unhide proc -v
마지막의 -v 옵션은 상세(verbose) 모드를 활성화합니다.
이 방법은 다음과 같은 프롬프트를 반환합니다:
[*]Searching for Hidden processes through /proc stat scanning
비정상적인 항목이 있다면 이 문구 아래에 표시됩니다.
방법 3: Proc과 Procfs 기법 결합
필요하다면 /bin/ps와 /proc Unix 파일 트리 목록을 비교하는 동시에, /bin/ps 목록의 모든 정보를 가상 procfs 항목과도 대조할 수 있습니다. 이 방식은 Unix 파일 트리 규칙과 procfs 데이터를 모두 검증합니다. 다음 명령어를 입력하세요:
sudo unhide procall -v
모든 /proc 통계를 스캔하고 여러 검사를 수행해야 하므로 상당한 시간이 걸릴 수 있습니다. 하지만 서버의 전반적인 상태를 철저히 확인하는 데는 가장 확실한 방법입니다.
방법 4: procfs 결과와 /bin/ps 비교
앞선 검사들이 대부분의 용도에는 너무 복잡하다면, proc 파일 시스템 검사만 독립적으로 실행할 수도 있습니다. 다음 명령어를 입력하세요:
sudo unhide procfs -m
이 명령은 procfs 검사에 -m 옵션이 추가로 제공하는 몇 가지 검사까지 함께 수행합니다. 역시 다소 시간이 걸리는 검사이며, 세 줄의 개별 출력을 반환합니다. 참고로 어떤 검사든 -f 옵션을 추가하면 전체 로그를 생성할 수 있습니다.
방법 5: 빠른 스캔 실행
심층 검사 없이 신속하게 스캔만 필요하다면 다음 명령어를 사용하세요:
sudo unhide quick
이름 그대로 빠르게 실행됩니다. 이 기법은 proc 목록과 proc 파일 시스템을 스캔하고, /bin/ps에서 수집한 정보와 시스템 리소스 호출 결과를 비교하는 검사도 수행합니다. 한 줄의 출력만 제공하지만, 그만큼 오탐 위험은 커집니다. 따라서 이전 검사 결과를 이미 확인한 후 재확인 용도로 활용하는 것이 좋습니다.
출력 예시는 다음과 같습니다:
[*]Searching for Hidden processes through comparison of results of system calls, proc, dir and ps
이 스캔을 실행하면 몇 개의 일시적 프로세스가 감지될 수 있습니다.
방법 6: 역방향 스캔 실행
루트킷을 효과적으로 적발하는 훌륭한 기법 중 하나는 모든 ps 스레드를 검증하는 것입니다. CLI에서 ps 명령을 실행하면 터미널에서 실행된 명령 목록을 볼 수 있는데, 역방향(reverse) 스캔은 ps가 표시하는 각 프로세서 스레드가 유효한 시스템 호출을 사용하는지, 그리고 procfs 목록에서 조회 가능한지를 확인합니다. 루트킷이 어떤 프로세스를 제거했는지도 파악할 수 있는 좋은 방법입니다. 다음 명령어를 입력하세요:
sudo unhide reverse
매우 빠르게 실행되며, 가짜 프로세스(fake process)를 찾고 있다는 알림이 표시됩니다.
방법 7: /bin/ps와 시스템 호출 비교
마지막으로 가장 포괄적인 검사는 /bin/ps 목록의 모든 정보를 유효한 시스템 호출 결과와 대조하는 것입니다. 다음 명령어로 시작하세요:
sudo unhide sys
다른 검사보다 실행 시간이 더 오래 걸릴 가능성이 높습니다. 출력되는 내용도 매우 많으므로, -f 옵션으로 로그 파일을 생성해 두면 나중에 결과를 검토하기가 훨씬 수월합니다.
마무리
Linux 시스템의 보안은 기본적으로 견고하지만, 루트킷과 같은 은닉형 위협은 눈에 보이지 않기 때문에 별도의 검증 도구가 필요합니다. unhide가 제공하는 7가지 검사 방식을 상황에 맞게 활용하면 숨겨진 프로세스를 조기에 발견하고 시스템 무결성을 지킬 수 있습니다. 정기적인 점검 습관이야말로 안전한 서버 운영의 첫걸음입니다.