Contabilidade Unix: comandos lastcomm sem executáveis em disco - o que são eles?

0

Um exercício relacionado à segurança: Para segurança extra, tenho a contabilidade Unix tradicional ( acct ) ativada. Isso pode ajudar a investigar atividades suspeitas após o fato.

De acordo com a página manual, /var/log/account é um diretório contendo arquivos pacct (contabilidade do processo) que contêm dados contábeis do processo conforme escritos pelo kernel, presumivelmente para cada processo que exit ed enquanto a contabilidade estava ativa. Os nomes dos comandos são truncados para 15-chars (isso parece ser um pequeno bug: man 5 acct mostra #define ACCT_COMM 16 não incluindo o caractere adicional para a terminação NULL na estrutura, mas vejo um máximo de 15 caracteres em vez de 16).

Quando executo lastcomm , que converte o arquivo pacct mais recente em formato legível, obtenho algumas linhas em que a primeira coluna (à esquerda) não é um comando óbvio (nome de um arquivo executável em disco) mesmo quando ignoro chars além do limite de 15 caracteres. Aqui estão alguns exemplos:

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

Alguns deles se parecem com nomes de threads do kernel. Existem muitos outros tópicos que posso ver em execução (por exemplo, em top ) que não aparecem nessa lista. Suponho que os que faltam são processos de execução longa que nunca exit ed, pois acct foi ativado.

Pergunta: Alguém pode explicar o que é cada um dos processos não contabilizados acima?

Para referência, aqui está o script bash para listar os comandos que não foram encontrados no disco, então você pode executá-lo você mesmo (certifique-se de executar sudo updatedb first)

#!/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
    
por arielf 26.05.2016 / 01:45

1 resposta

1

O campo comm não corresponde necessariamente ao nome do executável; é livremente configurável pelo próprio programa, escrevendo para /proc/self/comm no Linux ou usando algum prctl arcano ().

No Linux, no entanto, o registro contábil parece incluir não apenas processos, mas também threads do userspace. (Os processos e encadeamentos do Linux são quase os mesmos, afinal de contas.) Os exemplos dados são exatamente iguais aos nomes de encadeamento que o Chromium ou algum outro navegador baseado em WebKit / Blink usaria.

Para vê-los você mesmo, execute htop , pressione F2, em "Opções de exibição", ative o seguinte:

  • [✔] Mostrar nomes de segmentos personalizados
  • [✔] Exibir encadeamentos em cores diferentes

Pressione Shift + H para alternar os threads do userspace; Shift + K para threads do kernel.

    
por 26.05.2016 / 10:19