Hoje, com vários mecanismos de defesa, os mecanismos de ataque crescem absurdamente. Técnicas de invasão, códigos maliciosos e muito mais. Bem, o
fork bomb nada mais é do que um código feito em bash onde são gerados vários processos filhos, fazendo com que sua máquina trave muito rápido.
Antes de ver o código, que é muito pequeno e com um grande poder, quero deixar bem claro que iremos estudar o código do mesmo, portanto não é aconselhável que vocês usem como uma "pegadinha" para travar computadores de amigos ou servidores do trabalho. Vamos estudar como utilizar essa ferramenta e também como criar uma prevenção contra a mesma.
O código que será digitado em um terminal, é:
:(){ :|:& };:
Então, vamos entender, partindo o código em pedaços pequenos. Como está explicado em uma das referências deste artigo, irei mostrar aqui:
O código dentro da função recursivamente chama a função e envia o retorno desta para outra instância da mesma função - representada no comando por ":|:". O símbolo "&" pega a chamada e a coloca para ser executada em segundo plano. Desta forma, os processos filhos não caem caso o processo pai seja finalizado. Note que por invocar a função duas vezes, o crescimento do número de processos se dá de forma exponencial.
O símbolo ";" fecha a definição da função e o ":" no final é a primeira execução da função que inicia o funcionamento do fork bomb.
Agora vamos aprender como criar uma proteção contra o Fork Bomb. Caso você tenha curiosidade de pesquisar no Google, irá achar algumas maneiras de fazer isso, mas a que eu recomendo é a seguinte:
Abra o arquivo
limits.conf (irei utilizar o editor de texto VIM):
# vim /etc/security/limits.conf
É provável que tudo esteja comentado, caso não esteja comente! Agora, adicione a seguinte linha:
usuário soft nproc 160
Ou adicione por grupo:
@grupo soft nproc 160
Vamos entender o que acabamos de adicionar:
A linha para ser adicionada no arquivo limits.conf precisa seguir o padrão <domínio> <valor>, temos as seguintes opções retiradas de mais uma das referências deste artigo:
* <domain> can be:
o an user name
o a group name, with @group syntax
o the wildcard *, for default entry
o the wildcard %, can be also used with %group syntax, for maxlogin limit
* can have the two values:
o "soft" for enforcing the soft limits
o "hard" for enforcing hard limits
* can be one of the following:
o core - limits the core file size (KB)
* <value> can be one of the following:
o core - limits the core file size (KB)
o data - max data size (KB)
o fsize - maximum filesize (KB)
o memlock - max locked-in-memory address space (KB)
o nofile - max number of open files
o rss - max resident set size (KB)
o stack - max stack size (KB)
o cpu - max CPU time (MIN)
o nproc - max number of processes
o as - address space limit
o maxlogins - max number of logins for this user
o maxsyslogins - max number of logins on the system
o priority - the priority to run user process with
o locks - max number of file locks the user can hold
o sigpending - max number of pending signals
o msgqueue - max memory used by POSIX message queues (bytes)
o nice - max nice priority allowed to raise to
o rtprio - max realtime priority
o chroot - change root to directory (Debian-specific)
Vamos entender agora o número que é colocado ao final da linha.
Precisamos ter noção de quantos processos o grupo ou o usuário precisa rodar, então vamos utilizar o comando "ps aux" para isso:
ps aux | wc -l
164
Então, vou colocar 164 para fazer o teste.
Agora entendemos o que estamos utilizando, então fica mais fácil de alterar regras.
Agora, para teste, coloque o seu usuário no limits.conf, no meu caso ficando assim:
damasceno soft nproc 164
E tente utilizar o Fork Bomb com o seu usuário e veja a mensagem de erro ao tentar utilizar o código:
bash: fork: retry: Recurso temporariamente indisponível
bash: fork: retry: Recurso temporariamente indisponível
bash: fork: retry: Recurso temporariamente indisponível
bash: fork: retry: Recurso temporariamente indisponível
Bem, existem outras formas, como por exemplo utilizar:
# ulimit -u 100
Sendo o limite de processos para usuário de 100, basta ajustar para a sua necessidade.