Una bomba de bifurcación es un programa malicioso o escrito erróneamente que crea copias de sí mismo sin cesar (usando la llamada al sistema fork() ), que generalmente también comienza a crear copias de sí mismo, etc.
La ejecución de un programa de este tipo puede causar una gran carga en el sistema informático o incluso una denegación de servicio debido a la falta de recursos del sistema (manejadores de proceso, memoria, tiempo de procesador), que es el objetivo.
El clásico programa fork bomb (escrito en C ) se ve así:
#include <unistd.h> int principal () { mientras ( 1 ) tenedor (); }Casos similares de fugas de recursos del sistema son los programas que generan zombis y procesos huérfanos . Sin embargo, si la mayoría de las bombas de bifurcación se crean intencionalmente, estos problemas suelen ser el resultado del descuido o la incompetencia del programador.
La bomba de bifurcación genera una gran cantidad de copias de sí misma y, por lo tanto, intenta llenar el espacio libre en la lista de procesos activos del sistema operativo . Después de completar la lista de procesos, se vuelve imposible iniciar un programa útil. Incluso si algún otro proceso termina y queda libre espacio en la lista de procesos, es poco probable que se inicie un programa útil, ya que muchas otras copias de la bomba de la bifurcación ya están esperando la oportunidad de iniciar su próxima copia.
Además de completar la lista de procesos, las estrategias también son posibles para completar la memoria virtual, el tiempo de CPU, los sockets y otros recursos del sistema. El resultado del agotamiento de estos recursos es la ralentización o prácticamente paralización del sistema operativo y/o programas útiles ( la computadora se congela ).
También se puede obtener una bomba de horquilla como resultado de un error en la programación concienzuda. Por ejemplo, un programa que escucha en un puerto de red puede, al recibir un paquete de red o establecer una conexión, "caer" en un ciclo interminable de creación de copias de sí mismo para procesar el paquete o la conexión. Un simple error de programación puede provocar una pérdida de memoria o las consecuencias de una bomba de bifurcación.
o:
#include <unistd.h> int principal ( vacío ) { while ( tenedor ()) {}; } : (){ : | : & } ; :o
tenedor () { tenedor | tenedor y } tenedorJava :
public class forkbomb { public static void main ( String [] args ) { Runtime . obtener tiempo de ejecución (). exec ( new String [] { "javaw" , "-cp" , System . getProperty ( "java.class.path" ), "forkbomb" }); } }Perla :
tenedor mientras tenedorPitón :
importar sistema operativo mientras que Verdadero : os . tenedor ()En algunos sistemas, dicha llamada está prohibida, la copia solo es posible si se guarda la ID del proceso:
importar sistema operativo mientras que Verdadero : a = os . tenedor ()rubí :
tenedor mientras tenedorSegunda opción:
bucle { bifurcación } <?php while ( verdadero ) { pcntl_fork (); }Archivo por lotes de Microsoft Windows :
: s inicio %0 ir a : sSegunda opción
inicio %0 %0Variante en VB.NET
HacerSistema ._ _ diagnósticos _ proceso _ Inicio ( Sistema . Reflexión . Ensamblaje . GetExecutingAssembly (). Ubicación ) Bucle Mientras sea verdadero alg ProgramX while true nc call ProgramX cc con alg ProgramXEn el caso de una bomba de horquilla exitosa, se vuelve difícil o casi imposible restablecer el funcionamiento normal de la computadora sin reiniciar , ya que la única forma de detener el funcionamiento de la bomba de horquilla es detener simultáneamente todas las copias en ejecución de la bomba de horquilla. En la mayoría de las implementaciones de sistemas operativos, llamar a un comando para eliminar un proceso requiere iniciar un nuevo proceso, lo que no es posible en las condiciones de una bomba de bifurcación que se ejecuta con éxito.
Sin embargo, en la práctica, algunas bombas de horquilla no requieren medidas tan drásticas y pueden destruirse sin necesidad de reiniciar. Considere, por ejemplo, el caso de la bomba del ejemplo anterior:
: (){ : | : & } ; :La peculiaridad de este código es que no realiza un bucle después de la generación fallida de sus copias, sino que sale. Como resultado, la lista de procesos está constantemente a punto de llenarse: una de las copias de la bomba de horquilla se termina y el espacio liberado es ocupado inmediatamente por un proceso recién creado a partir de otra copia de la bomba de horquilla. Es posible competir con la bomba de horquilla por espacio en la lista de procesos. Entonces es posible, tarde o temprano, ejecutar un comando para matar todas las copias de la bomba de la bifurcación al mismo tiempo, o ejecutar un programa seguro que "recuperará" gradualmente un lugar en la lista de procesos hasta el último proceso de la bifurcación. termina la bomba. Un ejemplo de un programa tan seguro en zsh :
mientras ( dormir 100 & ! ) hacer ; hechoUna forma de prevenir los efectos negativos de una bomba de bifurcación es limitar por la fuerza la cantidad de procesos que un usuario puede ejecutar al mismo tiempo. La cantidad de memoria virtual asignada y otros recursos del sistema también pueden estar limitadas. Cuando se agota el número máximo de procesos disponibles, el intento del proceso de crear un nuevo proceso fallará. La cantidad máxima de procesos que se pueden iniciar debe ser tal que le permita ejecutar una cantidad útil razonable de programas, pero que no provoque un bloqueo del sistema cuando se lanza una bomba de bifurcación desde todos los usuarios del sistema al mismo tiempo.
Cabe señalar que limitar la cantidad de procesos en sí mismo no evita el lanzamiento de una bomba de horquilla, sino que solo tiene como objetivo minimizar el posible daño si se activa.
Otra solución al problema es el reconocimiento inteligente de la bomba de horquilla por medio del propio sistema operativo, pero esta solución no ha encontrado una amplia aplicación.
También existe tal dificultad que si una bomba de bifurcación toma todo el tiempo disponible del procesador, los resultados de su trabajo pueden ser catastróficos no solo en un solo procesador, sino también en un sistema multiprocesador, incluso con un límite en la cantidad de procesos. . Por ejemplo, si la cantidad de procesadores es 16 y la cantidad máxima de procesos en ejecución es 100, entonces para cada procesador habrá un promedio de 6-7 instancias en ejecución de la bomba de bifurcación, devorando el tiempo del procesador. Para resolver este problema, se aplica un límite de afinidad de procesador.