
Driver del kernel Linux per l'acquisizione di memoria fisica, che consente l'accesso in lettura a qualsiasi indirizzo fisico, inclusi memoria riservata e buchi di memoria, con informazioni CR3 e servizi di traduzione da virtuale a fisico.

Come la sua controparte Windows, Winpmem, non è uno strumento tradizionale di dump della memoria. Linpmem offre un'API per leggere da qualsiasi indirizzo fisico, inclusa la memoria riservata e i buchi di memoria, ma può essere utilizzato anche per il normale dump della memoria. Inoltre, il driver offre una varietà di modalità di accesso per leggere la memoria fisica, come le modalità byte, word, dword, qword e buffer, dove la modalità buffer è appropriata nella maggior parte dei casi standard. Se la lettura richiede una lettura allineata byte/word/dword/qword, Linpmem farà esattamente questo.
Attualmente, le funzionalità di Linpmem includono:
Il controllo della cache verrà aggiunto in futuro per supportare le modalità di accesso specializzate.
Almeno per ora, devi compilare il driver Linpmem da solo. È in lavorazione, ma non ancora terminato, un metodo per caricare un driver Linpmem precompilato su altri sistemi Linux. Detto questo, compilare il driver Linpmem non è difficile, sostanzialmente si esegue 'make'.
Hai bisogno di make e di un compilatore C. (Raccomandiamo gcc, ma anche clang dovrebbe funzionare).
Assicurati di avere installati i linux-headers (usando qualsiasi gestore di pacchetti abbia la tua distribuzione Linux di destinazione). Il nome esatto del pacchetto può variare a seconda della distribuzione.
Un modo rapido (indipendente dalla distribuzione) per verificare se hai il pacchetto installato:
ls -l /usr/lib/modules/`uname -r`/
Questo è tutto, puoi procedere al passo 2.
Sistema estraneo: Attualmente, se vuoi compilare il driver per un altro sistema, ad esempio perché vuoi creare un dump della memoria ma non puoi compilare sulla macchina di destinazione, devi scaricare il pacchetto header direttamente dai repository dei pacchetti della distribuzione Linux di quel sistema. Ricontrolla che la versione del pacchetto corrisponda esattamente alla versione della release e del kernel in esecuzione sul sistema estraneo. Se l'altro sistema utilizza un kernel auto-compilato, devi ottenere una copia della directory di compilazione di quel kernel. Quindi, imposta il percorso di una delle due directory nella variabile d'ambiente KDIR.
export KDIR=path/to/extracted/header/package/or/kernel/root
Compilare il driver è semplice, basta digitare:
make
Questo dovrebbe produrre linpmem.ko nella directory di lavoro corrente.
Potresti voler controllare precompiler.h prima e scegliere se compilare per release o debug (ad esempio, con stampa di debug). Al momento non ci sono molte altre impostazioni del precompilatore.
Il modulo linpmem.ko può essere caricato usando insmod path-to-linpmem.ko e rimosso con rmmod path-to-linpmem.ko. (Questo caricherà il driver solo per questa sessione di uptime.) Se hai compilato per debug, dai anche un'occhiata a dmesg.
Dopo il caricamento, per comunicare con il driver, devi creare il dispositivo:
mknod /dev/linpmem c 42 0
Se non riesci a comunicare con il driver, controlla potenzialmente il log di dmesg per verificare che '42' sia effettivamente il major registrato:
[12827.900168] linpmem: registered chrdev with major 42
Anche se di solito il kernel cerca di assegnare effettivamente questo numero.
Puoi usare chown sul dispositivo per darlo al tuo utente, se non vuoi tenere aperta una console di root tutto il tempo. (O usa semplicemente una console di root.)
C'è un codice di esempio che mostra e spiega (in dettaglio) come interagire con il driver. Il riferimento all'API user-space può essere trovato inoltre in ./userspace_interface/linpmem_shared.h.
Questo codice è importante se vuoi capire come interagire direttamente con il driver invece di usare una libreria. Può anche essere usato come un breve test di funzionalità.
C'è uno strumento da riga di comando (opzionale) per Linpmem, lo strumento CLI pmem. Si trova qui: https://github.com/vobst/linpmem-cli. Oltre al codice sorgente, sono disponibili anche uno strumento CLI precompilato, così come la libreria statica precompilata e gli header, che possono essere trovati qui (firmati). Nota: questa è una versione preliminare, controlla gli aggiornamenti, poiché molte aggiunte e migliorie seguiranno a breve.
Lo strumento CLI pmem può essere utilizzato per testare le varie funzioni di Linpmem in modo (relativamente) sicuro e comodo. Linpmem può anche essere caricato da questo strumento invece di usare insmod/rmmod, con alcune opzioni extra in futuro. Questo ha anche il vantaggio che pmem crea automaticamente il dispositivo giusto per te per un uso immediato. È estremamente portabile e funziona su qualsiasi sistema Linux (e, di fatto, è stato testato anche su un Linux 2.6).
$ ./pmem -h
Client da riga di comando per il driver linpmem
Utilizzo: pmem [OPZIONI] [COMANDO]
Comandi:
insmod Carica il driver linpmem
help Stampa questo messaggio o l'aiuto del sottocomando specificato
Opzioni:
-a, --address <INDIRIZZO> Indirizzo per operazioni di lettura fisica
-v, --virt-address <VIRT_ADDRESS> Traduci l'indirizzo nello spazio di indirizzi del processo di destinazione (predefinito: processo corrente)
-s, --size <DIMENSIONE> Dimensione delle operazioni di lettura buffer
-m, --mode <MODALITÀ> Modalità di accesso per le operazioni di lettura [valori possibili: byte, word, dword, qword, buffer]
-p, --pid <PID> Processo di destinazione per informazioni cr3 e traduzioni virtuale-fisica
--cr3 Interroga il valore cr3 del processo di destinazione (predefinito: processo corrente)
--verbose Mostra output di debug
-h, --help Stampa l'aiuto (vedi di più con '--help')
-V, --version Stampa la versione
Se vuoi compilare lo strumento CLI da solo, spostati nella sua directory e segui le istruzioni nel Readme (del CLI) per costruirlo. Altrimenti, scarica semplicemente il programma precompilato, dovrebbe funzionare su qualsiasi Linux. Per caricare il driver del kernel con lo strumento CLI:
# pmem insmod path/to/linpmem.ko
Il vantaggio di usare lo strumento pmem per caricare il driver è che non devi creare tu stesso il file del dispositivo e offrirà (nelle prossime release) di scegliere chi possiede il dispositivo linpmem.
Lo strumento da riga di comando pmem è solo un sottile wrapper attorno a una piccola libreria Rust che espone un'API per interfacciarsi con il driver. Gli utenti più avanzati possono anche usare questa libreria. La libreria viene compilata automaticamente (come libreria statica portabile) insieme allo strumento CLI pmem quando si compila da https://github.com/vobst/linpmem-cli, ma è anche inclusa (precompilata) qui (firmata). Nota: questa è una versione preliminare, ne seguiranno altre a breve.
Se non vuoi usare la libreria usermode e preferisci interfacciarti direttamente con il driver da solo, puoi trovare la sua API/interfaccia user-space e la documentazione in ./userspace_interface/linpmem_shared.h. Forniamo anche il codice di esempio in demo/test.c che spiega come usare il driver direttamente.
LinPyMem: Un wrapper Python per il driver linpmem. Disponibile su PyPI.
Non ancora implementato.
Se il sistema segnala il seguente messaggio di errore durante il caricamento del modulo, potrebbe essere a causa dell'avvio protetto:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
Ci sono diversi modi per caricare comunque il modulo. Quello ovvio è disabilitare l'avvio protetto nelle impostazioni UEFI.
Se la tua distribuzione lo supporta, una soluzione più elegante è firmare il modulo prima di utilizzarlo. Questo può essere fatto con i seguenti passaggi (testato su 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
Successivamente, dovresti essere in grado di caricare il modulo.
Tieni presente che, dal punto di vista della preparazione forense, dovresti preparare un modulo firmato prima di averne bisogno, poiché il sistema si riavvierà due volte durante il processo sopra descritto, distruggendo la maggior parte dei tuoi dati volatili in memoria.
(Per favore segnala eventuali problemi potenziali se ne incontri.)
Linpmem, così come Winpmem, non esisterebbero senza il lavoro dei nostri predecessori del (ora ritirato) progetto REKALL: https://github.com/google/rekall.
I nostri contributori open source: