Linux 시스템의 메모리 포렌식 분석

Linux 시스템의 메모리 포렌식 분석

in

개요

디지털 포렌식은 컴퓨터에서 사용자의 흔적들을 되짚어가며 컴퓨터에서 일어난 작업들에 대해 재구성하는 작업을 말한다.

가동 중인 시스템 정보와 과거의 행적을 보여주는 로그에 대한 정보를 조회하고 수집하는 것은 이런 디지털 포렌식 작업에 있어서 필수적이다. 사이버 해킹 공격, 사이버 범죄시 범죄자들은 컴퓨터, 이메일, IT 기기, 스마트폰 등의 운영체제, 애플리케이션, 메모리 등에 다양한 전자적 증거를 남기게 되면서, 사이버 범죄자 추적 및 조사에 핵심적 요소가 되고 있다.

기존의 디지털 포렌식은 컴퓨터 시스템을 종료한 후, HDD 등의 저장매체를 분리하여 분석하는 방식으로 이루어지고 있었다. 하지만 이러한 오프라인 분석 방식은 Fileless Malware 등에 의한 침해 사고에서는 무용지물이 된다.

Fileless Malware는 메모리 내에서만 작동하도록 설계되었으므로 시스템에서의 수명은 시스템이 재부팅 될 때까지만 존재하게 된다. 즉, 시스템의 HDD에 어떠한 증거도 남기지 않아 불법 활동을 식별하기 위한 증거를 제공하지 않는다. 이러한 특성으로 기존의 안티 포렌식 전략에 매우 강하다.

이처럼 실행 중인 프로세스의 메모리에 삽입되어 RAM에만 상주하여 HDD에 어떠한 디렉터리나 파일도 남기지 않는 악성코드라면 무용지물이 된다. 이러한 종류의 사이버범죄에 대응하기 위해서는 필수적으로 활성 상태의 메모리를 추출한 후 분석하는 과정이 필요하다.

현재는 통상적으로 이러한 기법을 ‘메모리 포렌식(Memory Forensic)’이라 지칭하며, 2004년 최초의 기반기술 개발을 기점으로 ‘메모리 포렌식’에 대한 많은 연구가 진행되고 있다. 현재 Volatility와 Rekall 등의 다양한 오픈소스 분석 도구들이 실무에서 사용되고 있는 한편, 리눅스 시스템은 매우 다양한 종류의 배포판이 존재하고, 개인이 커스터마이징한 커널 또한 많기 때문에 분석을 위한 프로파일 추출이 MS사의 Windows 운영체제에 비해 상당히 곤란하다.

또한 메모리조작 취약점 보안을 위한 보안기능들이 오히려 메모리 분석을 어렵게 만드는 부작용을 낳고있다. 해당 글에서는 휘발성 데이터 및 리눅스 시스템 메모리 포렌식에 전반에 대한 설명 이후 오픈소스 분석도구를 이용한 Linux시스템 메모리 추출 및 분석 과정이 전달된다.

휘발성 데이터

휘발성 데이터란?

디지털 포렌식 분야 중, 휘발성 메모리를 포렌식 하는 과정을 메모리 포렌식이라고 할 수 있다.

휘발성 데이터(Volatile Data)란 전원의 공급이 끊기거나 시간이 흐름에 따라 자연히 저장 공간에서 사라지는 데이터로, 말 그대로 휘발성을 가진 디지털 데이터를 의미하는 용어다.

일반적으로 디지털 포렌식에서는 컴퓨터가 켜져 있을 때, 보조기억장치에 해당하는 물리 메모리 또는 휘발성 메모리(RAM)에 로딩되어 있는 데이터를 가리켜 휘발성 데이터라 한다.

즉, 메모리는 휘발성 정보로써 시스템이 종료되면 메모리 안의 데이터는 점차 사라지게 된다. 휘발성 데이터는 디지털 포렌식 조사에서 조사 당시의 시스템 상태를 정확하게 파악할 수 있게 하는데 특히 도움을 주는 데이터이다.

