Unix-Accounting: lastcomm-Befehle ohne ausführbare Dateien auf der Festplatte - was ist das?

406
arielf

Eine sicherheitsbezogene Übung: Für zusätzliche Sicherheit habe ich die traditionelle Unix-Buchhaltung ( acct) aktiviert. Dies kann helfen, verdächtige Aktivitäten im Nachhinein zu untersuchen.

Gemäß der Manpage /var/log/accounthandelt es sich um ein Verzeichnis, das pacct(Prozessabrechnungs-) Dateien enthält, die Prozessabrechnungsdaten enthalten, wie vom Kernel geschrieben, vermutlich für jeden Prozess, der exitwährend der Abrechnung aktiv war. Befehlsnamen werden auf 15 Zeichen verkürzt (dies scheint ein kleiner Fehler zu sein: man 5 acctzeigt #define ACCT_COMM 16das zusätzliche Zeichen für den abschließenden NULL-Wert in der Struktur nicht an, aber ich sehe maximal 15 Zeichen statt 16).

Wenn ich lastcommdie neueste pacctDatei in eine vom Menschen lesbare Form konvertiere, bekomme ich einige Zeilen, in denen die 1. Spalte (ganz links) kein offensichtlicher Befehl ist (Name einer ausführbaren Datei auf der Festplatte), selbst wenn ich Zeichen außerhalb der 15 ignoriere. Char Limit. Hier sind einige Beispiele:

kworker/dying handle-watcher- WorkerPool/28 ScriptStreamerT Compositor CompositorTileW Chrome_ChildIOT 

Einige davon sehen aus wie Namen von Kernel-Threads. Es gibt viele weitere Threads, die lauffähig sind (z. B. in top), die nicht in dieser Liste angezeigt werden. Ich gehe davon aus, dass es sich bei den fehlenden Prozessen um lange laufende Prozesse handelt, die exitseit acctder Aktivierung nie aktiv waren.

Frage: Kann jemand erklären, was die oben genannten Prozesse für unvorhergesehene Prozesse sind?

Hier finden Sie das Bash-Skript, um die Befehle aufzulisten, die nicht auf der Festplatte gefunden wurden. Sie können es also selbst ausführen (stellen Sie sicher, dass Sie es sudo updatedbzuerst ausführen ).

#!/bin/bash  fullpath_of_cmd() { # cmd may be truncated to a max of 15 chars (see "man 5 acct") cmd="$1" # Search for any file matching this prefix # (assumes locate db is up to date) paths=$(locate "/$cmd") echo "$paths" }  for cmd in $(lastcomm | cut -d' ' -f1 | sort -u); do # echo === $cmd paths=$(fullpath_of_cmd "$cmd") case "$paths" in (*/$cmd*) : cool, found it ;; (*) printf "%s -> NOT FOUND (%s)\n" $cmd $paths ;; esac done 
0

1 Antwort auf die Frage

1
grawity

Das commFeld entspricht nicht unbedingt dem Namen der ausführbaren Datei. Es kann vom Programm selbst frei eingestellt werden, indem /proc/self/communter Linux geschrieben wird oder indem einige arkane prctl () verwendet werden.

Unter Linux scheint das Buchhaltungsprotokoll jedoch nicht nur Prozesse, sondern auch Threads des Benutzerbereichs zu umfassen. (Linux-Prozesse und -Threads sind fast immer gleich.) Die Beispiele sehen genau wie Threadnamen aus, die Chromium oder möglicherweise ein anderer WebKit / Blink-basierter Browser verwenden würde.

Um sie selbst zu sehen htop, drücken Sie F2 und aktivieren Sie unter "Anzeigeoptionen" Folgendes:

  • [✔] Benutzerdefinierte Threadnamen anzeigen
  • [✔] Fäden in einer anderen Farbe anzeigen

Drücken Sie Shift+HUser - Space - Threads zu wechseln; Shift+Kfür Kernel-Threads.