Garra bomba em um Mac?

6

Acabei de aprender sobre uma bomba de garfo , um tipo interessante de ataque de negação de serviço. A Wikipedia (e alguns outros lugares) sugere usar :(){ :|:& };: em máquinas UNIX para bifurcar o processo um número infinito de vezes. No entanto, parece não funcionar no Mac OS X Lion (lembro-me de ler que os sistemas operacionais mais populares não são vulneráveis a ataques tão diretos). Estou, no entanto, muito curioso sobre como tal ataque funciona (e parece), e gostaria de experimentar o meu Mac. Existe uma maneira de contornar as salvaguardas do sistema, ou é o caso de uma garfada não ser possível em Macs?

    
por ernes7a 23.04.2012 / 20:41

3 respostas

3

Como funciona uma bifurcação: no código C (ou C), uma função chamada fork() é chamada. Isso faz com que o linux ou o Unix ou o Unix-a-likes criem um processo inteiramente novo. Este processo tem um espaço de endereço, um ID de processo, uma máscara de sinal, descritores de arquivos abertos, todos os tipos de coisas que ocupam espaço na memória limitada do kernel do sistema operacional. O processo recém-criado também obtém um ponto na estrutura de dados do kernel para que os processos sejam executados. Para o processo que chamou fork() , parece que nada aconteceu. Um processo de fork fork tentará chamar fork() o mais rápido que puder, quantas vezes puder.

O truque é que o processo recém-criado também retorna do fork() no mesmo código. Depois de um fork, você tem dois processos executando o mesmo código. Cada novo processo fork-bomb tenta chamar fork() o mais rápido que puder, quantas vezes puder. O código que você deu como exemplo é uma versão Bash-script de uma fork fork.

Em breve, todos os recursos relacionados ao processo do kernel do sistema operacional são usados. A tabela de processos está cheia. A lista de processos em espera está cheia. A memória real está cheia, então a paginação é iniciada. Se isso continuar por muito tempo, a partição de swap será preenchida.

O que isso parece para um usuário: tudo funciona muito devagar. Você recebe mensagens de erro como "não foi possível criar o processo" ao tentar coisas simples como ls . Tentar um ps causa uma pausa interminável (se for executada) e devolve uma lista muito longa de processos. Às vezes, essa situação exige uma reinicialização por meio do cabo de alimentação.

As bombas de garfo costumavam ser chamadas de "coelhos" antigamente. Porque eles se reproduziram tão rapidamente.

Apenas por diversão, eu escrevi um programa de fork fork em C:

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

Eu compilei e executei esse programa no Arch Linux em um xterm. Eu outro xterm eu tentei obter uma lista de processos:

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

O shell Z no segundo xterm não pôde chamar fork() com sucesso, pois os processos do fork fork associados ao 1st xterm haviam esgotado todos os recursos do kernel relacionados ao processo criado e em execução.

    
por 23.04.2012 / 22:17
2

Existem muitas salvaguardas que podem ser postas em prática para evitar que a bomba do garfo funcione.

O mais simples é:

ulimit -u 1024

limitando o número de processos do usuário a 1024.

No que diz respeito às proteções do sistema, certamente existem maneiras de fazer isso, mas eu não acho que alguém aqui vai te dar uma maneira de fazer isso, mas basicamente seu sistema fica sem PIDs e não pode gerar mais processos e basicamente parar completamente, já que sua bomba está levando 100% da CPU tentando gerar mais de si mesma.

    
por 23.04.2012 / 20:52
1

Se você está realmente desesperado para ver como funciona o fork fork, tente executá-lo como root, por exemplo, sudo :(){ :|:& };: , mas, novamente, esteja avisado. Tentei eu mesmo no Ubuntu. O sistema irá congelar!

Uma simples dissecação para você:

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, as infinitum

Esteja ciente disso ao tentar causar tal dano ...

    
por 27.04.2013 / 06:42