조사 시점에 연결된 네트워크, 조사 시점에 동작 중인 프로세스를 비롯한 각종 사용 중인 운영체제의 자원 등은 현장에서 휘발성 데이터를 수집하지 않고는 얻어낼 수 없는 귀한 정보들이다. 그 밖에도 암호화된 데이터도 사용 직전에는 복호화 된 상태로 존재하게 되는 것처럼 물리 메모리에서는 평문(보호 해제된 혹은 복호화 된) 상태의 데이터를 취득할 수 있는 가능성이 매우 높다.

즉, 휘발성 메모리(RAM)에는 현재 실행 중인 프로세스, 실행된 콘솔 명령어, 암호화되지 않은 비밀번호, 암호화되지 않은 데이터, 메신저 내용, IP 주소, 악성코드 등 중요한 증거가 저장되어 있을 수 있다.

휘발성 데이터와 비휘발성 데이터의 차이는 다음과 같다.

데이터 종류 특징
휘발성 데이터 1. 사고 대응 시 휘발성이 가장 큰 데이터를 우선 수집한다.
2. 휘발성 순서는 어떤 데이터가 다른 데이터보다 더 짧은 ‘수명’ 또는 ‘보존 기간’을 가지는지 설명한다.
3. 데이터 수집 시 RFC 3227 문서의 휘발성 순서 및 로카드르 교환법칙 모두를 감안할 필요가 있음.
비휘발성 데이터 1. 비휘발성 데이터는 조사에 영향을 줄 수 있으므로, 실시간 대응의 일부로 데이터를 수집할 필요가 있음.
2. 비휘발성 데이터는 사후 조사를 후속으로 진행할지에 대한 결정에 영향을 줌.

아래는 RFC 3227(증거물수집과 증거보관에 관한 지침)의 보통의 시스템에 대한 휘발성 순서의 예이다.

RFC 3227
1. Registers, Cache
2. Routing Table, ARP Cache, Process Table, Kernel Statistics, Memory
3. Temporary File Systems(임시 파일 시스템)
4. Disk
5. Remote Logging And Monitoring Data that is Relevant to the System in Question(원격 로깅 및 모니터링 관련 데이터)
6. Physical Configuration, Network Topology(물리적 구성, 네트워크 토폴로지) 
7. Archival Media(아카이브 미디어)

휘발성 데이터 수집 방법의 종류

휘발성 데이터를 수집하는 방법에는 시스템 내장 명령 혹은 시스템 API로 구현된 도구를 통하여 원하는 정보를 수집 하는 방법(Live Response)과 물리 메모리 전체의 내용을 수집하는 방법(Memory Analysis)이 있다.

이때, 물리 메모리를 수집한 경우에는 메모리의 구조를 분석하여 원하는 정보를 채득하는 과정을 더해야 한다.

해당 글에서 다루고자 하는 주된 내용은 물리 메모리 전체를 수집하는 방법(Memory Analysis)이다.

Live Response & Memory Analysis 차이

휘발성 정보를 추출하는 방법은 메모리 포렌식 이전에 라이브 포렌식(Live Forensic) 또는 라이브 리스폰스(Live Response)가 있는데 메모리 포렌식과 차이점은 아래와 같다.

  API에 대한 의존성 반복조사에 대한 가능성 조사의 다양성
