Como parar e detectar a bomba dos garfos

14
#include <stdlib.h>
#include <unistd.h>

int main()
{
   while(1)
      fork();
}

Este é o código para uma bomba de garfo.

Em nossa faculdade, nos conectamos via telnet, ou seja, protocolo de atendimento ao cliente. Cerca de 100 sistemas estão conectados ao servidor. De repente, vimos o servidor ficando lento e depois de algum tempo ele travou. Eu soube que alguém implementou uma bomba de garfo.

Como podemos detectar em qual sistema a bomba está sendo implementada? E como podemos parar com isso?

Um método é limitar o número máximo de processos que um único usuário pode possuir. Existe algum método para pará-lo e saber de qual sistema foi implementado?

Rajesh M
fonte
19
Telnet? Seriamente? Você realmente deve usar SSH ...
ThiefMaster
Veja também unix.stackexchange.com/q/64611/17609
moooeeeep 16/13
bem, foi migrado do SO, mas uma resposta pode estar no nível do kernel. alguns patches foram feitos provisoriamente, mas nenhum parece atender à aceitação. Meu argumento é: como detectá-lo: bem, qualquer usuário saberá que não pode mais usar o sistema; portanto, o ponto de detecção talvez não seja o ponto principal. Como recuperar? A resposta atual é reiniciar, eu diria: uma maneira de dizer ao kernel para executar apenas um processo (o que você deseja limpar a bagunça) e parar todos os outros, independentemente do que eles sejam. Esse poderia ser um recurso acessível apenas no console do sistema.
Philippe Lhardy

Respostas:

16

Uma maneira é limitar o número de processos que um usuário pode executar.

Basta fazer login como root e editar este arquivo, para adicionar usuários e configurar seu limite.

# vi /etc/security/limits.conf

Adicione esta linha ao arquivo

john hard nproc 10

Agora, o usuário john pode criar apenas 10 processos.

Barath Bushan
fonte
Eu acho que você precisa reiniciar para que as novas configurações /etc/security/limits.confentrem em vigor.
Dan D.
2
Não. Mas eles são aplicados pelo PAM, portanto, somente se aplicam a novos logons.
ThiefMaster 17/03/2013
14

Para parar uma bomba de garfo em execução, você pode usar killall <name>para matar todos os processos da bomba. No entanto, como uma bomba de garfo geralmente resulta em uma carga incrivelmente alta no sistema, talvez você não consiga fazer o SSH nela ou executá-la. Portanto, uma reinicialização pode ser necessária ou, pelo menos, muito mais rápida.

Se todo usuário tiver sua própria conta no sistema, basta verificar o diretório pessoal de todos e procurar o executável. As chances são boas de que ele também tenha carregado o código-fonte, portanto, achar que não deve ser muito difícil. Se fosse uma conta compartilhada para todos os alunos, você não terá sorte. Especialmente após o término da sessão telnet ou ssh do usuário, você não tem chance de descobrir quem a iniciou.

No entanto, em vez de punir o usuário que detonou a bomba, você deve corrigir a configuração do sistema para desarmar as bombas. Você pode definir limites de processo por usuário usando /etc/security/limits.confe, assim, impedir que uma bomba de garfo fique fora de controle - com, por exemplo, apenas 50 processos, uma bomba de garfo não causará muitos danos.

ThiefMaster
fonte
é impossível detectar de qual sistema está chegando aa?
Clive M
@ user1670364: Não está claro o que você está perguntando. O que você quer dizer com "está chegando"? Você pode dizer qual usuário é o proprietário do processo, o que mais você quer saber?
David Schwartz
@DavidSchwartz, quero dizer que é possível detectar a bomba de forquilha em que sistema está sendo implementado?
Clive M
@ user1670364: Se você quer dizer o sistema que está realmente executando o fork pump, é o mais lento. Se você quer dizer o usuário responsável, é o usuário que possui os processos que estão sendo bifurcados.
David Schwartz