ExécutionRéseauAnti-forensique
Artefacts live de /proc : processus, sockets, suppressions
Le pseudo-système /proc d'un hôte Linux live : lignes de commande, environnement, fichiers ouverts, mappages mémoire, sockets et binaires supprimés.
- Emplacement
- /proc/<pid>/
- Prouve
- Ce qui s'exécute en ce moment, depuis quel binaire, avec quels arguments, fichiers et connexions réseau
- Horodatages
- Aucun horodatage de fichier utile ; heure de démarrage du processus en ticks d'horloge depuis le boot (/proc/<pid>/stat champ 22)
- Accès
- root pour voir exe, environ, fd et maps de tous les processus ; les autres utilisateurs ne voient que les leurs
- Rétention
- Volatile : disparaît à la fin du processus ou au redémarrage
- Collecte
- UAC, Velociraptor, cp, AVML
Outils
Comparer tous les outils- psCLI · intégré à Linux
- ssCLI · intégré à Linux
- lsofCLI · intégré à Linux
- VelociraptorPlateforme · open source
- Volatility 3CLI · open source
Ce que c'est
/proc est un pseudo-système de fichiers généré à la demande par le noyau. Rien n'y est stocké sur disque : chaque lecture interroge le noyau sur l'état courant d'un processus, d'une table de sockets ou d'un sous-système du noyau. Sur un système live, c'est le moyen le plus rapide de voir ce qui tourne, d'où vient chaque processus et avec quoi il communique, et il résiste à certaines astuces anti-forensiques qui mettent en échec l'analyse du disque, comme un binaire supprimé après son lancement.
Comme il s'agit d'un état live, /proc se situe tout en haut de l'ordre de volatilité : collectez-le avant toute action qui modifie le système, idéalement en même temps qu'une image mémoire.
Où il se trouve
| Chemin | Contenu |
|---|---|
/proc/<pid>/exe | Lien symbolique vers l'exécutable ; lisible (et copiable) même si le fichier a été supprimé |
/proc/<pid>/cmdline | Arguments, séparés par des NUL |
/proc/<pid>/environ | Environnement initial, séparé par des NUL (root ou même utilisateur) |
/proc/<pid>/cwd, /proc/<pid>/root | Répertoire de travail courant et répertoire racine (révèle un chroot ou la racine d'un conteneur) |
/proc/<pid>/fd/ | Un lien symbolique par descripteur de fichier ouvert : fichiers, socket:[inode], pipe:[inode], anon_inode: |
/proc/<pid>/maps | Mappages mémoire avec le chemin du fichier sous-jacent, marqués (deleted) quand le fichier a disparu |
/proc/<pid>/status | Nom, état, PPid, Uid/Gid (réel, effectif, sauvegardé, fs), capacités |
/proc/<pid>/stat | Enregistrement du processus sur une ligne ; champ 22 starttime |
/proc/<pid>/comm | Nom court (16 octets au maximum), modifiable par le processus lui-même |
/proc/net/tcp, tcp6, udp, udp6, unix | Tables de sockets avec adresses en hexadécimal et numéros d'inode de socket |
/proc/modules | Modules noyau chargés (mêmes données que lsmod) |
/proc/mounts | Montages courants de l'espace de noms de montage du processus lecteur |
/proc/sys/kernel/tainted | Indicateurs de corruption (taint) du noyau |
Les chemins sont identiques d'une distribution à l'autre. Sur les systèmes où /proc est monté avec hidepid=, les utilisateurs non root ne voient pas les processus des autres utilisateurs.
Ce qu'il prouve
- Quels processus existent en ce moment, leur arborescence parent-enfant, leurs identifiants d'utilisateur et de groupe, et leurs arguments.
- Quel binaire se trouve derrière chaque processus, même après suppression (
exe -> /path (deleted)), et permet de récupérer ce binaire. - L'exécution sans fichier : un
exepointant vers/memfd:<name> (deleted)montre un programme lancé depuis un fichier mémoire anonyme créé avecmemfd_create. - Quels fichiers, sockets et pipes chaque processus garde ouverts ; à quelles adresses distantes il est connecté (en joignant les numéros d'inode de
/proc/net/*aux liens defd/). - Les variables d'environnement comme
LD_PRELOAD,HISTFILEou les réglages de proxy transmis à un processus. - Non prouvé : quoi que ce soit sur les processus déjà terminés. Un rootkit noyau peut aussi filtrer ce qu'affiche
/proc: comparez avec l'analyse mémoire.
Champs clés
| Champ | Où | Signification |
|---|---|---|
PPid | status | PID du parent |
Uid, Gid | status | Identifiants réel, effectif, sauvegardé et du système de fichiers |
CapEff | status | Masque des capacités effectives |
starttime | stat champ 22 | Heure de démarrage en ticks d'horloge après le boot |
suffixe (deleted) | liens exe, maps, fd/* | Le fichier sous-jacent a été délié |
local_address, rem_address, st, uid, inode | /proc/net/tcp | Paires IP:port en hexadécimal, état TCP (0A = LISTEN, 01 = ESTABLISHED), UID propriétaire, inode du socket |
Horodatages
Les fichiers sous /proc affichent l'heure à laquelle le noyau a créé l'inode pour le lecteur, et non le démarrage du processus : n'utilisez donc pas les heures de ls -l. Convertissez plutôt starttime : divisez par la fréquence des ticks d'horloge (getconf CLK_TCK, généralement 100) et ajoutez l'heure de démarrage du système (btime dans /proc/stat, secondes Unix UTC).
pid=1234
st=$(awk '{print $22}' /proc/$pid/stat) # safe unless comm contains spaces
btime=$(awk '/^btime/{print $2}' /proc/stat)
date -u -d @$(( btime + st / $(getconf CLK_TCK) ))
ps -o lstart= -p <pid> donne la même valeur en heure locale.
Rétention
Aucune. Les entrées disparaissent à la fin du processus, et tout /proc est reconstruit au démarrage. Capturez-le avant toute action de confinement comme tuer des processus, redémarrer des services ou isoler le réseau (ce qui coupe les connexions).
Collecte
- UAC : les artefacts de réponse live enregistrent les listes de processus, les liens
/proc/<pid>, les fichiers ouverts et/proc/modules; son artefactlive_response/process/deleted.yamlcopie le binaire de tout processus dont l'exécutable apparaît comme(deleted)(20 premiers Mo), ainsi que les fichiers supprimés que ces processus gardent ouverts. - Velociraptor :
Linux.Sys.Pslist,Linux.Sys.Maps,Linux.Network.Netstatet artefacts apparentés sur un parc. - Manuellement, avec des binaires de confiance :
# recover a deleted or memfd binary before the process ends
cp /proc/1234/exe /cases/host01/pid1234.bin && sha256sum /cases/host01/pid1234.bin
tr '\0' ' ' < /proc/1234/cmdline; echo
tr '\0' '\n' < /proc/1234/environ
ls -l /proc/1234/fd /proc/1234/cwd
ls -l /proc/[0-9]*/exe 2>/dev/null | grep -E '\(deleted\)|memfd:'
Réalisez aussi une image mémoire (voir LiME et AVML) : /proc répond à « que se passe-t-il maintenant », la mémoire permet de reposer la question plus tard.
Analyse
ps -eo pid,ppid,user,lstart,args --forest, ss -tanp, ss -xp et lsof -nP lisent /proc pour vous. Sur une image mémoire, Volatility 3 reconstitue la même vue hors ligne avec linux.pslist, linux.pstree, linux.psaux, linux.envars, linux.lsof, linux.proc.Maps et linux.sockstat.
Conseils d'investigation
- Un processus dont l'
exeest(deleted)oumemfd:est une découverte prioritaire : des cas légitimes existent (mises à jour de paquets remplaçant un binaire en cours d'exécution), mais vérifiez d'abord l'historique des paquets. commetargv[0]peuvent être modifiés par le processus ; fiez-vous plutôt àexeet aux fichiers mappés.- Les processus dont le
cwdse trouve dans /tmp, /var/tmp ou /dev/shm méritent un examen. - Comparez la liste des PID de
/procavec la sortie depset avec la mémoire : une incohérence suggère un hooking userland (ld.so.preload) ou un rootkit noyau (modules noyau). - Un lien
rootdifférent de/indique un chroot ou un conteneur ; associez-le à l'identifiant du conteneur avant de conclure (conteneurs). - Notez l'horloge : les heures de collecte live n'ont de sens que si l'heure et le fuseau horaire de l'hôte sont capturés au même moment.
Voir aussi
Artefacts liés
- Linux Memory Acquisition: LiME, AVML and /proc/kcoreAnglais
- /tmp, /var/tmp and /dev/shm: Linux Staging DirectoriesAnglais
- /etc/ld.so.preload et LD_PRELOAD : détournement du linker
- Linux Kernel Modules: lsmod, Taint Flags and Boot ConfigAnglais
- Docker, containerd and Podman Artifacts on Linux HostsAnglais