Como funciona uma bomba de garfo?


22
  • AVISO NÃO TENTE EXECUTAR ISTO EM UMA MÁQUINA DE PRODUÇÃO

Ao ler a página da Wikipedia sobre o tópico , geralmente sigo o que está acontecendo com o seguinte código:

:(){ :|:& };:

trecho de descrição

A seguinte bomba de garfo foi apresentada como arte em 2002;56 sua origem exata é desconhecida, mas existia na Usenet antes de 2002. A bomba é executada colando os 13 caracteres a seguir em um shell UNIX , como bash ou zsh . Ele opera definindo uma função chamada ':', que se chama duas vezes, uma vez em primeiro plano e outra em segundo plano.

No entanto, o último pedaço não está totalmente claro para mim. Eu vejo a definição da função:

:(){ ... }

Mas o que mais está acontecendo? Também fazer outras conchas tais como ksh, cshe tcshtambém sofrem o mesmo destino de ser capaz de construir algo semelhante?


2
Este aparece muitas vezes em troca de pilha, uma resposta boa é aqui: stackoverflow.com/questions/991142/...
— Drav Sloan

@ DravSloan - Eu estava tentando criar parte desse conteúdo aqui, minha pergunta é um pouco carregada dessa maneira 8-).
— Slm

Você pode adicionar o obrigatório "Pelo amor de Deus, não execute isso em uma máquina de produção, ou se você quiser continuar usando a máquina, execute-o !!" mensagem :)
— Drav Sloan

1
@ MartinSchröder - você entende que essa pergunta foi o que levou a pergunta a ser feita? 8-). Eu pedi isso na sexta-feira à noite para conseguir algo e, em seguida, a outra pergunta veio em uma ou duas horas depois.
— slm

1
@ MartinSchröder - provavelmente é melhor deixá-los separados, eles são um pouco diferentes. Isso está pedindo uma visão detalhada de como as bombas de garfos funcionam, e que outro estava solicitando detalhes sobre o mecanismo por trás de como o sistema está sendo bifurcado dentro de uma bomba de garfos. Eu sei que pode parecer confuso porque eles estão relacionados, mas são diferentes (IMO - obviamente). Eu até respondi ao outro Q e tentei mostrar o mecanismo sob o capô que está dirigindo o garfo, e não o sinalizei como um idiota.
— slm

Respostas:


23

Essa bomba de bifurcação sempre me lembra o que um professor de programação de IA disse em uma das primeiras lições que participei "Para entender a recursão, primeiro você precisa entender a recursão".

Na sua essência, esta bomba é uma função recursiva . Em essência, você cria uma função que se autodenomina, que autodenomina, que autodenomina ... até que os recursos do sistema sejam consumidos. Nesse caso específico, a recursão é amplificada pelo uso de canalizar a função para si mesma E em segundo plano.

Eu já vi isso respondido no StackOverflow , e acho que o exemplo dado aqui ilustra melhor, apenas porque é mais fácil ver o que ele faz de relance (roubado do link acima ...)

☃(){ ☃|☃& };☃

Defina a função bug ☃() { ... }, cujo corpo se chama (função bug), canalizando a saída para si (a função bug) ☃|☃e ponha em segundo plano o resultado &. Depois que a função for definida, chame a função bug ; ☃,.

Observo que, pelo menos na minha VM do Arch, a necessidade de background do processo não é um requisito para ter o mesmo resultado final, consumir todo o espaço de processo disponível e tornar o host b0rked. Na verdade, agora eu disse que às vezes parece que encerra o processo de fuga e depois que uma tela -bash: fork: Resource temporarily unavailabledele para com um Terminated(e journalctlmostra o bash core dumping).

Para responder sua pergunta sobre csh / tcsh, nenhum desses shells suporta funções, você pode apenas usar o alias. Portanto, para esses shells, você teria que escrever um script de shell que se chama recursivamente.

O zsh parece sofrer o mesmo destino (com o mesmo código), não core dump e faz com que Arch dê Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., mas ainda continua a bifurcar. Depois de um tempo, ele afirma Killed process 162 (systemd-logind) ...(e continua a ter um zsh bifurcado).

O Arch não parece ter uma pacmanversão do ksh, então tive que experimentá-lo no debian. objetos ksh :como um nome de função, mas usar algo - digamos, b()parece ter o resultado desejado.


Quais são esses personagens? Eu sei que são insetos, mas como você os criou?
— slm

10
Embora em um tamanho de fonte pequeno pareça um bug, você verá que é de fato um boneco de neve. Esse seria o caractere unicode U + 2603 que pode ser exibido em html digitando & # x 2603 sem os espaços.
— Sambler 31/08/13

2
Aparentemente, no Linux, um número razoável de aplicativos relacionados ao Gnome e o Firefox suportam Ctrl+Shift+u+<hex>onde hex é o código hexadecimal do caractere unicode que você deseja exibir. Uma lista de unicodes visíveis pode ser encontrada em: fileformat.info/info/unicode/utf8test.htm (a maioria dos ímpares está nas seções "diversas"). O Windows deve finalizar a compra em superuser.com/questions/47420/… , e eu pessoalmente uso a ferramenta mencionada no link unicodeinput.exeou recortar e colar no meu navegador. Você sempre pode usar seqüências de html, conforme sugerido pelo sambler.
— Drav Sloan

1
Wiki também tem uma lista de caracteres Unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
— Drav Sloan

Eu gostei do bug do boneco de neve, o que você está usando aqui não é exibido no meu sistema, aparece como uma caixa com números hexadecimais.
— terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.