Bombas fork, ¿que son? ¿como proteger el sistema de ellas?

En pocas palabras una “bomba fork” es un programa, función o proceso que crea a su vez otros procesos y estos a su vez crean otros más y asi sucesivamente hasta que agotan los recursos de la PC llenando la tabla de procesos. Llegará el momento en que nuestra computadora no tendra más memoria RAM donde albergar tantos procesos, hará uso muy lento del swapping pues el procesador seguira ocupado atendiendo esos procesos y finalmente habrá un cuelgue definitivo del sistema!

Lo anterior no indica ningún fallo o vulnerabilidad en el kernel del Sistema Operativo, aunque pienso que el planificador de procesos de cada Sistema Operativo deberia ser capaz de detener nativamente la ejecución de procesos cuando no se cuenten con los recursos suficientes! Sin embargo, esta es solo una suposición que hago.

Vamos a ver algunos ejemplos y luego distintas soluciones que podemos darle a este problema

El primero que conoci y con el cual me hice del shell de root en un ubuntu server (si, leiste bien):

Code:
#include <unistd.h>

int main () {
   while (true) {
      fork();
   } // while
} // main

Uno escrito con Perl:

Code:
perl -e "fork while fork"

Otro con BASH:

Code:
:(){ :¦:& };:

Este ultimo es el mas conocido y que se ha puesto de moda. Y es una versión ofuscada de:

Code:
forkbomb () {
   forkbomb | forkbomb &
} forkbomb

Para ejecutar este codigo no debemos estar logueados como root, por lo cual cualquier usuario normal lo puede ejecutar y saturar todos los recursos de nuestra PC.

¿COMO SOLUCIONARLO?

Existe un comando interno de BASH llamado ulimit

(para mayor explicacion sobre el comando: man ulimit)

La opcion -u en este comando, nos permite configurar el numero maximo de procesos que los usuarios pueden ejecutar por lo cual, de esta manera al llegar la fork bomb al limite de procesos, no puede sobrepasarlo por lo cual con un valor bien configurado no nos causaria problemas en el sistema.

Para ello ejecutamos

Code:
[vampird@sharwyn]:~$ ulimit -u 5000

Esta solución seria suficiente para solucionar esto, pero al momento de reiniciar nuestro sistema esta configuración se pierde.

Otra alternativa seria añadirlo al archivo /etc/profile y a /etc/bash.bashrc

Para evitar que se ejecute en sesiones de login y no-login.

Pero la forma estandar de hacerlo es añadiendolo a /etc/security/limits.conf

NOTA: En todos los script de BASH, como los que veeremos a continuación, todo lo precedido por # se lee como comentario. Siguiendo con el tema en una shell ejecutamos:

/etc/security/limits.conf:
[vampird@sharwyn]:~$ su - -c "vi /etc/security/limits.conf"
Password:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files
#        - rss - max resident set size (KB)
#        - stack - max stack size (KB)
#        - cpu - max CPU time (MIN)
#        - nproc - max number of processes
#        - as - address space limit (KB)
#        - maxlogins - max number of logins for this user
#        - maxsyslogins - max number of logins on the system
#        - priority - the priority to run user process with
#        - locks - max number of file locks the user can hold
#        - sigpending - max number of pending signals
#        - msgqueue - max memory used by POSIX message queues (bytes)
#        - nice - max nice priority allowed to raise to values: [-20, 19]
#        - rtprio - max realtime priority
#
#<domain>      <type>  <item>         <value>
#
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
%                hard    nproc           5000

# End of file
[vampird@sharwyn]:~$

Añadimos una linea (en el ejemplo ya esta añadida), con los siguientes valores.

% hard nproc 5000

Con esto limitamos a 5000 el numero maximos de procesos que puede ejecutar el usuario.

Bien, ya estaria hecho ahora solo basta reiniciar el PC y listo, ya estamos protegidos contra las fork bombs.

¿Como probarlo?, tipeamos lo siguiente:

Code:
[vampird@sharwyn]:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15879
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 1739608
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 5000
virtual memory          (kbytes, -v) 4998080
file locks                      (-x) unlimited
[vampird@sharwyn]:~$

Vemos el valor [max user processes] establecido en 5000 (5000 procesos como maximo puede ejecutar el usuario).

Por lo cual si somos valientes y nos animamos a probar: :(){ :¦:& };: podemos ver que no pasa absolutamente nada en nuestro sistema y no se cuelga.

=-=-=-=-=
Powered by Blogilo

Anuncios

Etiquetas: , , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: