Bombas, pingüinos y bifurcaciones

O lo que es lo mismo, forkbombs para linux. En los últimos días he visto esta línea bastantes veces:

:(){ :|:&};:

La última ha sido en el blog de Gringo, compañero de Fentlinux que acaba de inaugurar su blog. Desde aquí aprovecho para decir que ya forma parte de mi blogroll y que os recomiendo que le echeis un vistazo completo ahora que tiene pocos posts. Seguro que os engancha.

Pero vayamos al grano. ¿Qué es un forkbomb? Pues es un ataque de denegación de servicio basado en la función fork. Y ahora bien, ¿para qué sirve esta función?. Pues para dos cosas: la primera es para hacer que me rompiera la cabeza el año pasado con una práctica de Sistemas Operativos ( al final la resolvimos con threads para no tener que pensar más de la cuenta xD). Y la segunda y más importante es para crear un proceso igual al que llama a la función. De esta forma, tendríamos un proceso (padre) y un proceso (hijo) corriendo en el sistema.

Un forkbomb crea un gran número de procesos que saturan la tabla de procesos, consumen CPU y ocupan memoria. El resultado: el sistema se cuelga.

Ahora podemos pasar a explicar la línea anterior. :(){ :|:&};:

Estamos creando una función llamada :. La función no tiene parámetros, de ahí los () vacíos. Y la implementación de la función, entre { } lo único que hace es llamar a la propia función recursivamente y redireccionar la salida a otra llamada de la función { : | : & }. El & hace que la tarea corra en background, por lo que no moriá si el proceso padre lo hace. Cuando la función ya está declarada, la llamamos.

Hay otras formas de crear un forkbomb. Por ejemplo en C.

int main()
{
while(1) { fork(); }
return 0;
}

Podemos “solucionar” hasta cierto punto este problema con el comando ulimit. Para ver su uso acudid a la pagina correspondiente del manual. ¿ man ulimit no funciona? Es normal, probad con man bash 1 y buscad ulimit. Si no sabéis buscar en las páginas os digo cómo: escribid /ulimit y pulsad ENTER; esto subrayará todos los “ulimit” que encuentre y os llevará directamente hasta el primero.

Podéis mirar esta página de debian.org que habla sobre como asegurar un sistema. En el punto 4.11.2 habla sobre la configuración del fichero /etc/security/limits.conf. Copio y pego la configuración de límites para un usuario normal.

$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) 102400
file size (blocks, -f) 2048
max locked memory (kbytes, -l) 10000
max memory size (kbytes, -m) 10000
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 100
virtual memory (kbytes, -v) unlimited

Como véis, entre otras cosas, se limita el numero de procesos a 100 para este usuario. Si vostros hacéis un ulimit -a, seguramente comprobaréis que lo teneis como unlimited

Ahora ya sabéis por qué no se deben introducir comandos desconocidos en Linux. La próxima entrega será: rm -rf / o la eterna novatada xD.

En serio. Si alguna vez véis algo y no sabéis para que sirve: informáos. No hagáis nada sin saber para qué sirve. Y esto mismo lo podéis aplicar si un amiguito os dice en el IRC que un deltree *.* sirve para juankear el jotmeil de vuestras novias o si tenéis pensado jugar con ulimit o con el fichero limits.conf. Limitar el número de procesos a 0 no sería buena idea, por ejemplo. Leed el manual y buscad más manuales antes de hacer nada.

NOTA: También podéis hacer backups y echar competiciones para ver quien rompe todo antes.

Escrito en Hacking.

3 comentarios para “Bombas, pingüinos y bifurcaciones”

  1. Liamngls Dice:

    El blog de gringo, eso no me lo pierdo yo … :-)

  2. Root Zero Dice:

    Si es que tienes que volver un poco a tus raíces, que no sólo de Meneame se informa el homber. ;)

  3. Liamngls Dice:

    Ahora, ahora, cuando me instale el Debian ese, en algún lado tendré que incordiar con mi n00b dudas … :lol:

Escribe un comentario