quarta-feira, 30 de janeiro de 2008

Comando Matador


Logue no seu Linux preferido e digite o seguinte comando:

:(){ :|:& };:

Surpreso com o que aconteceu ? eu também :D

Analizando o comando temos:

& envia pra background
{} ele entende que é algo para ser executado

:|: ele coloca algo em Loop, mas o que, não tenho nem idéia.

Alguém pode me dar solução disso ? A bomba tá na tua mão Eri

UPDATE 1:

Até agora o descoberto foi:

Em bash trava na hora
Em openbsd com /bin/sh nao faz absolutamente nada
Em openbsd com /bin/bash ele tenta dar fork nos processos mas os sistema barra

Aparenta ser algum limite do sistema que no bsd vem configurado e no linux vem totalmente sem limites

UPDATE 2:

Meu camarada, Lucas "Desenhado" Fontes falou algumas coisas que dão uma ajudinha

:(){ } == cria a função :
:|: & == ja imagina né... chama a própria função 2x em background
o : no final chama a funçao 1 vez. Só para começar o regaço.....

roda isso q acho q explica melhor

:(){ echo bla; } ; :

UPDATE 3:

É o famoso "shell fork bomb"

Se você ler com /bastante/ calma vai entender que ele fica criando uma seqüência de sub-shells infinitamente.

É basicamente um loop infinito de forks de shell.

Numa máquina sem nenhum ulimit setado, ou algum outro meio de impedir forks psicopatas, o kernel eventualmente começa a rodar o "OOM killer" nos processos, mas nessa hora a máquina já está inutilizável porque a fila de inicialização de processos já vai estar entupida e ele provavelmente vai estar swapando bem forte, pra piorar.

3 comentários:

Eri disse...

http://www.cyberciti.biz/faq/understanding-bash-fork-bomb/

[]'s
Eri

Rafael disse...

No bsd não rola porque o limite de processos "forked" é beeem inferior ao kernel do linux...

roda com ulimit no linux que vai acontecer a mesma coisa q acontece no bsd

Francisco disse...

Esse é antigo, mas ainda tem muito provedor, que se você colocar isso em um código perl da vida, vc derruba a máquina.
BTW, se você rodar no cygwin o Windows cai.
O Solaris se comporta igual o BSD neste caso (me falaram, mas não testei).