O que significa este comando críptico de Bash?

23

Eu estava lendo o aviso do Ubuntu Forum sobre comandos maliciosos e encontrei esta interessante jóia:

:(){ :|:& };:

WARNING: The above code will crash your machine unless you have strict proc limits in place (which you probably don't) prompting a hard restart.

Consider this code similar to running sudo rm -rf /.

Mas o que isso significa? Mesmo com minha experiência em programação, nunca vi um comando que não fosse uma linguagem assembly.

    
por TheLQ 23.07.2010 / 06:37

3 respostas

40

É, como você disse, uma bifurcação. O que ele faz é definir uma função e chamá-la. A função é chamada : .

Vamos citar forkbomb para podermos ver melhor o que está acontecendo:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Como você pode ver e provavelmente adivinhar a partir de sua experiência de programação, a primeira parte é a definição da função ( forkbomb(){ ... } ), e o último : é onde a função é chamada (o ; apenas separa instruções em Bash).

Agora, o que essa função faz? Se você estiver familiarizado com o Bash, saberá que o caractere | canaliza a saída padrão de um comando / programa para a entrada padrão de outro. Então, basicamente, :|: inicia duas instâncias da função (isso é onde "forks").

E então a mágica: o & coloca esses comandos em segundo plano, permitindo que a função original retorne, enquanto cada instância se bifurca até que as vacas voltem para casa em segundo plano, usando assim todos os seus recursos e derrubando as sistema (a menos que tenha limites impostos).

    
por 23.07.2010 / 06:42
9

Extraído do artigo da Wikipedia Forkbomb :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.
    
por 23.07.2010 / 06:40
7

Detalhado:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

Altere : para bomb e você tem:

bomb(){ bomb|bomb& };bomb

É realmente muito elegante.

    
por 23.07.2010 / 06:42

Tags