Por que o strace / gdb não é anexado a um processo, mesmo que eu seja root?

26
  • Eu entrei como root, mas straceme dá o seguinte:

    raiz @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 pts / 2 00:00:00 111
     3810 pts / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): Operação não permitida
    Não foi possível anexar ao processo. Se o seu uid corresponder ao uid do alvo
    processo, verifique a configuração de / proc / sys / kernel / yama / ptrace_scope ou tente
    novamente como o usuário root. Para mais detalhes, consulte /etc/sysctl.d/10-ptrace.conf
    root @ kyznecov-System: / home / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0 0
  • Tentei usar gdbpara depurar um programa multiprocesso no Eclipse CDT com bifurcação, e isso me deu o mesmo resultado / erro:

    insira a descrição da imagem aqui

Alguma ideia?

andreykyz
fonte
Como o ptrace_scope é zero, isso não importa, mas, como um experimento, você pode tentar um uso mais simples do strace, onde o processo de rastreamento é o pai do processo que está sendo rastreado. Por exemplo strace /bin/echo test? Isso dá a mesma mensagem de erro?
22812 Jordan Uggla
@EliahKagan, em teoria, o OP descrito não pode ocorrer na ausência de um bug do kernel. Se você tiver algum tempo nas próximas 24 horas e puder transformar seu comentário em uma resposta, isso seria ótimo - meus testes no Precise não revelaram problemas e, dessa forma, seria uma resposta definitiva que havia alguma peculiaridade na configuração do OP ... ele não voltou desde sua pergunta inicial, em 29 de maio.
ish
@EliahKagan, Uma coisa me impressionou ao reler o bit "operação não permitida" - porque eu já vi isso várias vezes quando supostamente sou root em OpenVZ VPS / VMs (eles compartilham o kernel da máquina host, então não , você é apenas o rei de sua própria pequena ilha) ... talvez fosse esse o caso? Veja esta pasta
ish
@izx Sua pasta expirou. E eu tenho esta questão (dentro de um recipiente), nenhum insight seria bom
Kunal Tyagi

Respostas:

25

Um motivo para obter o erro:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

é porque o processo já foi anexado a gdb, straceou similar. Para verificar se é esse o caso, execute:

grep TracerPid /proc/$THE_PID/status

Se for diferente de zero, esse é o pid de um programa existente que já está executando um rastreio nesse processo.

Nathan Kidd
fonte
Não notamos isso se estivermos depurando no Eclipse ... que já está usando o GDB #
1313
Obrigado por apontar isso. Eu estava executando um programa através de um wrapper strace. O programa bifurca e depois se executa. O filho execked morre rapidamente ao executar o wrapper strace, que não consegue se conectar porque o processo pai já está sob o controle do strace.
Rob Kennedy
18

Como o izx comentou, isso só deve acontecer devido a um bug do kernel. Portanto, qualquer pessoa que possa produzir esse problema atualmente - incluindo e especialmente o pôster original desta pergunta - seria aconselhável denunciá-lo como um erro , lendo essa página com cuidado e atenção e depois executando ubuntu-bug linuxna máquina afetada . Isso deve ser relatado linuxno Ubuntu, e não no kernel da linha principal (upstream), a menos que você possa produzi-lo em um kernel da linha principal (você precisaria ter yamacarregado).

O comportamento esperado em todas as versões do Ubuntu iniciadas no Ubuntu 10.10 é que o processo A não pode rastrear um processo em execução B, a menos que B seja filho direto de A (ou A seja executado como root). Esse é um aprimoramento de segurança, o que faz com que um processo comprometido por um invasor não possa usar os recursos de depuração fornecidos pelo kernel para descobrir informações de outros processos. Isso é explicado na seção escopo ptrace da página de wiki da comunidade de Recursos de Segurança .

Esse comportamento restritivo é o padrão, mas pode ser alterado para permitir que um processo A rastreie qualquer processo em execução B executado com o mesmo ID de usuário que o próprio processo A. Ou seja, você pode configurar seu sistema para permitir que qualquer um dos seus processos depure um ao outro. Isso simplifica a anexação de depuradores a processos já em execução.

A configuração para isso é exposta pelo /proc/sys/kernel/yama/ptrace_scope sysctl . 1denota o comportamento mais restritivo e 0o menos restritivo. A configuração pode ser lida com:

cat /proc/sys/kernel/yama/ptrace_scope

O comportamento menos restritivo (não padrão) pode ser definido com:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

E o comportamento mais restritivo (padrão) pode ser definido (ou retrocedido) com:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Não apenas o pôster original desta pergunta não conseguiu anexar uma straceinstância a um processo atualmente em execução com ptrace-scopedefinido como 0, mas o pôster original ainda não conseguiu fazê-lo ao executar stracecomo root. É difícil ver como isso pode ser qualquer coisa, menos um bug - eu recomendo denunciá-lo como um.

No começo, eu pensava que era capaz de reproduzir o problema em que uma ptrace_scopeconfiguração de 0é ignorada e tratada como se fosse 1. Mas não acredito mais que esse seja o caso, pois fiz as mesmas coisas novamente e não posso reproduzir o problema. Eu testei isso em:

  • A máquina física Lubuntu Precise amd64 que uso diariamente como minha caixa principal.
  • Uma máquina virtual do VirtualBox executando um CD ao vivo do Lubuntu Precise i386 (12.04).
  • Uma máquina virtual VirtualBox idêntica executando um Quantal i386 (Ubuntu + 1) de vida diária (20120608).

Nas três máquinas, o comportamento esperado ocorre e não consigo reproduzir a condição que o pôster original desta pergunta está perguntando. Aqui está um texto do Terminal (do sistema ao vivo Precise):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

strace continuei produzindo mensagens até que eu a suspendi, como esperado.

Concluo recomendando novamente denunciar isso como um bug. Uma pesquisa maximamente inclusiva em https://bugs.launchpad.net (que inclui todos os bugs relatados do Ubuntu) para o texto ptrace_scopeproduz apenas alguns resultados, nos quais claramente não há relatórios para esse bug . Relatar o bug ajudaria outras pessoas, pode levar a soluções alternativas ou a uma correção, e é provavelmente a única maneira significativa de avançar no trabalho sobre esse problema (supondo que o problema ainda esteja ocorrendo).

Eliah Kagan
fonte
Obrigado pela sugestão, vou lê-lo em detalhe amanhã e talvez acrescentar alguns subtítulos, mas acho que isso é extremamente completo :)
ish
no meu post você pode ver: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Eu fiz: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz
Em concole todo o trabalho facilmente. Mas se eu executava o programa no eclipse e tentava strace do console, recebo o problema.
55480 Andreykyz
2
pode ser um efeito colateral do processo já sendo rastreado? Eu tive o mesmo problema ao usar gdb no processo pai com permitem-de modo garfo criança
Jamie Pate
2
Também estou recebendo esse bug na versão 14.04. Alguém sabe se algum bug foi relatado por ele?
detly