
Linux-Kernel-Treiber zur Erfassung des physischen Speichers, der Lesezugriff auf jede physische Adresse ermöglicht, einschließlich reserviertem Speicher und Speicherlücken, mit CR3-Informationen und Diensten zur virtuell-physischen Adressübersetzung.

Wie sein Windows-Pendant Winpmem ist dies kein traditioneller Memory-Dumper. Linpmem bietet eine API zum Lesen von jeder physischen Adresse, einschließlich reserviertem Speicher und Speicherlöchern, kann aber auch für normales Speicher-Dumping verwendet werden. Darüber hinaus bietet der Treiber eine Vielzahl von Zugriffsmodi zum Lesen des physischen Arbeitsspeichers, wie Byte-, Word-, Dword-, Qword- und Puffer-Zugriffsmodus, wobei der Puffer-Zugriffsmodus in den meisten Standardfällen geeignet ist. Wenn das Lesen einen ausgerichteten Byte-/Word-/Dword-/Qword-Lesezugriff erfordert, führt Linpmem genau das aus.
Derzeit bietet Linpmem folgende Funktionen:
Cache Control wird in Zukunft hinzugefügt, um die spezialisierten Lesezugriffsmodi zu unterstützen.
Zumindest vorerst müssen Sie den Linpmem-Treiber selbst kompilieren. Eine Methode zum Laden eines vorkompilierten Linpmem-Treibers auf anderen Linux-Systemen befindet sich derzeit in Arbeit, ist aber noch nicht abgeschlossen. Das Kompilieren des Linpmem-Treibers ist dennoch nicht schwierig, im Grunde genügt die Ausführung von 'make'.
Sie benötigen make und einen C-Compiler (wir empfehlen gcc, aber clang sollte auch funktionieren).
Stellen Sie sicher, dass die linux-headers installiert sind (mit dem Paketmanager Ihrer Ziel-Linux-Distribution). Der genaue Paketname kann je nach Distribution variieren. Eine schnelle (distributionsunabhängige) Methode, um zu überprüfen, ob das Paket installiert ist:
ls -l /usr/lib/modules/`uname -r`/
Das war's, Sie können mit Schritt 2 fortfahren.
Fremdsystem: Derzeit müssen Sie, wenn Sie den Treiber für ein anderes System kompilieren möchten, z. B. weil Sie einen Speicherabbild erstellen möchten, aber auf dem Zielsystem nicht kompilieren können, das Header-Paket direkt aus den Paketquellen der Linux-Distribution dieses Systems herunterladen. Überprüfen Sie unbedingt, ob die Paketversion exakt mit der auf dem Fremdsystem laufenden Release- und Kernelversion übereinstimmt. Falls das andere System einen selbst kompilierten Kernel verwendet, müssen Sie eine Kopie des Build-Verzeichnisses dieses Kernels besorgen. Legen Sie dann den Pfad zu einem dieser Verzeichnisse in der Umgebungsvariablen KDIR fest.
export KDIR=path/to/extracted/header/package/or/kernel/root
Das Kompilieren des Treibers ist einfach, geben Sie einfach ein:
make
Dies sollte linpmem.ko im aktuellen Arbeitsverzeichnis erzeugen.
Sie sollten vorher precompiler.h überprüfen und wählen, ob Sie für Release oder Debug kompilieren möchten (z. B. mit Debug-Ausgabe). Es gibt derzeit nicht viele andere Precompiler-Einstellungen.
Das Modul linpmem.ko kann mit insmod path-to-linpmem.ko geladen und mit rmmod path-to-linpmem.ko entladen werden. (Dadurch wird der Treiber nur für diese Betriebszeit geladen.) Wenn Sie für Debug kompiliert haben, werfen Sie auch einen Blick auf dmesg.
Nach dem Laden müssen Sie das Gerät erstellen, um mit dem Treiber zu kommunizieren:
mknod /dev/linpmem c 42 0
Wenn Sie nicht mit dem Treiber kommunizieren können, überprüfen Sie ggf. im dmesg-Protokoll, ob '42' tatsächlich die registrierte Major-Nummer ist:
[12827.900168] linpmem: registered chrdev with major 42
Normalerweise versucht der Kernel jedoch, diese Nummer tatsächlich zuzuweisen.
Sie können chown auf dem Gerät verwenden, um es Ihrem Benutzer zu geben, wenn Sie nicht ständig eine Root-Konsole offen halten möchten. (Oder verwenden Sie sie einfach weiter in einer Root-Konsole.)
Es gibt einen Beispielcode, der detailliert zeigt und erklärt, wie mit dem Treiber interagiert wird. Die Referenz für die Benutzerraum-API finden Sie außerdem in ./userspace_interface/linpmem_shared.h.
Dieser Code ist wichtig, wenn Sie verstehen möchten, wie Sie direkt mit dem Treiber interagieren, anstatt eine Bibliothek zu verwenden. Er kann auch als kurzer Funktionstest verwendet werden.
Es gibt ein (optionales) grundlegendes Kommandozeilen-Tool für Linpmem, das pmem CLI-Tool. Es ist hier zu finden: https://github.com/vobst/linpmem-cli. Neben dem Quellcode gibt es auch ein vorkompiliertes CLI-Tool sowie die vorkompilierte statische Bibliothek und Header, die hier (signiert) zu finden sind. Hinweis: Dies ist eine vorläufige Version, überprüfen Sie unbedingt auf Updates, da bald viele Ergänzungen und Verbesserungen folgen werden.
Das pmem CLI-Tool kann zum Testen der verschiedenen Funktionen von Linpmem auf eine (relativ) sichere und bequeme Weise verwendet werden. Linpmem kann auch mit diesem Tool anstatt mit insmod/rmmod geladen werden, mit einigen zusätzlichen Optionen in Zukunft. Dies hat auch den Vorteil, dass pmem automatisch das richtige Gerät für die sofortige Nutzung erstellt. Es ist extrem portabel und läuft auf jedem Linux-System (und wurde tatsächlich sogar auf einem Linux 2.6 getestet).
$ ./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
Wenn Sie das CLI-Tool selbst kompilieren möchten, wechseln Sie in dessen Verzeichnis und befolgen Sie die Anweisungen in der (CLI-)Readme, um es zu bauen. Andernfalls laden Sie einfach das vorgefertigte Programm herunter, es sollte auf jedem Linux funktionieren. Um den Kernel-Treiber mit dem CLI-Tool zu laden:
# pmem insmod path/to/linpmem.ko
Der Vorteil der Verwendung des pmem-Tools zum Laden des Treibers besteht darin, dass Sie die Gerätedatei nicht selbst erstellen müssen, und es wird (in den nächsten Versionen) anbieten, zu wählen, wem das linpmem-Gerät gehört.
Das pmem-Kommandozeilen-Tool ist nur ein dünner Wrapper um eine kleine Rust-Bibliothek, die eine API für die Schnittstelle zum Treiber bereitstellt. Fortgeschrittene Benutzer können diese Bibliothek ebenfalls verwenden. Die Bibliothek wird beim Kompilieren von https://github.com/vobst/linpmem-cli automatisch (als statische portable Bibliothek) zusammen mit dem pmem CLI-Tool kompiliert, aber auch (vorkompiliert) hier (signiert) beigelegt. Hinweis: Dies ist eine vorläufige Version, weitere werden bald folgen.
Wenn Sie die Benutzermodus-Bibliothek nicht verwenden und lieber direkt mit dem Treiber interagieren möchten, finden Sie die Benutzerraum-API/Schnittstelle und Dokumentation in ./userspace_interface/linpmem_shared.h. Wir stellen auch Beispielcode in demo/test.c zur Verfügung, der erklärt, wie man den Treiber direkt verwendet.
LinPyMem: Ein Python-Wrapper für den linpmem-Treiber. Verfügbar auf PyPI.
Noch nicht implementiert.
Wenn das System beim Laden des Moduls die folgende Fehlermeldung anzeigt, könnte dies an Secure Boot liegen:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
Es gibt verschiedene Möglichkeiten, das Modul dennoch zu laden. Die offensichtlichste ist, Secure Boot in Ihren UEFI-Einstellungen zu deaktivieren.
Wenn Ihre Distribution dies unterstützt, wäre eine elegantere Lösung, das Modul vor der Verwendung zu signieren. Dies kann mit den folgenden Schritten durchgeführt werden (getestet auf 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
Danach sollten Sie das Modul laden können.
Beachten Sie, dass Sie aus forensischer Bereitschaftsperspektive ein signiertes Modul vorbereiten sollten, bevor Sie es benötigen, da das System während des oben beschriebenen Vorgangs zweimal neu startet und dabei die meisten Ihrer flüchtigen Daten im Arbeitsspeicher zerstört.
(Bitte melden Sie potenzielle Probleme, falls Ihnen etwas auffällt.)
Linpmem sowie Winpmem wären ohne die Arbeit unserer Vorgänger des (inzwischen eingestellten) REKALL-Projekts nicht möglich: https://github.com/google/rekall.
Unsere Open-Source-Mitwirkenden: