
Pilote du noyau Linux pour l'acquisition de la mémoire physique, permettant un accès en lecture à toute adresse physique, y compris la mémoire réservée et les trous mémoire, avec les informations CR3 et les services de traduction virtuelle à physique.

Comme son homologue Windows, Winpmem, il ne s'agit pas d'un vidage mémoire traditionnel. Linpmem offre une API pour lire depuis n'importe quelle adresse physique, y compris la mémoire réservée et les trous mémoire, mais il peut également être utilisé pour un vidage mémoire normal. De plus, le pilote propose différents modes d'accès pour lire la mémoire physique, tels que les modes octet, mot, double mot, quadruple mot et tampon, ce dernier étant approprié dans la plupart des cas standards. Si la lecture nécessite une lecture alignée en octet/mot/double mot/quadruple mot, Linpmem le fera précisément.
Actuellement, Linpmem propose :
Le contrôle du cache sera ajouté à l'avenir pour prendre en charge les modes d'accès spécialisés.
Pour l'instant, vous devez compiler vous-même le pilote Linpmem. Une méthode pour charger un pilote Linpmem précompilé sur d'autres systèmes Linux est en cours de développement, mais pas encore terminée. Cela dit, compiler le pilote Linpmem n'est pas difficile, il suffit d'exécuter make.
Vous avez besoin de make et d'un compilateur C. (Nous recommandons gcc, mais clang devrait fonctionner aussi.)
Assurez-vous d'avoir installé les linux-headers (en utilisant le gestionnaire de paquets de votre distribution Linux cible). Le nom exact du paquet peut varier selon votre distribution.
Un moyen rapide (indépendant de la distribution) de vérifier si vous avez le paquet installé :
ls -l /usr/lib/modules/`uname -r`/
C'est tout, vous pouvez passer à l'étape 2.
Système étranger : Actuellement, si vous voulez compiler le pilote pour un autre système (par exemple parce que vous voulez créer un vidage mémoire mais ne pouvez pas compiler sur la cible), vous devez télécharger le paquet d'en-têtes directement depuis les dépôts de la distribution Linux de ce système. Vérifiez doublement que la version du paquet correspond exactement à la version du noyau et de la version exécutée sur le système étranger. Si l'autre système utilise un noyau compilé manuellement, vous devez obtenir une copie du répertoire de construction de ce noyau. Ensuite, placez le chemin de l'un ou l'autre répertoire dans la variable d'environnement KDIR.
export KDIR=chemin/vers/le/paquet/d'en-têtes/extrait/ou/racine/du/noyau
Compiler le pilote est simple, tapez simplement :
make
Cela devrait produire linpmem.ko dans le répertoire de travail courant.
Vous voudrez peut-être vérifier precompiler.h avant et choisir de compiler pour la release ou le debug (par exemple avec des impressions de debug). Il n'y a pas beaucoup d'autres paramètres de précompilation pour le moment.
Le module linpmem.ko peut être chargé en utilisant insmod chemin-vers-linpmem.ko, et déchargé avec rmmod chemin-vers-linpmem.ko. (Cela chargera le pilote uniquement pour cette session.) Si vous avez compilé pour le debug, regardez aussi dmesg.
Après le chargement, pour communiquer avec le pilote, vous devez créer le périphérique :
mknod /dev/linpmem c 42 0
Si vous ne pouvez pas parler au pilote, vérifiez éventuellement dans le journal dmesg que '42' était bien le majeur enregistré :
[12827.900168] linpmem: registered chrdev with major 42
Cependant, généralement le noyau essaiera d'attribuer ce nombre.
Vous pouvez utiliser chown sur le périphérique pour le donner à votre utilisateur, si vous ne voulez pas garder une console root ouverte en permanence. (Ou continuez simplement à l'utiliser dans une console root.)
Un exemple de code démontrant et expliquant (en détail) comment interagir avec le pilote est fourni. La référence de l'API espace utilisateur se trouve en outre dans ./userspace_interface/linpmem_shared.h.
Ce code est important si vous voulez comprendre comment interagir directement avec le pilote au lieu d'utiliser une bibliothèque. Il peut également être utilisé comme un test de fonctionnalité court.
Il existe un outil en ligne de commande (optionnel) de base pour Linpmem, l'outil CLI pmem. Il se trouve ici : https://github.com/vobst/linpmem-cli. Outre le code source, il existe également un outil CLI précompilé ainsi que la bibliothèque statique précompilée et les en-têtes que l'on peut trouver ici (signés). Remarque : ceci est une version préliminaire, vérifiez les mises à jour car de nombreux ajouts et améliorations suivront bientôt.
L'outil CLI pmem peut être utilisé pour tester les différentes fonctions de Linpmem de manière (relativement) sûre et pratique. Linpmem peut également être chargé par cet outil au lieu d'utiliser insmod/rmmod, avec quelques options supplémentaires à l'avenir. Cela a aussi l'avantage que pmem crée automatiquement le bon périphérique pour vous pour une utilisation immédiate. Il est extrêmement portable et fonctionne sur n'importe quel système Linux (et a en fait été testé même sur un Linux 2.6).
$ ./pmem -h
Client en ligne de commande pour le pilote linpmem
Utilisation : pmem [OPTIONS] [COMMANDE]
Commandes :
insmod Charger le pilote linpmem
help Afficher ce message ou l'aide de la sous-commande donnée
Options :
-a, --address <ADRESSE> Adresse pour les opérations de lecture physique
-v, --virt-address <VIRT_ADRESSE> Traduire l'adresse dans l'espace d'adressage du processus cible (défaut : processus courant)
-s, --size <TAILLE> Taille des opérations de lecture tampon
-m, --mode <MODE> Mode d'accès pour les opérations de lecture [valeurs possibles : byte, word, dword, qword, buffer]
-p, --pid <PID> Processus cible pour les informations cr3 et les traductions virtuel-vers-physique
--cr3 Interroger la valeur cr3 du processus cible (défaut : processus courant)
--verbose Afficher les sorties de debug
-h, --help Afficher l'aide (voir plus avec '--help')
-V, --version Afficher la version
Si vous voulez compiler l'outil CLI vous-même, placez-vous dans son répertoire et suivez les instructions du Readme (de la CLI) pour le construire. Sinon, téléchargez simplement le programme préconstruit, il devrait fonctionner sur n'importe quel Linux. Pour charger le pilote noyau avec l'outil CLI :
# pmem insmod chemin/vers/linpmem.ko
L'avantage d'utiliser l'outil pmem pour charger le pilote est que vous n'avez pas à créer le fichier de périphérique vous-même, et il proposera (dans les prochaines versions) de choisir qui possède le périphérique linpmem.
L'interface en ligne de commande pmem n'est qu'une fine couche autour d'une petite bibliothèque Rust qui expose une API pour interagir avec le pilote. Les utilisateurs plus avancés peuvent également utiliser cette bibliothèque. La bibliothèque est automatiquement compilée (comme bibliothèque portable statique) avec l'outil CLI pmem lors de la compilation depuis https://github.com/vobst/linpmem-cli, mais aussi incluse (précompilée) ici (signée). Remarque : ceci est une version préliminaire, d'autres suivront bientôt.
Si vous ne voulez pas utiliser la bibliothèque espace utilisateur et préférez interfacer vous-même directement avec le pilote, vous trouverez son API/interface espace utilisateur et sa documentation dans ./userspace_interface/linpmem_shared.h. Nous fournissons également un exemple de code dans demo/test.c qui explique comment utiliser le pilote directement.
LinPyMem : Un wrapper Python pour le pilote linpmem. Disponible sur PyPI.
Pas encore implémenté.
Si le système signale le message d'erreur suivant lors du chargement du module, cela peut être dû au Secure Boot :
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
Il existe différentes façons de charger le module malgré tout. La plus évidente est de désactiver le Secure Boot dans les paramètres UEFI.
Si votre distribution le supporte, une solution plus élégante consiste à signer le module avant de l'utiliser. Cela peut être fait en suivant les étapes suivantes (testé sur 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=Un nom descriptif/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 chemin/vers/mok-signing.key chemin/vers/mok-signing.crt chemin/vers/linpmem.ko
Après cela, vous devriez pouvoir charger le module.
Notez que d'un point de vue de préparation forensique, vous devriez préparer un module signé avant d'en avoir besoin, car le système redémarrera deux fois au cours du processus décrit ci-dessus, détruisant la plupart de vos données volatiles en mémoire.
(Veuillez signaler tout problème potentiel si vous en rencontrez.)
Linpmem, ainsi que Winpmem, n'existeraient pas sans le travail de nos prédécesseurs du projet REKALL (désormais retiré) : https://github.com/google/rekall.
Nos contributeurs open source :