Live Response [API에 의존]
커널 루트킷 설치 시 시스템 API를 사용하는 도구들은 영향을 받기 쉽다.
[동일 시스템간 반복조사 불가]
휘발성 데이터들은 그 내용 또한 시간에 따라 변하게된다. 또한 메모리 정보는 전원의 공급이 끊기면 당시의 메모리 정보는 절대 다시 재현될 수 없다.
[추가조사 불가]
라이브 리스폰스가 수행되는 중에는 여러방법으로 분석이 가능하지만, 일단 분석이 끝나면 추가적인 조사는 불가능하다.
Memory Analysis [API에 의존하지 않음]
조사대상 컴퓨터의 메모리 및 프로세스 관련 API를 사용하지 않으므로 침해받을 확률이 비교적 적다.
[반복조사 가능]
메모리 분석 대상은 변하지 않는 내용의 파일이기 때문에 조사 결과의 일관성이 있어 언제든 반복조사 가능하다.
[다양한 조사 가능]
한 가지 대상에 대한 다양한 조사 수행 가능하다.

따라서 Live Response과정에서 놓친 자료들을 메모리 포렌식에서 추출 할 수도 있다. 이렇듯 실무적으로나, 학문적으로나 메모리를 분석한다는 것은 악성코드 또는 사람에 의한 일련의 조작행위를 역추적 및 재구성하는데 있어 매우 중요하다는 것은 더 강조할 필요가 없다.

운영체제별 메모리 추출 도구

각 운영체제마다 RAM 메모리를 추출하는 다양한 도구들이 존재한다.

[Windows]
 - FTK Imager
 - X-ways capture
 - Winen
 - Win32dd, mdd
 - Helix PRO IEEE1394(FTWAutopwn) 
...

[Linux / macOS]
 - IEEE1394(Goldfish, pythonraw1394) LiME
 - libforensic 1394
...

Linux 시스템에서의 휘발성 메모리 분석 연구는 MS社의 Windows에 비해 활발하지 않다. 꼭 도구의 수 때문만은 아니지만, 메모리 포렌식 관련 CTF 문제들 또한 상당부분 Windows를 기준으로 하고 있다. 따라서 Windows 관련자료는 풍부한 편이나, 상대적으로 리눅스 환경에 대한 분석은 찾아보기가 힘들다.

그 이유는, Windows는 업데이트를 수시로 하긴 하지만 구조를 변경시킬만한 주요 업데이트는 빈번하지 않으며, 우리나라 Desktop OS 점유율이 Windows가 우세하기에 Windows 연구가 더욱 매력적일 수 밖에 없다.
그에 비해 Linux는 배포판마다 가지는 특징이 다르고 주요 업데이트도 빈번하기 때문에 연구의 어려움을 가지고 있다.

즉, 연구의 동기부여 관점에서 Windows 운영체제의 점유율이 훨씬 높기에 Windows로 연구가 치우칠 수 밖에 없을 것이다. 그러나 수사의 대상이 항상 Windows 운영체제일리는 없다는 것에 주목해야한다. 이어서 리눅스 시스템에서의 메모리 수집 방법 및 덤프/분석 도구들을 소개한다.

Linux System Memory Dump

Memory Dump 란 무엇인가?

소개에 앞서 Memory Dump에 대한 간략한 설명을 한다. 메모리 포렌식 중 메모리를 덤프하는 방식에는 여러 가지가 있다.

메모리를 분석하려면 우선 “Memory Dump” 과정을 거쳐야 한다. 시스템의 물리 메모리를 파일 형태로 저장하는 방법으로, 해당 파일의 구조는 실제 물리 메모리 구조와 동일하다.

침해 사고 분석 시 침해 시스템에 실시간 분석을 수행하면 해당 명령어로 인해 메모리의 상태 및 데이터가 변경 된다. 이는 메모리로부터 얻을 수 있는 중요한 정보를 놓칠 수 있는 가능성이 존재하므로 분석에 불리하게 작용할 수 있게 된다.

이와 같은 실시간 분석의 단점으로 인한 침해 사고 시점의 휘발성 데이터를 파일 형태로 간직하여 메모리에 변화를 주지 않으면서 분석을 하기 위해 Memory Dump를 수행하게 된다.

Linux 환경에서의 Memory Dump

