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
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
Tópicos relacionados
- Linux
- Comandos Linux
- Kernel Linux
Sobre o autor
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.
Assine a nossa newsletter
Junte-se à nossa newsletter para dicas de tecnologia, análises, e-books gratuitos e ofertas exclusivas!
Clique aqui para assinar