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.