'kill -s TERM' funciona, 'kill -s ABRT' obtém “Operação não permitida”

6

Existe um processo que possuo cuja documentação alega que posso enviar SIGABRT para obter algumas informações de depuração. No entanto, quando tento enviar SIGABRT , volto "Operação não permitida".

Eu também tentei enviar os mesmos sinais para outros processos que possuo para garantir que não haja algum bloco subjacente impedindo que eu envie SIGABRT , mas eles respondem de maneira apropriada. É apenas este programa, mas é cada instância desse programa. Um rastreamento de chamada do sistema do processo mostra que ele nunca recebe o sinal.

Eu tentei executar /bin/kill explicitamente a fim de excluir qualquer estranheza no kill de meu shell e, além de algumas pequenas diferenças de saída, não houve mudança no comportamento.

root pode enviar SIGABRT para o processo e funciona como eu esperava.

Estou nesse jogo há algum tempo, mas nunca vi uma instância em que um usuário não pudesse enviar um sinal para um processo que ele possui, nem vi uma instância em que um usuário possa enviar um sinal mas não outro.

O SO é o FreeBSD 9.0 e o processo é um processo ruby que faz parte de um aplicativo Ruby-on-Rails do Passenger da Phusion rodando sob o Apache.

Atualmente estou com uma perda total. Alguém tem alguma ideia do que está acontecendo?

Atualização: Acontece que o security.bsd.conservative_signals sysctl foi definido como 1, e isso impede que muitos sinais sejam entregues aos processos setuid, de acordo com a página do manual. Definir como 0 resolve o problema.

Embora tenha havido uma chamada setuid em algum ponto da cadeia de processos - o processo é filho de um httpd Apache, e o Apache altera seu uid para liberar permissões de raiz - o processo em si não é setuid e seu EUID, RUID e SVUID são todos iguais ao usuário que envia o sinal. A única inspeção do processo que posso encontrar que indicaria que qualquer setuid ocorreu é o campo% flags de P_SUGID no campo "flags" de ps . ("Tinha privilégios id set desde o último exec") Parece que não deve ser o caso, mas é tratado em um módulo do Apache e eu não sei seus métodos exatos.

Para o registro, é um processo ruby que está funcionando como parte de um aplicativo Ruby on Rails sendo manipulado por mod_passenger, AKA mod_rails.

    
por wfaulk 27.12.2012 / 16:55

1 resposta

5

Da última versão do kill (2 ) manpage :

For a process to have permission to send a signal to a process designated by pid, the user must be the super-user, or the real or saved user ID of the receiving process must match the real or effective user ID of the sending process. A single exception is the signal SIGCONT, which may always be sent to any process with the same session ID as the sender. In addition, if the security.bsd.conservative_signals sysctl is set to 1, the user is not a super-user, and the receiver is set-uid, then only job control and terminal control signals may be sent (in particular, only SIGKILL, SIGINT, SIGTERM, SIGALRM, SIGSTOP, SIGTTIN, SIGTTOU, SIGTSTP, SIGHUP, SIGUSR1, SIGUSR2).

Em que sentido você é o dono do processo? O que exatamente é o status do processo relativo ao uid real, uid eficaz, que binário ele está executando, proprietário e setid-bits desse binário, etc?

    
por 27.12.2012 / 21:36