Bomba fork - Wikipedia, la enciclopedia libre Ir al contenido

Bomba fork

De Wikipedia, la enciclopedia libre
Esquema de funcionamiento de la bomba fork, los procesos son divididos recursivamente hasta causar una denegación de servicio o un bloqueo del sistema.

Una bomba fork es una forma de ataque del tipo denegación de servicio sobre un computador implementando una operación fork o alguna otra funcionalidad equivalente mediante la cual un proceso es capaz de autorreplicarse. La bomba fork es considerado un wabbit ya que no se autorreplica de la misma forma que los gusanos o los virus. Su efecto se basa en la suposición de que el número de programas y procesos que se ejecutan simultáneamente en un ordenador tiene un límite.

Una bomba fork funciona creando una gran cantidad de procesos muy rápidamente con el objetivo de saturar el espacio disponible en la lista de procesos mantenida por el sistema operativo del computador. Si la tabla de procesos se llega a saturar, entonces no se pueden iniciar nuevos programas hasta que no se cierre alguno. En el caso de que esto suceda, es muy poco probable que se pueda iniciar un programa útil ya que los procesos de la bomba estarán esperando para poder crear nuevos procesos a la primera oportunidad que se les conceda.

Las bombas fork no sólo ocupan espacio dentro de la lista de procesos, también consumen tiempo de proceso y memoria de la máquina donde se ejecutan. Como resultado de esto, los ordenadores se vuelven lentos e incluso se pueden volver inutilizables dada la falta de memoria y la imposibilidad de aprovechar el procesador.

Dificultad de solución

[editar]

Una vez una bomba fork ha sido activada de forma "satisfactoria" en un sistema, puede que no sea posible ejecutar ninguna tarea sin un reinicio del sistema, ya que la única solución es detener todos los procesos iniciados por ella. Normalmente se requiere cargar un programa adicional para "matar" procesos, lo que puede no ser posible si no hay posiciones vacías dentro de la tabla de procesos o espacio dentro de las estructuras de memoria.

Prevención

[editar]

Una forma de prevenir el ataque de una bomba fork es limitar el número de procesos que un usuario puede ejecutar. Cuando un proceso intenta crear otro proceso y el propietario de dicho proceso ya posee la cantidad máxima de procesos que se le ha asignado, el intento de creación del nuevo proceso falla. El máximo número de procesos asignado a cada usuario debe ser lo suficientemente bajo para poder resistir la ejecución simultánea de una bomba fork por cada usuario y dejar libres los suficientes recursos como para poder restaurar el sistema.

Téngase en cuenta que la ejecución accidental de una bomba fork es altamente improbable en más de un usuario a la vez.

Los sistemas de tipo Unix típicamente tienen establecido este límite, controlado con el comando ulimit del shell. En los kernel Linux existe una variable llamada RLIMIT_NPROC, que indica la cantidad máxima de procesos que se puede ejecutar. Si un proceso intenta llamar a la función fork y el usuario propietario del proceso ya tiene igual o más procesos que los indicados en RLIMIT_NPROC la llamada a la función fallará.

Otra solución implica la detección de bombas fork antes de su ejecución por parte del sistema operativo, aunque eso supone más gasto de recursos por parte del sistema. Existe un módulo para el Kernel de Linux.[1]

Ejemplo de una bomba fork

[editar]

Código fuente de una bomba fork programada en Batch funcional en cualquier versión de Microsoft Windows:

%0|%0

O bien, una reacción más rápida:

:s
start "" %0
goto :s

Código fuente de una bomba fork programada en UNIX C o C++:

#include <unistd.h>

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

Bomba fork para bash de linux

:(){ :|:& };:

O de forma larga

#!/bin/bash
bomba() {
  bomba | bomba & 
}
bomba

En Perl:

fork while fork

En Python:

import os

while True:
     os.fork()

En Ruby:

def forkbomb
  loop { fork { forkbomb }  }
end; forkbomb

Véase también

[editar]

Referencias

[editar]
  1. Rohit Singh. «Fork Bomb Defuser!» (en inglés). Consultado el 2010.