As principais entidades ao trabalhar com um sistema operacional são processos e threads. Eles determinam o contexto de execução do software e quais ações devem ser realizadas. Neste artigo, responderemos detalhadamente às seguintes perguntas.
O que é um processo e uma thread? Por que é necessário um sistema de inicialização como o systemd em um SO? Quais ferramentas podem ser usadas para trabalhar com processos? Como invasores podem explorá-los?
O que é um processo e uma thread no Linux?
Um processo é uma entidade abstrata e passiva que reside no kernel do sistema operacional e possui atributos necessários para a operação do software. Basicamente, esses atributos incluem:
- PID - ID do processo;
- PPID - ID do processo pai;
- CMD - nome do software em execução;
- Current Working Directory - diretório de trabalho do software;
- Signals - sinais processados pelo software.
Quando um usuário executa uma utilidade, o shell envia uma solicitação ao kernel, passando do espaço do usuário para o espaço do kernel por meio de uma chamada de sistema.
Exemplo: Para gravar dados em um novo arquivo, o shell realiza a chamada de sistema apropriada. Depois que o kernel recebe essa chamada, ele a processa, identifica a qual processo pertence e inicia as ações ou threads adequadas. As threads são as entidades ativas do processo, encarregadas de executar as instruções passadas pela chamada de sistema.
Qual é o ciclo de nascimento dos processos no Linux?
Se você não tiver recursos suficientes, pode realizar ações em servidores na nuvem de alto desempenho. O Serverspace oferece servidores VPS isolados para uso comum e virtualizado.
É importante entender o ciclo de nascimento dos processos no Linux. Há apenas um processo iniciado pelo kernel na inicialização - o systemd. Os demais processos são iniciados no formato de processo pai-descendente. Isso significa que, durante a inicialização do software, o systemd cria uma chamada de sistema fork(2), que literalmente instrui o kernel a criar uma cópia do systemd, utilizando os mesmos recursos alocados, desde que a memória destinada ao trabalho permaneça a mesma. Uma vez criado, o novo processo recebe um PID e um PPID, que é o ID do processo pai.
Para transformar a cópia do processo pai em uma "nova utilidade", uma chamada de sistema exec() é feita dentro do processo filho, o que exige que o kernel substitua os arquivos na memória pelos arquivos executáveis do novo software. Você pode ver essa sequência de forma mais esquemática na figura abaixo.
Assim, a ramificação do software em execução parecerá hierárquica: um processo iniciou outro. Mas como isso aparece ao conectar um cliente a um servidor SSH para gerenciar o Linux? Ou como podemos identificar qual processo malicioso executou o script? Vamos analisar isso usando a utilidade htop, que pode ser instalada pelo gerenciador de pacotes:
Após iniciar o htop, pressione F5 para visualizar a árvore de processos:
Observe a primeira linha, onde o processo com PID=1 está especificado - este é o sistema de inicialização systemd, a partir do qual os outros processos filhos são iniciados. À direita, na coluna Command, é exibido o software em execução e suas ramificações, onde um dos processos filhos do systemd é o sshd. Já o processo filho do sshd gerencia a sessão remota SSH root@pts/0, onde um shell bash foi iniciado para gerenciar o sistema, onde o usuário está conectado. Logo abaixo, podemos ver a utilidade htop em execução com PID 499087.
Como verificar atividades maliciosas no Linux?
Como aprendemos acima, qualquer conexão ao dispositivo será acompanhada por um terminal em execução, real ou virtual, como um processo. Portanto, é possível rastreá-las usando a utilidade:
O comando w permite exibir as conexões à máquina no momento atual, e a utilidade:
Exibe o histórico de logins no sistema operacional, reinicializações e inicializações a partir de endereços específicos. É a partir desse histórico que você pode determinar quais conexões foram feitas durante todo o período de operação da máquina. Preste atenção aos logs do sistema e aos processos iniciados por aplicativos, pois geralmente um sinal de alerta ocorre quando o sistema operacional faz chamadas de software para o shell. Um invasor precisa acessar o sistema operacional pelo shell para realizar um hardening ou uma elevação de privilégios.
Se detectar esse tipo de atividade, você deve encerrar os processos relevantes, isolar a máquina na rede e investigar. A primeira ação pode ser realizada usando a utilidade kill:
Substitua (pid) pelo ID do processo a ser encerrado. Depois disso, você pode coletar logs e dumps de memória RAM do dispositivo. Entender como trabalhar com processos forma uma visão completa de como gerenciar e proteger seu sistema usando as ferramentas do SO.