(In) significância dos processos raiz […] e tty

2

Um colega meu me designou para executar uma análise de causa-raiz de um servidor de segurança corporativo há algum tempo. Sabíamos que o problema residia em um dos processos executados pelo root, mas não sabíamos qual deles.

Primeiramente, comecei minha pesquisa emitindo o comando:

ps -aux | grep -v grep | grep root

Isso retornou uma lista de várias dezenas de processos. Meu colega me ajudou a otimizar minha pesquisa com este comando:

ps -aux | grep -v grep | grep root | grep -Ev '[[]'| grep -v tty

Esse novo comando reduziu significativamente a lista de processos retornados e logo descobrimos o problema. As duas últimas partes do comando filtram

1) processos cercados por [], como [ksoftirqd / 0] 2) processos em execução via terminal de teletipo

ps (1) me diz que os processos com argumentos que não podem ser localizados são colocados entre colchetes (não tenho certeza do que isso significa), e tty é apenas um predecessor do moderno terminal bash. No entanto, eu ainda não entendo o significado deles (ou devo dizer insignificância) a respeito de porque nós poderíamos simplesmente eliminá-los dos processos-raiz mais "frutíferos".

Alguém poderia lançar alguma luz aqui?

Obrigado

    
por AK-33 23.11.2014 / 07:14

3 respostas

3

"argumentos que não podem ser localizados" normalmente significa que o processo não possui nenhum argumento de linha de comando porque não é um processo de usuário normal, mas um iniciado diretamente pelo kernel. Quando você está procurando por um processo que está fazendo algo errado, geralmente não é um desses processos do kernel, então seu colega sugeriu filtrá-los.

tty é não "apenas um predecessor do moderno terminal bash". Não tem nada a ver com bash ou shells, e não é um antecessor de nada. O tty listado por ps é o terminal de controle do processo, se tiver um. Os processos com um control tty provavelmente foram iniciados por algum usuário como parte de uma sessão interativa (seja uma sessão iniciada no console local, uma porta serial local, uma sessão SSH ou uma tela, ou qualquer outra coisa não importa: eles são todos terminais). Processos sem um controle tty são tipicamente daemons e serviços do sistema. Seu colega estava sugerindo que o problema era mais provável em um daemon ou serviço de sistema.

Quanto ao resto da linha de comando:

ps -aux | grep root

Não sei qual sistema operacional você está usando, mas as versões dos argumentos ps with aux são geralmente de herança BSD. Eu não estou familiarizado com ps do BSD, mas suspeito que há uma opção para listar apenas processos pertencentes a um usuário específico, em vez de listar cada processo e, em seguida, filtrar todos os que não são de propriedade do root posteriormente. Se você estivesse usando o Linux, por exemplo, seria:

ps -fu root
    
por 23.11.2014 / 12:12
1

Francamente, parece um pouco bobo.

grep -Ev "[[]"

exclui processos com o colchete de abertura em seu comando. Embora estes sejam frequentemente processos do kernel, até mesmo um programa de espaço normal do usuário pode ter esse caractere presente na linha de comando.

grep -Ev "tty"

é o mesmo em azul claro. Exclui processos que possuem a cadeia "tty" em algum lugar em sua linha de saída de ps . Isso inclui processos que possuem um dispositivo de terminal aberto (mas não processos que possuem um pseudo-terminal aberto (!)), Por isso parece restringir a saída a tarefas daemonizadas.

No entanto, como no caso acima, ele também excluirá processos que aparecem na saída de ps como:

pid ?    R+  310:03 /home/pwned_user/bin/rootkit_tty[_rofl crack root-password

Dito isso, você tem muita sorte de encontrar algo e não pode ter certeza de que encontrou tudo. Considerando que sua pergunta tem "servidor de segurança corporativo" no começo, isso aumenta ainda mais (ou abaixo, se você quiser).

    
por 23.11.2014 / 12:10
0

Como regra geral, você nunca deseja fazer ps aux | grep -v grep , é para isso que o pgrep :

pgrep -u root

O comando acima listará todos os processos iniciados por root . Você precisa de ps se quiser 1) excluir aqueles cujo nome está entre [] e 2) restringir aqueles que não estão listados como executando em ttys. Você pode evitar alguns dos problemas mencionados nas outras respostas, especificando onde exatamente cada string não deve corresponder (em vez de usar grep -v , que descartará uma linha se corresponder a em qualquer lugar ):

ps aux | awk '$1=="root" && $7 !~/^tty[0-9]$/ && $NF!~/^\[.*\]$/' 
              ----------    ----------------     ---------------
                  |               |                    |
                  |               |                    |-> If the last field 
                  |               |                        is within [ ]  
                  |               |---------------> If the 7th field starts
                  |                                 with tty and ends in a digit 
                  |----------------------------> If the 1st field is 'root'
    
por 23.11.2014 / 17:53