Zum Inhalt springen

AusführungNetzwerkAnti-Forensik

/proc-Live-Artefakte: Prozesse, Sockets, gelöschte Dateien

Das Pseudo-Dateisystem /proc auf einem laufenden Linux-Host: Befehlszeilen, Umgebungen, offene Dateien, Memory Maps, Sockets und gelöschte Programme.

Speicherort
/proc/<pid>/
Belegt
Was gerade läuft, aus welcher Programmdatei, mit welchen Argumenten, Dateien und Netzwerkverbindungen
Zeitstempel
Keine verwertbaren Dateizeitstempel; Prozessstart in Clock Ticks seit dem Boot (/proc/<pid>/stat, Feld 22)
Zugriff
root, um exe, environ, fd und maps aller Prozesse zu sehen; andere Benutzer sehen nur ihre eigenen
Aufbewahrung
Flüchtig: weg bei Prozessende oder Neustart
Sicherung
UAC, Velociraptor, cp, AVML

Was es ist

/proc ist ein Pseudo-Dateisystem, das der Kernel bei Bedarf erzeugt. Nichts darin liegt auf der Platte: Jeder Lesezugriff fragt den Kernel nach dem aktuellen Zustand eines Prozesses, einer Socket-Tabelle oder eines Kernel-Subsystems. Auf einem laufenden System ist es der schnellste Weg zu sehen, was läuft, woher jeder Prozess stammt und mit wem er kommuniziert. Zudem übersteht es manche Anti-Forensik-Tricks, an denen die Plattenanalyse scheitert, etwa ein nach dem Start gelöschtes Programm.

Weil es sich um Live-Zustand handelt, steht /proc weit oben in der Order of Volatility: Sichern Sie es vor allem, was das System verändert, und idealerweise zusammen mit einem Speicherabbild.

Wo es liegt

PfadInhalt
/proc/<pid>/exeSymlink auf die Programmdatei; lesbar (und kopierbar), auch wenn die Datei gelöscht wurde
/proc/<pid>/cmdlineArgumente, durch NUL getrennt
/proc/<pid>/environAnfängliche Umgebung, durch NUL getrennt (root oder derselbe Benutzer)
/proc/<pid>/cwd, /proc/<pid>/rootAktuelles Arbeitsverzeichnis und Root-Verzeichnis (zeigt chroot oder Container-Root)
/proc/<pid>/fd/Ein Symlink pro offenem Dateideskriptor: Dateien, socket:[inode], pipe:[inode], anon_inode:
/proc/<pid>/mapsSpeicherzuordnungen mit Pfad der zugrunde liegenden Datei, Markierung (deleted), wenn die Datei weg ist
/proc/<pid>/statusName, Zustand, PPid, Uid/Gid (real, effektiv, gespeichert, fs), Capabilities
/proc/<pid>/statEinzeiliger Prozessdatensatz; Feld 22 starttime
/proc/<pid>/commKurzname (max. 16 Bytes), vom Prozess selbst beschreibbar
/proc/net/tcp, tcp6, udp, udp6, unixSocket-Tabellen mit hexadezimalen Adressen und Socket-Inode-Nummern
/proc/modulesGeladene Kernel-Module (dieselben Daten wie lsmod)
/proc/mountsAktuelle Mounts im Mount-Namespace des lesenden Prozesses
/proc/sys/kernel/taintedTaint-Flags des Kernels

Die Pfade sind in allen Distributionen identisch. Auf Systemen, bei denen /proc mit hidepid= eingehängt ist, sehen Benutzer ohne root-Rechte die Prozesse anderer Benutzer nicht.

