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
- psCLI · in Linux enthalten
- ssCLI · in Linux enthalten
- lsofCLI · in Linux enthalten
- VelociraptorPlattform · Open Source
- Volatility 3CLI · Open Source
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
| Pfad | Inhalt |
|---|---|
/proc/<pid>/exe | Symlink auf die Programmdatei; lesbar (und kopierbar), auch wenn die Datei gelöscht wurde |
/proc/<pid>/cmdline | Argumente, durch NUL getrennt |
/proc/<pid>/environ | Anfängliche Umgebung, durch NUL getrennt (root oder derselbe Benutzer) |
/proc/<pid>/cwd, /proc/<pid>/root | Aktuelles 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>/maps | Speicherzuordnungen mit Pfad der zugrunde liegenden Datei, Markierung (deleted), wenn die Datei weg ist |
/proc/<pid>/status | Name, Zustand, PPid, Uid/Gid (real, effektiv, gespeichert, fs), Capabilities |
/proc/<pid>/stat | Einzeiliger Prozessdatensatz; Feld 22 starttime |
/proc/<pid>/comm | Kurzname (max. 16 Bytes), vom Prozess selbst beschreibbar |
/proc/net/tcp, tcp6, udp, udp6, unix | Socket-Tabellen mit hexadezimalen Adressen und Socket-Inode-Nummern |
/proc/modules | Geladene Kernel-Module (dieselben Daten wie lsmod) |
/proc/mounts | Aktuelle Mounts im Mount-Namespace des lesenden Prozesses |
/proc/sys/kernel/tainted | Taint-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
exeauf/memfd:<name> (deleted), lief ein Programm aus einer anonymen, mitmemfd_createerzeugten 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 infd/verknüpfen). - Umgebungsvariablen wie
LD_PRELOAD,HISTFILEoder Proxy-Einstellungen, die einem Prozess übergeben wurden. - Nicht belegt: alles über bereits beendete Prozesse. Ein Kernel-Rootkit kann außerdem filtern, was
/procanzeigt; vergleichen Sie daher mit der Speicheranalyse.
Wichtige Felder
| Feld | Wo | Bedeutung |
|---|---|---|
PPid | status | PID des Elternprozesses |
Uid, Gid | status | Reale, effektive, gespeicherte und Dateisystem-IDs |
CapEff | status | Maske der effektiven Capabilities |
starttime | stat Feld 22 | Startzeit 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/tcp | Hexadezimale 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 Artefaktlive_response/process/deleted.yamlkopiert 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.Netstatund 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)odermemfd:ist, ist ein vorrangiger Befund: Es gibt legitime Fälle (Paket-Upgrades, die ein laufendes Programm ersetzen), prüfen Sie aber zuerst die Pakethistorie. commundargv[0]kann der Prozess ändern; vertrauen Sie stattdessenexeund den eingeblendeten Dateien.- Prozesse mit
cwdin /tmp, /var/tmp oder /dev/shm verdienen einen genaueren Blick. - Vergleichen Sie die PID-Liste aus
/procmit der Ausgabe vonpsund 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
Verwandte Artefakte
Ausführliche Leitfäden
Glossar
- Order of VolatilityEnglisch
- UAC (Unix-like Artifacts Collector)Englisch
- LD_PRELOAD and /etc/ld.so.preloadEnglisch