메모리 포렌식의 성공적 수행을 위해서는 Live System에서 휘발성 데이터를 안정적인 방법으로 추출하는 것이 관건이다. Linux는 운영체제의 모든 리소스들을 File 형태로 다루는데, Linux에서 Memory 접근은 장치 파일을 통해 이루어진다.

System Memory – /dev/mem 
Kernel Memory – /dev/kmem

배포판에 따라 커널 메모리 장치 파일은 사용하지 않는 경우도 있다. 기본적으로 시스템 메모리는 /dev/mem을 통해 접근한다.

과거 고전적인 방법으로, Linux 및 Unix에서는 /dev/mem//dev/kmem을 통해 OS 자체적으로 지원하는 메모리 덤프 기능의 사용이 가능했다. 그러나 멀웨어 역시 이러한 기능을 악용할 수 있어 보안상의 이유로 최신 커널에서는 액세스할 수 없거나 제거되었다.

이러한 이유로 포렌식 수사를 위한 전용 메모리 덤핑 도구들이 필요하게 되었으며 이후의 리눅스 메모리 덤프는 리눅스 커널 모듈(LKM, Linux Kernel Module)을 이용해 이루어진다. 이후 fmem이나 LiME 과 같은 프로젝트에서 로드 가능한 커널 모듈이 개발되었고 Memory Dump가 가능하게 되었다.

Linux Memory Dump Tools

리눅스 메모리 덤프 도구로 대표적인 것은 fmem, LiME, Second Look’s The Linux Memory Forensic Acquisition 등이 있다.

FMEM (http://hysteria.sk/~niekt0/fmem/)

Fmem은 niekt0이 개발한 메모리 획득 도구이다. 처음에는 도구의 이름이 Fmem이 아니라 fdump 였으나 기존에 있던 도구와 이름이 중복되어 Fmem으로 바꾸게 되었다.

웹페이지(http://hysteria.sk/~niekt0/fmem/) 에서 다운받을 수 있는 오픈소스 소프트웨어다.

그러나 Ubuntu 12.04이전의 환경에서 실행 가능하며 12.04 상위 버전에서는 “Bad Address”라는 에러 메시지가 출력되면서 작동이 되지 않는다.

리눅스 커널 모듈을 로드하면 /dev/mem과 동일하게 전체 물리메모리에 접근할 수 있는 제한없는 가상의 /dev/fmem 장치 파일을 생성한다.

사용법

fmem은 간단히 다음과 같이 사용할 수 있다.

install

# install commands
$ git clone https://github.com/NateBrune/fmem 
$ cd fmem
$ sudo make

image Fmem Install

image Fmem make 결과 화면(커널 모듈 생성 과정)

./run.sh

커널 모듈을 make 명령어로 생성한 뒤 root 권한으로 커널 모듈을 로드한다. “sudo ./run.sh“를 타이핑하여 모듈을 로드할 수 있다.

$ ./run.sh

“File exists”에러가 발생하면 “rmmod fmem”을 하여 모듈을 언로드 후 다시 실행하면 된다.

image run.sh 실행 결과

Create “fmem” File

fmem 모듈을 로드하면 /dev 디렉토리에서 fmem 파일을 확인할 수 있다. 기존의 /dev/mem의 물리 메모리의 경우 이미징 시 크기에 제한이 있었지만 /dev/fmem을 통하여 크기제한 없이 물리 메모리 전체를 이미징할 수 있다.

image /dev/fmem 생성

Memory Size Check

메모리를 이미징하기 위해서 우선 메모리의 전체 크기를 파악해야 한다. "free -m" 명령어로 물리 메모리의 크기를 메가바이트 단위로 알 수 있다. 아래 그림에서 해당 명령어로 물리 메모리 크기가 1969 MB 인 것을 확인할 수 있다.

image freem -m 결과

Imaging

메모리 크기 확인 후 아래 명령어를 입력해 /tmp 위치에 메모리를 이미징 할 수 있다.

$ sudo dd if=/dev/fmem of=/tmp/test2.raw bs=1MB count=1969

image dd command

Fmem 이미징 명령어 형식은 아래와 같다.

명령어 비고
$ dd if = /dev/fmem of=[파일이름]
$ bs = [한 번에 처리할 크기] count = [메모리 사이즈]
root 권한으로 실행

image 이미징 결과(/tmp/test2.raw)

이미징이 완료된 후 “rmmod fmem”을 타이핑하여 로드되어 있던 fmem 모듈을 언로드하면 Fmem을 통한 메모리 획득 과정이 완료된다.

Fmem를 이용한 메모리 덤프 단점

Fmem을 이용한 메모리 덤프방법은 아래와 같은 단점이 존재한다.
1) 2.6 버전 이상의 리눅스 커널이라면 dd를 이용한 메모리 덤프가 불가능하므로 메모리 획득 시 시스템에 따른 제약이 있다.
2) 2011년 이후로 업데이트가 존재하지 않아 2011년 이후의 시스템에서 메모리 획득이 불가능할 수도 있다.
3) 메모리 크기를 필수적으로 확인하고 이미징해야 하므로 번거롭다.
4) root 권한이 필요하므로 관리자의 비밀번호를 알아야만 한다.

