
리눅스 커널 드라이버로서 물리 메모리 획득을 수행하며, 예약된 메모리 및 메모리 홀을 포함한 모든 물리 주소에 대한 읽기 접근을 가능하게 하고, CR3 정보와 가상-물리 주소 변환 서비스를 제공합니다.

Windows용 대응 도구인 Winpmem과 마찬가지로, 이는 전통적인 메모리 덤퍼가 아닙니다. Linpmem은 모든 물리 주소(예약 메모리* 및 메모리 홀 포함)에서 읽을 수 있는 API를 제공하며, 일반적인 메모리 덤핑에도 사용할 수 있습니다. 또한 드라이버는 바이트, 워드, dword, qword 및 버퍼 액세스 모드와 같은 다양한 액세스 모드를 제공하며, 대부분의 표준적인 경우에는 버퍼 액세스 모드가 적합합니다. 정렬된 바이트/워드/dword/qword 읽기가 필요한 경우 Linpmem은 정확히 그렇게 수행합니다.
현재 Linpmem의 기능은 다음과 같습니다.
향후 전문 읽기 액세스 모드를 지원하기 위해 캐시 제어가 추가될 예정입니다.
적어도 지금은 Linpmem 드라이버를 직접 컴파일해야 합니다. 다른 Linux 시스템에서 미리 컴파일된 Linpmem 드라이버를 로드하는 방법은 현재 작업 중이지만 아직 완료되지 않았습니다. 하지만 Linpmem 드라이버를 컴파일하는 것은 어렵지 않으며, 기본적으로 'make'를 실행하면 됩니다.
make와 C 컴파일러가 필요합니다. (gcc를 권장하지만 clang도 작동해야 합니다.)
linux-headers가 설치되어 있는지 확인하세요 (대상 Linux 배포판의 패키지 관리자를 사용하여). 정확한 패키지 이름은 배포판에 따라 다를 수 있습니다.
패키지가 설치되어 있는지 빠르게 확인하는 방법(배포판에 독립적):
ls -l /usr/lib/modules/`uname -r`/
이상입니다. 2단계로 진행할 수 있습니다.
외부 시스템: 현재 다른 시스템용으로 드라이버를 컴파일하려는 경우(예: 대상 시스템에서 컴파일할 수 없지만 메모리 덤프를 생성하려는 경우) 해당 시스템의 Linux 배포판 패키지 저장소에서 직접 헤더 패키지를 다운로드해야 합니다. 패키지 버전이 외부 시스템에서 실행 중인 릴리스 및 커널 버전과 정확히 일치하는지 다시 확인하십시오. 다른 시스템이 자체 컴파일된 커널을 사용하는 경우 해당 커널의 빌드 디렉터리 사본을 가져와야 합니다. 그런 다음 두 디렉터리 중 하나의 위치를 KDIR 환경 변수에 설정합니다.
export KDIR=path/to/extracted/header/package/or/kernel/root
드라이버 컴파일은 간단합니다. 다음을 입력하기만 하면 됩니다:
make
그러면 현재 작업 디렉터리에 linpmem.ko가 생성됩니다.
컴파일하기 전에 precompiler.h를 확인하고 릴리스 또는 디버그용으로 컴파일할지 선택할 수 있습니다(예: 디버그 출력 포함). 현재 다른 컴파일러 설정은 많지 않습니다.
linpmem.ko 모듈은 insmod linpmem.ko의-경로를 사용하여 로드하고 rmmod linpmem.ko의-경로를 사용하여 언로드할 수 있습니다. (이렇게 하면 현재 부팅 시간 동안만 드라이버가 로드됩니다.) 디버그용으로 컴파일한 경우 dmesg도 확인하십시오.
로드 후 드라이버와 통신하려면 장치를 생성해야 합니다:
mknod /dev/linpmem c 42 0
드라이버와 통신할 수 없는 경우 dmesg 로그를 확인하여 '42'가 실제로 등록된 major 번호인지 확인하십시오:
[12827.900168] linpmem: registered chrdev with major 42
일반적으로 커널은 이 번호를 실제로 할당하려고 시도합니다.
루트 콘솔을 항상 열어 두지 않으려면 chown을 사용하여 장치를 사용자에게 부여할 수 있습니다. (또는 계속 루트 콘솔에서 사용해도 됩니다.)
드라이버와 상호 작용하는 방법을 자세히 설명하는 예제 코드가 있습니다. 사용자 공간 API 참조는 ./userspace_interface/linpmem_shared.h에서 찾을 수 있습니다.
이 코드는 라이브러리를 사용하는 대신 드라이버와 직접 상호 작용하는 방법을 이해하려는 경우 중요합니다. 또한 간단한 기능 테스트로 사용할 수 있습니다.
Linpmem용 (선택 사항) 기본 명령줄 인터페이스 도구인 pmem CLI 도구가 있습니다. 여기에서 찾을 수 있습니다: https://github.com/vobst/linpmem-cli. 소스 코드 외에도 미리 컴파일된 CLI 도구와 정적 라이브러리 및 헤더가 여기에서 (서명된 상태로) 제공됩니다. 참고: 이것은 예비 버전이며, 곧 많은 추가 사항과 개선 사항이 따를 예정이므로 업데이트를 확인하십시오.
pmem CLI 도구는 Linpmem의 다양한 기능을 (비교적) 안전하고 편리한 방법으로 테스트하는 데 사용할 수 있습니다. 이 도구를 사용하면 insmod/rmmod 대신 Linpmem을 로드할 수도 있으며, 향후 추가 옵션이 제공될 예정입니다. 또한 pmem이 즉시 사용할 수 있는 올바른 장치를 자동으로 생성한다는 장점이 있습니다. 매우 이식성이 뛰어나며 모든 Linux 시스템에서 실행되며(실제로 Linux 2.6에서도 테스트되었습니다) 있습니다.
$ ./pmem -h
linpmem 드라이버용 명령줄 클라이언트
사용법: pmem [옵션] [명령]
명령:
insmod linpmem 드라이버 로드
help 이 메시지 또는 지정된 하위 명령의 도움말 출력
옵션:
-a, --address <주소> 물리 읽기 작업의 주소
-v, --virt-address <가상_주소> 대상 프로세스 주소 공간에서 주소 변환 (기본값: 현재 프로세스)
-s, --size <크기> 버퍼 읽기 작업의 크기
-m, --mode <모드> 읽기 작업의 액세스 모드 [가능한 값: byte, word, dword, qword, buffer]
-p, --pid <PID> cr3 정보 및 가상-물리 변환의 대상 프로세스
--cr3 대상 프로세스의 cr3 값 조회 (기본값: 현재 프로세스)
--verbose 디버그 출력 표시
-h, --help 도움말 출력 ('--help'로 더 많은 정보 보기)
-V, --version 버전 출력
CLI 도구를 직접 컴파일하려면 해당 디렉터리로 이동하여 (CLI) Readme의 지침에 따라 빌드하십시오. 그렇지 않으면 사전 빌드된 프로그램을 다운로드하면 모든 Linux에서 작동합니다. CLI 도구로 커널 드라이버를 로드하려면:
# pmem insmod path/to/linpmem.ko
pmem 도구를 사용하여 드라이버를 로드하면 장치 파일을 직접 만들 필요가 없으며 (다음 릴리스에서는) linpmem 장치의 소유자를 선택할 수 있습니다.
pmem 명령줄 인터페이스는 드라이버와 인터페이스하는 API를 노출하는 작은 Rust 라이브러리의 얇은 래퍼일 뿐입니다. 고급 사용자는 이 라이브러리를 사용할 수도 있습니다. 라이브러리는 https://github.com/vobst/linpmem-cli에서 컴파일할 때 pmem CLI 도구와 함께 자동으로 컴파일되지만 (사전 컴파일된 상태로) 여기에도 (서명된 상태로) 포함되어 있습니다. 참고: 이것은 예비 버전이며, 곧 더 많은 기능이 추가될 예정입니다.
사용자 모드 라이브러리를 사용하지 않고 직접 드라이버와 인터페이스하려면 ./userspace_interface/linpmem_shared.h에서 사용자 공간 API/인터페이스 및 문서를 찾을 수 있습니다. 또한 demo/test.c에서 드라이버를 직접 사용하는 방법을 설명하는 예제 코드를 제공합니다.
LinPyMem: linpmem 드라이버용 Python 래퍼. PyPI에서 사용 가능.
아직 구현되지 않았습니다.
모듈을 로드할 때 시스템이 다음과 같은 오류 메시지를 보고하면 Secure Boot 때문일 수 있습니다:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
모듈을 로드하는 방법은 여러 가지가 있습니다. 가장 확실한 방법은 UEFI 설정에서 Secure Boot를 비활성화하는 것입니다.
배포판에서 지원하는 경우 모듈을 사용하기 전에 서명하는 것이 더 우아한 해결책입니다. 다음 단계를 따라 수행할 수 있습니다 (Ubuntu 20.04에서 테스트됨).
$ sudo apt install mokutil
$ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
그러면 모듈을 로드할 수 있습니다.
포렌식 준비 관점에서 볼 때, 위 과정에서 시스템이 두 번 재부팅되어 메모리의 휘발성 데이터 대부분이 파괴되므로 필요한 이전에 서명된 모듈을 준비해야 합니다.
(문제가 발생하면 잠재적인 문제를 보고해 주십시오.)
Linpmem과 Winpmem은 (현재 종료된) REKALL 프로젝트의 선배들의 작업이 없었다면 존재하지 않았을 것입니다: https://github.com/google/rekall.
오픈 소스 기여자: