Como proteger o Ubuntu da bomba de garfo

72

Ouvi alguém falando sobre uma bomba de forquilha, fiz algumas pesquisas e encontrei algumas informações terríveis sobre alguns personagens de aparência estranha que as pessoas podem digitar na linha de comando e, como resultado, fazem coisas ruins no computador. Eu certamente não emitiria comandos que não entendo, mas nunca se sabe o que pode acontecer.

Ouvi dizer que alguns sistemas operacionais permitem que o administrador coloque algum limite nos processos do usuário para atenuar os efeitos das bombas, esta proteção no Ubuntu é padrão ou uma pessoa com privilégio de sudo precisaria definir isso? Se sim, como?

dblang
fonte

Respostas:

73

Você pode limitar facilmente a quantidade de processos que podem ser gerados no Ubuntu e na maioria das outras distribuições Linux, modificando /etc/security/limits.conf

sudoedit /etc/security/limits.conf

Em seguida, adicione esta linha na parte inferior desse arquivo:

*    hard     nproc     nnn

Onde:

  • hard define o limite no nível do kernel para que ele não possa ser alterado sem a reinicialização.
  • nproc é o número máximo de processos por usuário.
  • nnn é um número que você deve calcular para o seu sistema:

    ps aux -L | cut --delimiter=" " --fields=1 | sort | uniq --count | sort --numeric-sort | tail --lines=1
    

O comando acima listará todos os processos para todos os usuários, incluindo threads , resumirá e listará o nome do usuário com a maior quantidade de processos. Para garantir a segurança, abra todos os aplicativos que você normalmente precisa antes de executar o comando acima e, em seguida, duplique esse número por segurança.

Depois que esse limite for estabelecido, você precisará reiniciar, mas isso afetará cada usuário não root no sistema. Portanto, se um fork fork for executado por qualquer usuário não root, ele terá esse limite rígido.

Os limites de grupo e curinga não se aplicam ao usuário raiz por padrão . Use o nome de usuário literal rootnas regras se desejar aplicar uma regra ao superusuário.

Além disso, se você não quiser reiniciar em breve, poderá usar o sudo ulimit -u 800que colocará a restrição apenas na sessão de corrida, mas poderá ser facilmente contornado por uma bomba de garfo com sudoprivilégios!

Após a reinicialização, o que estiver dentro /etc/security/limits.confserá usado.

Algumas informações adicionais sobre as bombas de forquilha: elas não são malware ou algo terrível. Eles geralmente consistem em algo tão básico quanto um script que se chama duas vezes - aumentando assim sua presença na máquina exponencialmente. Mesmo com pouca capacidade de memória, devido ao ritmo acelerado que eles multiplicam, eles preenchem rapidamente toda a RAM disponível e a máquina congela ou reinicia. O único perigo é perder informações não salvas. Eu classificaria um forkbomb muito mais como uma brincadeira do que software malicioso.

Um lembrete importante:

Você raramente deve executar algo na linha de comando quando não tiver 98% de certeza de sua ação. Se você não consegue ler os comandos que está executando - não faça. Isso se aplica ao dobro de pedaços ilegíveis de caracteres hex / base64, que podem ser usados ​​para ocultar todos os tipos de maldade. Se você não tem certeza de um comando, sempre pode procurar por suas ações nas Manpages do Ubuntu e ter cuidado extra ao usar, sudopois ele será executado como usuário root.

Marco Ceppi
fonte
@MarcoCeppi: o seu número não foi muito longe para um usuário típico Unidade: a saída para o cálculo é atualmente 404 para o meu sistema ...
Fabby
11
Se eu, digamos, colocar algo como alias ":(){ :|: & };:"="echo 'No.'"no meu .bashrc- ele executará todos os logins?
UniversallyUniqueID
Existe uma desvantagem em escolher um limite nproc mais alto? Parece que não há muito espaço com um limite igual ou até o dobro do número atual de processos; um limite muito maior, mesmo 10.000 ou mais, ainda seria eficaz contra uma bomba de forquilha? Sobre quanto ram cada garfo / processo consome? Talvez haja um limite mais universal derivado da RAM?
Xen2050
1

Uma maneira simples de gostar é criar um alias, embora nem sempre sejam aplicados, verifique a resposta acima.

alias :="echo No."

Agora

$ :(){ :|: & };:
bash: syntax error near unexpected token `('
Adrian Webster
fonte
22
certamente, esta é uma solução comum; como isso para a(){ a|a & };a? (ou qualquer outro nome de função?)
cat