Учет Unix: команды lastcomm без исполняемых файлов на диске - что это?

310
arielf

Упражнение, связанное с безопасностью: для дополнительной безопасности у меня acctвключен традиционный учет Unix ( ). Это может помочь расследовать подозрительную деятельность после факта.

Согласно man-странице /var/log/account- это каталог, содержащий pacct(учет процессов) файлы, которые содержат данные учета процессов, записанные ядром, предположительно для каждого процесса, который exitредактировался, когда учет был активным. Имена команд усекаются до 15 символов (это, кажется, небольшая ошибка: man 5 acctпоказано, что в структуре #define ACCT_COMM 16не указан дополнительный символ для завершающего NULL, но я вижу максимум 15 символов вместо 16).

Когда я запускаю программу, lastcommкоторая преобразует самый последний pacctфайл в удобочитаемую форму, я получаю строки, где 1-й (крайний левый) столбец не является очевидной командой (имя исполняемого файла на диске), даже если я игнорирую символы после 15- предел символа Вот некоторые примеры:

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

Некоторые из них выглядят как имена потоков ядра. Есть еще много потоков, которые я вижу (например, в top), которые не отображаются в этом списке. Я предполагаю, что отсутствующие являются долго выполняющимися процессами, которые никогда не exitредактировались с тех пор, как acctбыли включены.

Вопрос: Может ли кто-нибудь объяснить, что представляет собой каждый из перечисленных выше неучтенных процессов?

Для справки, вот скрипт bash, в котором перечислены команды, которые не были найдены на диске, так что вы можете запустить его самостоятельно (убедитесь, что он выполняется sudo updatedbпервым)

#!/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 ответ на вопрос

1
grawity

The comm field doesn't necessarily correspond to the executable name; it is freely settable by the program itself, by writing to /proc/self/comm on Linux or by using some arcane prctl()'s.

On Linux, however, the accounting log seems to include not only processes but also userspace threads. (Linux processes and threads are very nearly the same, after all.) The examples given look exactly like thread names that Chromium or perhaps some other WebKit/Blink-based browser would use.

To see them yourself, run htop, press F2, under "Display options" enable the following:

  • [✔] Show custom thread names
  • [✔] Display threads in a different color

Press Shift+H to toggle userspace threads; Shift+K for kernel threads.

Похожие вопросы