위와 같은 이유로 현장에서 Fmem을 사용 시 dd를 이용한 메모리 덤프에 대한 제약 때문에 메모리 이미지를 획득하는 대에 한계가 있다. 그러나 오래된 시스템에서 메모리 이미지를 획득할 때의 속도가 타 도구보다 빠르므로 Fmem을 시스템의 환경을 알고 있을 때 이를 활용할 수 있다.

LiME (https://github.com/504ensicslabs/lime)

LiME도 fmem과 마찬가지로 커널 모듈이다. LiME은 Joe Sylve가 만든 오픈소스 SW이며 리눅스뿐만 아닌 안드로이드와 같은 리눅스 기반 디바이스의 메모리를 덤프 할 수 있다.

편리성과 유용성 측면에서 가장 각광받고 있는 소프트웨어로, 데이터 처리 시 사용자 영역과 커널 부분을 독립적으로 전달하는 방식을 사용하여 안정성을 크게 향상시켰고, 안드로이드 등의 리눅스 기반 모바일 운영체제에서도 상당히높은 정확도로 작동하기 때문에 리눅스 시스템의 메모리 포렌식 분석에서 가장 권장된다.

안드로이드의 메모리를 처음으로 Full Dump를 한 도구이기도 하며 TCP를 통해서도 메모리를 덤프할 수 있다. 메모리를 획득하는 과정에서 Kernel과 User간의 상호작용을 최소화하여 획득 도구에 의한 메모리의 훼손을 최소화 시켰다.

LiME은 다음의 웹페이지(https://github.com/504ensicslabs/lime) 에서 다운로드 할 수 있다.

image https://github.com/504ensicslabs/lime

아래와 같이 기본적인 사용 예제나 컴파일 방법들을 확인할 수 있다. image Usage and Examples

LiME/src/ 경로로 가면 Lime의 소스코드를 볼 수 있다. 소스를 간단히 살펴보면 PFN(Page Frame Number)을 이용해 특정 페이지 주소를 얻고, 해당 페이지를 덤프한다. 실제 메모리에 접근한다기 보다는 시스템 메모리 공간의 페이지가 할당된 영역을 덤프하는 것이다.

image LiME /src

메모리 덤프 시 주의할 점이 있는데, 자신의 컴퓨터에 테스트 용도로 사용한다면 상관없지만, 실무에서는 메모리 포렌식 과정 중에 용의자의 컴퓨터에서 작업을 해야 한다. 이는 즉 의심되는 시스템에서 라임을 컴파일해야 한다는 뜻이며, 대상이 어떤 운영체제에 어떤 환경을 가지고 있는지는 알 수 없다.

리눅스 운영체제라면 대체로 Ubuntu, Fedora, RedHat 등이 가장 널리 사용되고 있겠지만, 그 외에도 상당히 많고 다양한 종류의 아키텍처들이 존재하며, 각 버전마다 상이한 차이점을 갖고 있기 때문에 특정 시스템으로 단정 짓기가 어려운 점이 존재한다.

가장 좋은 방법은, 해당 시스템과 정확히 일치하는 환경으로 테스트 환경을 구축해 놓고, 그곳에서 LiME을 컴파일 한 후 실행파일만 옮겨와서 대상 시스템에서 메모리를 추출하는 것이다.

하지만 만약 이 방법이 여의치 않다면 어쩔 수 없이 대상 시스템에서 직접 컴파일해야할지도 모른다. 이 경우 대상 시스템이 필연적으로 변조되기 때문에 무결성 측면에서는 상당한 손해를 볼수도 있다. 이는 증거역학적으로 잠재적인 파괴를 낳는다는 것을 명심해야 한다.

이러한 주의사항을 숙지했다는 전제하에 컴파일을 진행해야 한다.

사용법

테스트를 수행한 환경은 Ubuntu 18.04이다. LiME은 다음과 같이 사용할 수 있다.

Install

# Install Commands
$ git clone https://github.com/504ensicsLabs/Lime.git 
$ cd Lime
$ sudo make

image LiME install

LiME을 다운받은 후 압축을 푼 디렉터리의 아래의 src폴더에서 make를 하여 커널 모듈을 만든다.

image Compile

make 결과 lime-418.0-21-generic.ko라는 파일명의 커널 모듈이 생성된 것을 확인할 수 있다. 여기서 4.18.0-21이란 숫자가 커널 버전을 의미하고, ko는 Kernel Object를 뜻한다.

이렇게 컴파일된 LiME 바이너리를 통해 해당 커널 버전에 대해서는 모두 사용이 가능하다. 하지만, 커널 버전이 다른 경우이거나 종류가 상이하다면 정상적으로 작동하지 않을 가능성이 더 크다.

해당 커널 모듈을 이용하여 메모리 이미지를 획득할 수 있다.

lnsmod Imaging

root 권한이 필요하므로 insmod 명령어를 통해 커널 객체를 삽입한다. 그리고 추출된 결과파일을 저장할 경로와 이름, 파일형식을 지정해준다. 아래 구문은 /tmp 위치에 이미징을 수행한다.

$ sudo insmod lime-418.0-21-generic.ko path=/tmp/limetest.lime format=lime

image lnsmod command

마찬가지로 “File exists”에러가 발생하면 “rmmod lime”을 입력하여 모듈을 언로드 후 다시 실행하면 동작한다.

LiME 이미징 명령어 형식은 아래와 같다.

명령어 비고
$ insmod [모듈이름] path=[파일명] foramt=lime root 권한으로 실행

이미지를 원격지 서버로 전송

path옵션을 이용하여 물리 메모리 이미지를 파일로 저장할 수 있으며 또한 원격지 서버로 전송할 수 있다.

파일명 부분에 파일명이 아닌 “tcp:7777”을 입력하여 7777번 포트로 이미지를 원격지로 인터넷을 통해 전송할 수 있다. 원격지에서는 “nc localhost 7777 > ram.lime”으로 이미지를 전송을 대기 한다.

그 후 메모리 이미징을 하는 컴퓨터에서 “insmod lime-418.0-21-generic.ko path=tcp:8891 format=lime“을 입력하여 8891번 포트를 이용하여 이미지를 보내도록 한다.

그 후 “nc localhost 8891 | nc [원격지 ip 혹은 도메인] 7777“을 입력하여 원격지 서버의 7777번 포트로 이미지를 전송한다.

아래는 LiME의 파일로 이미징을 한 결과이다.

image result

image Memory Dump information

이렇게 생성된 결과파일의 정보를 확인해보면 위와같이 2.0G의 메모리 덤프가 생성되어있다. 대상 시스템의 RAM 용량에 따라 결정된다.

이후 물리 메모리의 이미징 후 “rmmod lime”을 입력하여 LiME 모듈을 언로드하면 메모리 획득 과정이 종료된다. 실무라면 이때 md5sum이나 shasum을 사용해서 해시값을 계산하여 무결성을 보장한다.

아래는 LiME의 포맷 옵션이다.

옵션 설명 비고
path 물리 메모리 이미지를 파일로 저장하거나 인터넷을 통해 원격지 서버로 전송할 수 있다.
[Input]
파일경로와 파일이름 혹은 tcp:[port]
필수 옵션
format 메모리 이미지의 포맷을 결정하는 옵션
[Input]
raw: RAW 포맷 이미지
padded: 예약영역을 ‘0’으로 패딩
lime: LiME 포맷 이미지
필수 옵션
dio 물리 메모리에 바로 접근하여 이미징할 지 여부를 선택한다.
[Input]
1: 다이렉트 I/O를 통해 이미징 (default)
0: 다이렉트 I/O 비활성
-

LiME을 통한 Memory Dump의 전체적인 과정을 요약하자면 이렇다.
1) LiME 커널 모듈은 덤프한 메모리를 저장할 경로를 인자로 받는다. 모듈은 로드되자마자 실행되어 지정한 경로에 메모리를 덤프한다.
2) LiME은 별도로 파일을 크기를 확인하지 않고 바로 메모리 이미징을 할 수 있고 Fmem과 달리 옵션이 존재한다. 이미징을 진행할 때 최소한의 메모리를 사용하는 것이 LiME의 장점이다. 또한 모든 옵션이 정상 작동한다. 커널 모듈명과 명령어가 길다는 점 외에 별다른 제한사항이 존재하지 않는다.
3) 현장에서 메모리 이미지를 획득할 때 LiME은 최소한의 메모리를 사용하도록 설계하여 메모리 이미지를 타 제품에 비해 적게 훼손한다는 점을 활용하여 이미징을 할 수 있다. 또한 dd를 이용한 메모리 덤프가 아니기 때문에 2.6 버전 이상의 리눅스 커널에서 작동이 가능하다.

