
Controlador del kernel de Linux para la adquisición de memoria física, que permite acceso de lectura a cualquier dirección física, incluyendo memoria reservada y agujeros de memoria, con información de CR3 y servicios de traducción de virtual a físico.

Al igual que su contraparte de Windows, Winpmem, esta no es una herramienta tradicional de volcado de memoria. Linpmem ofrece una API para leer desde cualquier dirección física, incluyendo memoria reservada y agujeros de memoria, pero también se puede usar para volcado de memoria normal. Además, el controlador ofrece una variedad de modos de acceso para leer memoria física, como modo de acceso byte, word, dword, qword y buffer, donde el modo de acceso buffer es apropiado en la mayoría de los casos estándar. Si la lectura requiere una lectura alineada de byte/word/dword/qword, Linpmem hará precisamente eso.
Actualmente, las características de Linpmem son:
El Control de Caché se agregará en el futuro para soportar los modos de acceso de lectura especializados.
Al menos por ahora, debes compilar el controlador Linpmem tú mismo. Un método para cargar un controlador Linpmem precompilado en otros sistemas Linux está actualmente en desarrollo, pero aún no está terminado. Dicho esto, compilar el controlador Linpmem no es difícil, básicamente es ejecutar 'make'.
Necesitas make y un compilador de C. (Recomendamos gcc, pero clang también debería funcionar).
Asegúrate de tener linux-headers instalado (usando el gestor de paquetes que tenga tu distribución de Linux). El nombre exacto del paquete puede variar según tu distribución.
Una forma rápida (independiente de la distribución) de verificar si tienes el paquete instalado:
ls -l /usr/lib/modules/`uname -r`/
Eso es todo, puedes proceder al paso 2.
Sistema externo: Actualmente, si deseas compilar el controlador para otro sistema, por ejemplo, porque quieres crear un volcado de memoria pero no puedes compilar en el destino, debes descargar el paquete de encabezados directamente desde los repositorios de paquetes de la distribución de Linux de ese sistema. Verifica que la versión del paquete coincida exactamente con la versión de lanzamiento y kernel que se ejecuta en el sistema externo. Si el otro sistema utiliza un kernel compilado por uno mismo, debes obtener una copia del directorio de compilación de ese kernel. Luego, coloca la ubicación de cualquiera de los directorios en la variable de entorno KDIR.
export KDIR=path/to/extracted/header/package/or/kernel/root
Compilar el controlador es simple, solo escribe:
make
Esto debería producir linpmem.ko en el directorio de trabajo actual.
Es posible que desees revisar precompiler.h antes y elegir si compilar para lanzamiento o depuración (por ejemplo, con impresión de depuración). No hay muchas otras configuraciones de precompilador en este momento.
El módulo linpmem.ko se puede cargar usando insmod path-to-linpmem.ko, y descargar con rmmod path-to-linpmem.ko. (Esto cargará el controlador solo para este tiempo de actividad). Si compilaste para depuración, echa un vistazo a dmesg.
Después de cargar, para comunicarte con el controlador, necesitas crear el dispositivo:
mknod /dev/linpmem c 42 0
Si no puedes comunicarte con el controlador, potencialmente verifica en el registro de dmesg para confirmar que '42' fue efectivamente el major registrado:
[12827.900168] linpmem: registered chrdev with major 42
Aunque normalmente el kernel intentaría asignar este número realmente.
Puedes usar chown en el dispositivo para asignarlo a tu usuario, si no quieres tener una consola de root abierta todo el tiempo. (O simplemente sigue usándola en una consola de root).
Hay un código de ejemplo que demuestra y explica (en detalle) cómo interactuar con el controlador. La referencia de la API de espacio de usuario también se puede encontrar en ./userspace_interface/linpmem_shared.h.
Este código es importante si quieres entender cómo interactuar directamente con el controlador en lugar de usar una biblioteca. También se puede usar como una prueba de función breve.
Hay una herramienta de línea de comandos básica (opcional) para Linpmem, la herramienta CLI pmem. Se puede encontrar aquí: https://github.com/vobst/linpmem-cli. Además del código fuente, también hay una herramienta CLI precompilada, así como la biblioteca estática precompilada y los encabezados que se pueden encontrar aquí (firmados). Nota: esta es una versión preliminar, asegúrate de buscar actualizaciones, ya que muchas adiciones y mejoras seguirán pronto.
La herramienta CLI pmem se puede usar para probar las diversas funciones de Linpmem de una manera (relativamente) segura y conveniente. Linpmem también puede ser cargado por esta herramienta en lugar de usar insmod/rmmod, con algunas opciones adicionales en el futuro. Esto también tiene la ventaja de que pmem crea automáticamente el dispositivo correcto para uso inmediato. Es extremadamente portátil y se ejecuta en cualquier sistema Linux (y, de hecho, se ha probado incluso en un Linux 2.6).
$ ./pmem -h
Command-line client for the linpmem driver
Usage: pmem [OPTIONS] [COMMAND]
Commands:
insmod Load the linpmem driver
help Print this message or the help of the given subcommand(s)
Options:
-a, --address <ADDRESS> Address for physical read operations
-v, --virt-address <VIRT_ADDRESS> Translate address in target process' address space (default: current process)
-s, --size <SIZE> Size of buffer read operations
-m, --mode <MODE> Access mode for read operations [possible values: byte, word, dword, qword, buffer]
-p, --pid <PID> Target process for cr3 info and virtual-to-physical translations
--cr3 Query cr3 value of target process (default: current process)
--verbose Display debug output
-h, --help Print help (see more with '--help')
-V, --version Print version
Si deseas compilar la herramienta cli tú mismo, cambia a su directorio y sigue las instrucciones en el Readme (cli) para compilarlo. De lo contrario, simplemente descarga el programa precompilado, debería funcionar en cualquier Linux. Para cargar el controlador del kernel con la herramienta cli:
# pmem insmod path/to/linpmem.ko
La ventaja de usar la herramienta pmem para cargar el controlador es que no tienes que crear el archivo de dispositivo tú mismo, y ofrecerá (en las próximas versiones) elegir quién es el propietario del dispositivo linpmem.
La interfaz de línea de comandos pmem es solo un envoltorio ligero alrededor de una pequeña biblioteca Rust que expone una API para interactuar con el controlador. Los usuarios más avanzados también pueden usar esta biblioteca. La biblioteca se compila automáticamente (como biblioteca estática portátil) junto con la herramienta cli pmem al compilar desde https://github.com/vobst/linpmem-cli, pero también se incluye (precompilada) aquí (firmada). Nota: esta es una versión preliminar, más por venir pronto.
Si no deseas usar la biblioteca en modo usuario y prefieres interactuar con el controlador directamente por tu cuenta, puedes encontrar su API/interfaz de espacio de usuario y documentación en ./userspace_interface/linpmem_shared.h. También proporcionamos código de ejemplo en demo/test.c que explica cómo usar el controlador directamente.
LinPyMem: Un wrapper de Python para el controlador linpmem. Disponible en PyPI.
Aún no implementada.
Si el sistema reporta el siguiente mensaje de error al cargar el módulo, podría deberse a Secure Boot:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
Hay diferentes formas de cargar el módulo de todas formas. La más obvia es deshabilitar Secure Boot en la configuración de UEFI.
Si tu distribución lo soporta, una solución más elegante sería firmar el módulo antes de usarlo. Esto se puede hacer siguiendo los siguientes pasos (probado en 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
Después de eso, deberías poder cargar el módulo.
Ten en cuenta que, desde una perspectiva de preparación forense, debes preparar un módulo firmado antes de necesitarlo, ya que el sistema se reiniciará dos veces durante el proceso descrito anteriormente, destruyendo la mayoría de tus datos volátiles en la memoria.
(Por favor, reporta posibles problemas si encuentras algo.)
Linpmem, así como Winpmem, no existirían sin el trabajo de nuestros predecesores del proyecto REKALL (ahora retirado): https://github.com/google/rekall.
Nuestros contribuyentes de código abierto: