Quando os programas executados no Linux desejam usar os recursos gerenciados pelo sistema operacional (leitura de arquivos, criação de processos, etc.), eles fazem chamadas de sistema para o sistema operacional. As chamadas do sistema funcionam no nível do kernel e executam as operações necessárias, deixando o controle de volta para o programa de chamada. A ferramenta strace fornece a capacidade de rastrear essas chamadas de sistema no Linux.

Uso típico do comando strace

Para monitorar as chamadas do sistema para um aplicativo, basta invocar o comando com traço no seguinte formato:

strace ls /tmp

No entanto, muitas vezes há processos que começam muito mais cedo e continuam a funcionar em segundo plano. Devido a quaisquer problemas, você pode querer coletar informações adicionais associadas a tais processos. Você pode anexar traço para qualquer aplicativo em execução, fornecendo o ID do processo para o -p parâmetro:

linha -p 2759

Saída:

Acompanhe os encadeamentos e bifurcações de um aplicativo

instagram viewer

Com o strace, você pode verificar todos os threads e outros processos filhos que são uma bifurcação do aplicativo usando o -f bandeira.

linha -f -p 2759

Saída:

Verifique certas chamadas do sistema com strace

A saída de rastreamento padrão pode ser bastante lotada para seguir às vezes. Se você deseja rastrear apenas determinadas chamadas do sistema, pode fazê-lo com o -e parâmetro:

strace -f -e trace=abrir, escrever, fechar, conectar,selecionar -p 19770

Para rastrear apenas chamadas de sistema relacionadas a operações de arquivo, use -e trace=arquivo:

strace -e trace=arquivo -p 19770

Para filtrar apenas chamadas de sistema relacionadas à rede, especifique -e trace=rede no comando:

strace -e trace=rede -p 19770

Obter informações de tempo em segundos

Ao emitir chamadas do sistema, você pode usar o -t parâmetro para obter informações de tempo com precisão em segundos. Na maioria das vezes a precisão não será suficiente para suas necessidades. Em tais situações, você pode usar o -tt parâmetro para obter informações de tempo com precisão de microssegundos:

strace -tt ls /tmp

Coletar estatísticas sobre chamadas do sistema

Com o -c parâmetro, você pode coletar estatísticas sobre chamadas do sistema pelo tempo que desejar:

strace -f -c -p 19770

Salvar registros em um arquivo

Se você executar o strace por um longo tempo e quiser examinar os logs resultantes com mais detalhes posteriormente, será necessário salvar os logs. Com o -o parâmetro você pode especificar o arquivo no qual o strace deve salvar os logs:

strace -f -o /tmp/strace.log -e trace=file ls /tmp

Processo de bloqueio ptrace

Usando a chamada de sistema prctl, qualquer aplicativo no Linux pode evitar ser controlado por usuários não root usando ptrace. Se o aplicativo limpar o PR_SET_DUMPABLE sinalizador para si mesmo via prctl, usuários que não sejam root não poderão controlar este aplicativo com ptrace, mesmo que tenham o direito de sinalizar o aplicativo.

Um dos usos mais comuns desse recurso é visto no software do agente de autenticação OpenSSH. Assim, o controle do aplicativo por outro aplicativo com ptrace é impedido na autenticação do usuário.

ptrace e segurança

Devido ao recurso ptrace definido no modelo de processo Linux tradicional, qualquer software executado em seu sistema com seu usuário tem autoridade para inserir nele código malicioso. Desde a ferramenta xterm mais simples até aplicativos avançados de navegador da web, esse malware pode assumir o controle de todos os seus outros aplicativos em execução - graças à chamada do sistema ptrace - e copiar informações importantes sem que você perceba.

Em resposta a esta situação, que muitos usuários desconhecem, foi desenvolvido um mecanismo de proteção com o módulo de segurança chamado Yama no kernel Linux.

Você pode controlar a resposta à chamada do sistema ptrace através do /proc/sys/kernel/yama/ptrace_scope Arquivo. Por padrão, este arquivo grava um valor de 0.

Os seguintes valores são aceitáveis:

Valor Significado
0 Comportamento convencional: Todos os aplicativos que têm o direito de ptrace pode ser verificado.
1 Acesso restrito: Somente o pai direto do aplicativo ou aplicativos de depuração permitidos pelo aplicativo com o PR_SET_PTRACER opção tem o controle. Assim, os usos de gdb nome_do_programa e strace nome_do_programa continuará funcionando, mas você não poderá anexar um aplicativo em execução posteriormente.
2 Ptrace para o administrador do sistema: Somente aplicativos com CAP_SYS_PTRACE propriedade ou processos filhos que definem o PTRACE_TRACEME opção com prctl pode ser controlado.
3 Completamente desativado: Não ptrace é permitido em qualquer circunstância. Se esta propriedade for definida uma vez, você não poderá alterá-la novamente em tempo de execução.