Was es belegt

  • Welche Prozesse jetzt existieren, ihr Eltern-Kind-Baum, Benutzer- und Gruppen-IDs und Argumente.
  • Welche Programmdatei hinter jedem Prozess steht, auch nach der Löschung (exe -> /path (deleted)), und ermöglicht deren Wiederherstellung.
  • Dateilose Ausführung: Zeigt exe auf /memfd:<name> (deleted), lief ein Programm aus einer anonymen, mit memfd_create erzeugten Speicherdatei.
  • Welche Dateien, Sockets und Pipes jeder Prozess offen hält und mit welchen entfernten Adressen er verbunden ist (Inode-Nummern aus /proc/net/* mit den Links in fd/ verknüpfen).
  • Umgebungsvariablen wie LD_PRELOAD, HISTFILE oder Proxy-Einstellungen, die einem Prozess übergeben wurden.
  • Nicht belegt: alles über bereits beendete Prozesse. Ein Kernel-Rootkit kann außerdem filtern, was /proc anzeigt; vergleichen Sie daher mit der Speicheranalyse.

Wichtige Felder

FeldWoBedeutung
PPidstatusPID des Elternprozesses
Uid, GidstatusReale, effektive, gespeicherte und Dateisystem-IDs
CapEffstatusMaske der effektiven Capabilities
starttimestat Feld 22Startzeit in Clock Ticks nach dem Boot
Suffix (deleted)Links exe, maps, fd/*Die zugrunde liegende Datei wurde entfernt (unlink)
local_address, rem_address, st, uid, inode/proc/net/tcpHexadezimale IP:Port-Paare, TCP-Zustand (0A = LISTEN, 01 = ESTABLISHED), UID des Eigentümers, Socket-Inode

Zeitstempel

Dateien unter /proc zeigen den Zeitpunkt, zu dem der Kernel den Inode für den Leser erzeugt hat, nicht den Prozessstart; verwenden Sie also nicht die Zeiten aus ls -l. Rechnen Sie stattdessen starttime um: durch die Clock-Tick-Rate teilen (getconf CLK_TCK, meist 100) und zur Boot-Zeit addieren (btime in /proc/stat, Unix-Sekunden 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> liefert denselben Wert in Ortszeit.

Aufbewahrung

Keine. Einträge verschwinden, wenn der Prozess endet, und /proc wird beim Boot vollständig neu aufgebaut. Sichern Sie vor Eindämmungsmaßnahmen wie dem Beenden von Prozessen, dem Neustart von Diensten oder der Netzwerkisolation (die Verbindungen trennt).

Sicherung

  • Die Live-Response-Artefakte von UAC erfassen Prozesslisten, die Links unter /proc/<pid>, offene Dateien und /proc/modules; das Artefakt live_response/process/deleted.yaml kopiert die Programmdatei jedes Prozesses, dessen Programm als (deleted) erscheint (die ersten 20 MB), sowie gelöschte Dateien, die diese Prozesse noch offen halten.
  • Velociraptor: Linux.Sys.Pslist, Linux.Sys.Maps, Linux.Network.Netstat und verwandte Artefakte über eine ganze Flotte.
  • Manuell, mit vertrauenswürdigen Programmen:
# 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:'

Erstellen Sie zusätzlich ein Speicherabbild (siehe LiME und AVML): /proc beantwortet die Frage "was jetzt", der Speicher erlaubt es, später erneut zu fragen.

Auswertung

ps -eo pid,ppid,user,lstart,args --forest, ss -tanp, ss -xp und lsof -nP lesen /proc für Sie aus. Für ein Speicherabbild rekonstruiert Volatility 3 dieselbe Sicht offline mit linux.pslist, linux.pstree, linux.psaux, linux.envars, linux.lsof, linux.proc.Maps und linux.sockstat.

Tipps für die Untersuchung

  • Ein Prozess, dessen exe (deleted) oder memfd: ist, ist ein vorrangiger Befund: Es gibt legitime Fälle (Paket-Upgrades, die ein laufendes Programm ersetzen), prüfen Sie aber zuerst die Pakethistorie.
  • comm und argv[0] kann der Prozess ändern; vertrauen Sie stattdessen exe und den eingeblendeten Dateien.
  • Prozesse mit cwd in /tmp, /var/tmp oder /dev/shm verdienen einen genaueren Blick.
  • Vergleichen Sie die PID-Liste aus /proc mit der Ausgabe von ps und mit dem Speicher: Eine Abweichung deutet auf Userland-Hooking (ld.so.preload) oder ein Kernel-Rootkit (Kernel-Module) hin.
  • Ein root-Link, der nicht auf / zeigt, weist auf ein chroot oder einen Container hin; ordnen Sie ihn der Container-ID zu, bevor Sie Schlüsse ziehen (Container).
  • Halten Sie die Uhrzeit fest: Zeitpunkte einer Live-Sicherung sind nur aussagekräftig, wenn Uhrzeit und Zeitzone des Hosts im selben Moment erfasst wurden.

Siehe auch