Articulo de referencia

bomba de tenedor

El concepto detrás de una bomba de bifurcación es que los procesos se replican continuamente, lo que potencialmente puede causar una denegación de servicio. Una bomba fork (tamb...

El concepto detrás de una bomba de bifurcación es que los procesos se replican continuamente, lo que potencialmente puede causar una denegación de servicio.

Una bomba fork (también llamada virus conejo o virus hidra ) es un ataque de denegación de servicio (DoS) contra una computadora en el que un proceso se replica continuamente para agotar los recursos del sistema disponibles, lo que ralentiza o bloquea el sistema debido a la falta de recursos .

Historia

Hacia 1978, se informó que una variante temprana de una bomba de horquilla llamada Wabbit se ejecutaba en un System/360 . Es posible que derive de un ataque similar llamado RABBITS , reportado en 1969 contra un Burroughs 5500 en la Universidad de Washington . [ 1 ]

Desde 2011, Linux tiene un límite predeterminado de nproc que se puede especificar ulimit -upara mitigar las bombas de bifurcación y los problemas relacionados.

Implementación

Demostración de una bomba fork en Arch Linux

Las bombas de bifurcación operan tanto consumiendo tiempo de CPU en el proceso de bifurcación como 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 fork generalmente se escriben para usar la llamada al sistema fork . [ 3 ] Como los procesos fork 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 al bifurcar nuevos procesos, [ 4 ] una bomba fork 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, un ataque fork en dicho sistema operativo debe crear un nuevo proceso en lugar de bifurcarse de uno existente, como ocurre con el procesamiento por lotes.echo %0^|%0 > $_.cmd & $_. En este script por lotes, %0|%0se escribe en $_.cmd, que luego es ejecutado por & $_. [ 6 ]

Un ejemplo clásico de una bomba fork es una escrita en la shell de Unix.:(){ :|:& };:, que data de al menos 1999, [ 7 ] que se puede entender más fácilmente como

fork () { fork | fork & } ; tenedor 

En él, una función se define ( fork()) como llamándose a sí misma ( fork), luego canalizando ( |) 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 intérprete de comandos según la definición de POSIX, que solo permite caracteres alfanuméricos y guiones bajos en los nombres de las funciones. [ 8 ] Sin embargo, su uso está permitido en GNU Bash como extensión. [ 9 ]

La implementación tradicional en C (utilizando los encabezados POSIX ) es:

#include <unistd.h>int main () { while ( true ) { fork (); } }

Esto llama repetidamente a la fork()función, duplicando el proceso actual, en el archivo de cabecera <unistd.h> . Se han creado varias formas de este tipo de bomba fork. [ 10 ]

Prevención

Como el modo de operación de una bomba fork está completamente encapsulado mediante la creación de nuevos procesos, una forma de evitar que una bomba fork 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 ulimit ; por ejemplo, el comando ulimit -u 30limitaría al usuario afectado a un máximo de treinta procesos propios. [ 11 ] En sistemas habilitados para PAM , este límite también se puede establecer en /etc/security/limits.conf, [ 12 ] y en *BSD, el administrador del sistema puede establecer límites en /etc/login.conf. [ 13 ] Los sistemas Linux modernos también permiten una prevención más granular de bombas fork a través de cgroups y controladores de número de proceso (PID). [ 14 ]

Véase también

Referencias

  1. ^ Raymond, Eric S. (1 de octubre de 2004). "wabbit" . El léxico de la jerga. Archivado desde el original el 15 de mayo de 2012 . Consultado el 15 de octubre de 2013 .
  2. Ye, Nong (2008). Sistemas informáticos y de red seguros: modelado, análisis y diseño . John Wiley & Sons. pág. 16. ISBN  978-0470023242.
  3. 1 2 Jielin, Dong (2007). Diccionario de redes . pág. 200. ISBN  978-1602670006.
  4. Dhamdhere, Dhananjay M. (2006). Sistemas operativos: Un enfoque basado en conceptos . McGraw-Hill Higher Education. pág. 285. ISBN  0-07-061194-7.
  5. Hammond, Mark (2000). Python Programming On Win32: Help for Windows Programmers . O'Reilly Media, Inc. p. 35. ISBN  1565926218.
  6. Enderman (26-06-2024). @echo.%0^|%0›$^_^.c^md&$_›nul . Recuperado el 30-06-2024 vía YouTube.
  7. Michal Zalewski (1999-08-19). "[RHSA-1999:028-01] Desbordamiento de búfer en libtermcap tgetent()" . Grupo de noticias : muc.lists.bugtraq . Consultado el 10 de diciembre de 2022 . bash$ :(){ :|:&};:}
  8. "Especificaciones base de The Open Group, edición 7, 2018, IEEE Std 1003.1-2017, Sección 3.235" . The Open Group/IEEE. Nombre: En el lenguaje de comandos de shell, una palabra que consta únicamente de guiones bajos, dígitos y letras del conjunto de caracteres portátil. El primer carácter de un nombre no es un dígito.
  9. "Manual de referencia de GNU Bash, sección 3.3" . Consultado el 11 de diciembre de 2022. Cuando el intérprete de comandos está en modo POSIX (véase Modo POSIX de Bash), `fname` debe ser un nombre de intérprete de comandos válido y no puede ser igual a uno de los comandos integrados especiales (véase Comandos integrados especiales). En el modo predeterminado, el nombre de una función puede ser cualquier palabra del intérprete de comandos sin comillas que no contenga '$'.
  10. Michael Kerrisk (2025). "cgroups/fork_bomb.c (de "The Linux Programming MC Interface")" . man7.org . Formación en programación de sistemas Linux/UNIX.
  11. Cooper, Mendel (2005). Guía avanzada de scripting en Bash . págs. 305–306 . ISBN  1430319305.
  12. Soyinka, Wale (2012). Administración de Linux: Guía para principiantes . McGraw Hill Professional. págs. 364–365 . ISBN  978-0071767590.
  13. Lucas, Michael W. (2007). Absolute FreeBSD: La guía completa de FreeBSD . No Starch Press. págs. 198–199 . ISBN  978-1593271510.
  14. "Controlador de número de proceso en la documentación/tal como aparece en el kernel de Linux 5.3" . 8 de octubre de 2019. Archivado del original el 8 de octubre de 2019. Consultado el 8 de octubre de 2019 .
  • Ejemplos de ataques de bifurcación en GitHub