Muitos desenvolvedores não sabem que os aplicativos podem desabilitar o ptrace via prctl, exceto para o usuário root. Embora softwares relacionados à segurança, como o agente OpenSSH, executem essas operações, não seria correto esperar o mesmo comportamento de todos os softwares em execução no sistema.

Recentemente, algumas distribuições Linux começaram a definir o valor padrão do ptrace_scope arquivo, descrito acima, para 1. Assim, com as operações do ptrace restritas, um ambiente de trabalho mais seguro é fornecido em todo o sistema.

Usando um strace de exemplo

Registre o aplicativo de exemplo abaixo com o nome ministrace.c. Então você pode compilá-lo com o seguinte comando:

gcc-oministrarministrar.c

Código:

#incluir <sys/ptrace.h>
#incluir <sys/reg.h>
#incluir <sys/wait.h>
#incluir <sys/types.h>
#incluir <unistd.h>
#incluir <stdlib.h>
#incluir <stdio.h>
#incluir <errno.h>
#incluir <string.h>
intwait_for_syscall(pid_t criança)
{
int status;
enquanto (1) {
ptrace (PTRACE_SYSCALL, filho, 0, 0);
waitpid (criança, &estado, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
Retorna0;
if (WIFEXITED(status))
Retorna1;
}
}

intdo_filho(int argc, Caracteres **argv)
{
Caracteres *args [argc+1];
memcpy (args, argv, argc * sizeof(Caracteres*));
args[argc] = NULO;
ptrace (PTRACE_TRACEME);
matar(getpid(), SIGSTOP);
Retorna execvp (args[0], argumentos);
}

intdo_trace(pid_t criança)
{
int status, syscall, retval;
waitpid (criança, &estado, 0);
ptrace (PTRACE_SETOPTIONS, filho, 0, PTRACE_O_TRACESYSGOOD);
enquanto(1) {
E se (wait_for_syscall (filho) != 0) pausa;

syscall = ptrace (PTRACE_PEEKUSER, filho, sizeof(grandes)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

E se (wait_for_syscall (filho) != 0) pausa;

retval = ptrace(PTRACE_PEEKUSER, filho, sizeof(grandes)*RAX);
fprintf (stderr, "%d
", recuperação);
}
Retorna0;
}
inta Principal(int argc, Caracteres **argv)
{
se (argc < 2) {
fprintf (stderr, "Uso: %s argumentos prog
", argv[0]);
saída(1);
}
pid_t filho = fork();
if (filho == 0) {
Retorna do_child (argc-1, argv+1);
} senão {
Retorna do_trace (filho);
}
}

Depois de compilar o aplicativo, você pode executar qualquer comando com ministrar e examine a saída:

Você pode usar o strace para muitos propósitos

strace pode ajudar a encontrar bugs em programas que usam recursos do sistema desnecessariamente. Da mesma forma, a característica que um programa exibe ao utilizar recursos do sistema operacional também pode ser revelada com strace.

Como o strace ouve diretamente as chamadas do sistema, ele pode revelar a dinâmica do tempo de execução, independentemente de o código do programa que está sendo executado ser aberto/fechado. É possível ter uma ideia de porque os programas lançam um erro quando começam a usar o strace.

Da mesma forma, o strace ajuda você a entender por que um programa termina inesperadamente. Portanto, estar familiarizado com o strace é muito importante no desenvolvimento do kernel Linux e na administração do sistema.

Crie seu próprio sistema operacional com o Linux do zero [Linux]

Leia a seguir

CompartilharTweetCompartilharE-mail

Tópicos relacionados

  • Linux
  • Comandos Linux
  • Kernel Linux

Sobre o autor

Fatih Küçükkarakurt (6 Artigos Publicados)

Um engenheiro e desenvolvedor de software que é fã de matemática e tecnologia. Ele sempre gostou de computadores, matemática e física. Ele desenvolveu projetos de mecanismos de jogos, bem como aprendizado de máquina, redes neurais artificiais e bibliotecas de álgebra linear. Além disso continua a trabalhar em aprendizado de máquina e matrizes lineares.

Mais de Fatih Küçükkarakurt

Assine a nossa newsletter

Junte-se à nossa newsletter para dicas de tecnologia, análises, e-books gratuitos e ofertas exclusivas!

Clique aqui para assinar