Una fork bomb (bomba fork) es una forma de ataque del tipo denial-of-service (DoS) o denegación de servicio, utilizada contra sistemas basados en Unix. Como su nombre lo indica, utiliza la operación fork, donde un proceso crea una copia de sí mismo.

La conocida cadena :(){ :|:& };: no es nada más que una función de bash, la cual se ejecuta recursivamente. Comúnmente, es utilizada por sysadmins para testear limitaciones sobre usuarios en cuanto a cantidad de procesos que pueden ejecutar en un servidor.

En linux, dichos límites de procesos pueden ser configurados desde /etc/security/limits.conf o vía el módulo pam_limits de Linux-PAM desde /etc/security/limits.d y así poder evitar esta forma de ataque. Una vez activada la bomba de forma exitosa en el sistema, puede no ser posible retornar a un estado de operación normal sin tener que realizar un reboot forzado, ya que la única solución a una fork bomb es destruir todas las instancias de la misma.

WARNING: Los siguientes ejemplos pueden crashear tu sistema.

Analizando el código de la fork() Bomb :(){ :|:& };:

:() - Define una función con nombre :. Es una función que no acepta argumentos. La sintáxis de una función en Bash tiene la siguiente forma:

foo(){
    arg1=$1
    arg2=$2
    echo 'Bar...'
    #do_something on $arg argument
}

La fork() bomb se define de la siguiente manera:

 :(){
     :|:&
 };:

:|: - La función se llama a sí misma (recursión) y redirecciona el output o salida, utilizando el operador pipe |, a otra llamada de la de la misma funcion :. La magia está en que se llama dos veces a la función y así comienza el bombardeo al sistema.

& - Pone el llamado de la función en background de manera que los procesos hijos (copias) no mueran y así se comen los recursos del sistema.

; - Finalización de la definición de la función

: - Llamado (call) de la función, AKA setteo de la bomba.

De manera un poco más legible, la función se puede definir de la siguiente manera:

bomb() {
    bomb | bomb &
}; bomb

Un sistema Unix correctamente configurado no debería caerse cuando se dispara una fork bomb.

Previniendo una fork bomb en Linux

Una posible forma de prevenir el ataque es limitando el numero de procesos que pueden correr los usuarios. La información de la cantidad máxima actual se puede obtener ejecutando el siguiente comando:

ulimit -u

Otra forma:

ulimit -a

Ejecución comando ulimit -a

El número 50922 indica que el usuario puede correr 50922 procesos. Para proteger el sistema de una fork bomb, es necesario disminuir dicho valor. Para limitar la sesión a, por ejemplo, 5000 procesos, se utiliza el siguiente comando:

ulimit -S -u 5000

WARNING: No utilices valores de ulimit muy bajos! Esto puede ocasionar problemas a la hora de trabajar con el sistema.

Ahora, al correr la fork bomb:

:(){ :|:& };:

Se obtendrá el siguiente output:

bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable

De esta forma, estaríamos evitando este tipo de ataques. Se puede ver además, corriendo el comando pgrep, la cantidad límite (actual) the threads:

pgrep -wcu $USER

Salida de ejemplo:

5002

Ahora podes comprar la remera forkbomb en la tienda de sysarmy o el sticker pack con la forkbomb y explicarle a todos que significa!

Artículo original en cybercity.biz, traducción al español efsbl, revisó @jedux.