Second Look : The Linux Memory Forensic Acquisition (http://secondlookforensics.com/)

Second Look의 도구는 상용 제품이다. 실제 사용해보지 않아 성능이나 기타 부분에 대해 언급할 수는 없지만 듣기로는 꽤 안정적이고 성능이 좋다고 한다.

Linux Memory Dump Analysis Tools

메모리를 덤프했다면 덤프한 메모리를 분석할 수 있는 도구가 있어야 한다.

덤프 된 메모리 분석(Analysis)을 통해 유의미한 정보를 추출하고, 대상 시스템에서 발생한 침해사고 상황을 역추적할 수 있게 된다.

리눅스 환경의 메모리 포렌식을 위한 도구로는 Volatility, Rekall 등의 오픈소스가 널리활용되고 있고, 기업을 위한 상용 라이센스 제품인 Second Look: The Linux Memory Forensic Analysis, Forcepoint Threat Protection for Linux 등 도 있다

Volatility (https://github.com/volatilityfoundation/volatility)

Volatility는 Volatile Systems에서 만든 CLI 기반 메모리 분석 도구이다.

오픈소스이며 웹페이지(https://github.com/volatilityfoundation/volatility) 에서 다운받을 수 있다.

Volatility는 Windows, Linux, Mac OS에서 실행할 수 있으며 플러그인을 자신이 직접 만들어 사용하거나 다른 사용자가 직접 만든 플러그인을 사용할 수도 있다.

메모리 덤프 파일(img, raw, dmp), 하이버네이션 파일(hiber), 가상 머신 메모리(vmem)를 분석할 수 있으며, 실행 중이거나 종료 또는 루트킷으로 은닉된 프로세스의 오프셋, SID(보안 식별자), PID, 스레드 수, 핸들 수, 시작 및 종료시간도 알 수 있다.

Foriana (http://hysteria.sk/~niekt0/foriana/)

foriana는 fmem을 만든 사람이 진행한 프로젝트로 석사 논문의 결과물이다. fmem으로 덤프한 메모리 이미지를 입력으로 받아 프로세스, 모듈, 파일 목록을 추출해준다. 다음은 지원 기능의 일부분이다.

–list-modules
–list-processes
–list-files
–magic-module
–magic-process –magic-user-process –create-process/module-pattern 
...

Second Look: The Linux Memory Forensic Analysis (http://secondlookforensics.com/)

Second Look은 메모리 덤프 도구와 함께 덤프 이미지를 분석할 수 있는 도구도 판매하고 있다. 메모리 내의 의심스런 라이브러리나 패턴을 탐지하는 기능도 지원한다. 다음은 실행 화면의 일부이다.

image Second Look: The Linux Memory Forensic Analysis

그 밖의 분석 도구

  • Rekall
  • Draugr (http://code.google.com/p/draugr/)
  • Read Hat Crash Utility (http://people.redhat.com/anderson/) Idetect (http://forensic.seccure.net/)
  • Forensic Analysis Toolkit (FATKit)

결론

리눅스 메모리 포렌식에 대한 연구는 윈도우 메모리 포렌식 연구에 비하여 완성도가 낮다고 할 수 있다.

다행이도 이를 커널 모듈을 이용한 fmem 방식(fmem/LiME)으로 메모리 수집이 가능하게 되었으나 커널버전이나 배포판에따라 복잡하고 불안정할수 있다는 제한사항을 가지고 있다.

또한 리눅스의 메모리 분석 기능은 윈도우에 비해 많이 부족한 것이 사실이다. 분석시 이용할 수 있는 플러그인은 윈도우에 비하여 부족하고 존재하는 플러그인이 동작하지 않는 경우도 있었다.

References

  • Forensic Memory Acquisition in Linux - LiME https://cpuu.postype.com/post/546915
  • Linux Memory Forensic Analysis - 2018 제3분기 사이버 침해사고 정보공유세미나, 2018. 9. 20, cpuu@icloud.com
  • https://www.krcert.or.kr/filedownload.do?attach_file_seq=2038&attach_file_id=EpF2038.pdf
  • 휘발성 데이터와 비휘발성 데이터 https://maj3sty.tistory.com/765
  • RFC 3227 - 증거물수집과 증거보관에 관한 지침
  • 휘발성 데이터 수집(Volatile Data Acquisition) http://portable-forensics.com/document.html http://portable-forensics.blogspot.com/2014/08/volatile-data-acquisition.html
  • https://boanin.tistory.com/99
  • Fileless Malware https://en.wikipedia.org/wiki/Fileless_malware
  • Linux Memory Forensic Analysis : Challenges and Future Directions *KAIST Software Graduate Program, **Hallym University https://cpuu.github.io/paper/Linux_memory_forensics.pdf
  • 리눅스 메모리 포렌식 개요 (An Introduction to Linux Memory Forensics) by PRONEER http://forensic-proof.com/archives/3472
  • http://forensic.korea.ac.kr/DFWIKI/index.php/Fmem
  • http://forensic.korea.ac.kr/DFWIKI/index.php/Volatility
  • https://cpuu.postype.com/post/2189640
  • https://blog.z3alous.xyz/116
  • https://lastcard.tistory.com/68
  • https://jmoon.co.kr/76
  • https://namu.wiki/w/%EB%94%94%EC%A7%80%ED%84%B8%20%ED%8F%AC%EB%A0%8C%EC%8B%9D