En informática , una bomba de bifurcación (también llamada virus conejo ) es un ataque de denegación de servicio (DoS) en el que un proceso se replica continuamente para agotar los recursos disponibles del sistema, ralentizando o haciendo colapsar el sistema debido a la falta de recursos .
Alrededor de 1978, se informó que una variante temprana de una bomba de horquilla llamada wabbit se ejecutó en un System/360 . Es posible que descienda de un ataque similar llamado RABBITS informado en 1969 en un Burroughs 5500 en la Universidad de Washington . [1]
Las bombas de bifurcación funcionan consumiendo tiempo de CPU en el proceso de bifurcación y saturando la tabla de procesos del sistema operativo . [2] [3] Una implementación básica de una bomba de bifurcación es un bucle infinito que lanza repetidamente nuevas copias de sí mismo.
En los sistemas operativos tipo Unix , las bombas de bifurcación generalmente se escriben para usar la llamada al sistema fork . [3] Como los procesos bifurcados también son copias del primer programa, una vez que reanudan la ejecución desde la siguiente dirección en el puntero de marco , continúan bifurcándose sin fin dentro de su propia copia del mismo bucle infinito; esto tiene el efecto de causar un crecimiento exponencial en los procesos. Como los sistemas Unix modernos generalmente usan una técnica de administración de recursos de copia en escritura cuando bifurcan nuevos procesos, [4] una bomba de bifurcación generalmente no saturará la memoria de dicho sistema.
Los sistemas operativos Microsoft Windows no tienen una funcionalidad equivalente a la llamada al sistema fork de Unix; [5] por lo tanto, una bomba fork en un sistema operativo de este tipo debe crear un nuevo proceso en lugar de bifurcarse de uno existente, como sucede con el proceso por lotes echo %0^|%0 > $_.cmd & $_
. En este script por lotes, %0|%0
se escribe en $.cmd
, que luego es ejecutado por & $_
. [6]
Un ejemplo clásico de una bomba fork es una escrita en el shell de Unix :(){ :|:& };:
, que posiblemente data de 1999, [7] que puede entenderse más fácilmente como
tenedor () { tenedor | tenedor & } tenedor
En él, una función se define ( fork()
) como si se llamara a sí misma ( fork
), para luego canalizar ( |
) su resultado hacia sí misma, todo en un trabajo en segundo plano ( &
).
El código que utiliza dos puntos :
como nombre de función no es válido en un shell según lo definido por POSIX, que sólo permite caracteres alfanuméricos y guiones bajos en los nombres de funciones. [8] Sin embargo, su uso está permitido en GNU Bash como una extensión. [9]
Como el modo de operación de una bomba de bifurcación está completamente encapsulado mediante la creación de nuevos procesos, una forma de evitar que una bomba de bifurcación afecte gravemente a todo el sistema es limitar el número máximo de procesos que un solo usuario puede poseer. En Linux, esto se puede lograr utilizando la utilidad ulimitulimit -u 30
; por ejemplo, el comando limitaría al usuario afectado a un máximo de treinta procesos propios. [10]
En los sistemas habilitados para PAM , este límite también se puede establecer en /etc/security/limits.conf
, [11]
y en *BSD, el administrador del sistema puede poner límites en /etc/login.conf
. [12]
Los sistemas Linux modernos también permiten una prevención de bombas de bifurcación más detallada a través de cgroups y controladores de número de proceso (PID). [13]
bash$ :(){ :|:&};:}
Nombre: En el lenguaje de comandos del shell, una palabra que consiste únicamente en guiones bajos, dígitos y letras del conjunto de caracteres portables. El primer carácter de un nombre no es un dígito.
Cuando el shell está en modo POSIX (consulte Modo POSIX de Bash), fname debe ser un nombre de shell válido y no puede ser el mismo que uno de los comandos incorporados especiales (consulte Comandos incorporados especiales). En el modo predeterminado, un nombre de función puede ser cualquier palabra de shell sin comillas que no contenga '$'.