¿Cómo funciona una bomba tenedor?

22
  • ADVERTENCIA NO INTENTE EJECUTAR ESTO EN UNA MÁQUINA DE PRODUCCIÓN

Al leer la página de Wikipedia sobre el tema , generalmente sigo lo que sucede con el siguiente código:

:(){ :|:& };:

extracto de la descripción

La siguiente bomba tenedor se presentó como arte en 2002;5 56 su origen exacto es desconocido, pero existía en Usenet antes de 2002. La bomba se ejecuta pegando los siguientes 13 caracteres en un shell de UNIX como bash o zsh . Funciona definiendo una función llamada ':', que se llama a sí misma dos veces, una en primer plano y otra en segundo plano.

Sin embargo, la última parte no está del todo clara para mí. Veo la definición de la función:

:(){ ... }

¿Pero qué más está pasando? ¿También otros proyectiles como ksh, cshy tcshtambién sufren el mismo destino de poder construir algo similar?

slm
fuente
2
Este aparece con bastante frecuencia en el intercambio de pila, una buena respuesta está aquí: stackoverflow.com/questions/991142/…
Drav Sloan
@DravSloan: estaba intentando crear parte de ese contenido aquí, mi pregunta está un poco cargada de esa manera 8-).
slm
Es posible que desee agregar el obligatorio "¡Por amor de Dios, no ejecute esto en una máquina de producción, o si desea continuar usando la máquina, hágalo!" mensaje :)
Drav Sloan
1
@ MartinSchröder: ¿comprende que esta pregunta fue lo que condujo a esa pregunta? 8-). Le pregunté esto un viernes por la noche para poner algo en marcha y luego la otra pregunta llegó en una hora o dos después.
slm
1
@ MartinSchröder: probablemente sea mejor dejarlos separados, son ligeramente diferentes. Esto está pidiendo una visión completa y detallada de cómo funcionan las bombas de horquilla, que otra preguntaba por detalles sobre el mecanismo detrás de cómo el sistema se bifurca dentro de una bomba de horquilla. Sé que puede parecer confuso porque están relacionados, pero son diferentes (OMI, obviamente). Incluso respondí a la otra Q e intenté mostrar el mecanismo debajo del capó que impulsa la bifurcación, y no lo señalé como dup.
slm

Respuestas:

23

Esta bomba tenedor siempre me recuerda lo que dijo un profesor de programación de IA en una de las primeras lecciones a las que asistí "Para comprender la recursividad, primero debes comprender la recursividad".

En esencia, esta bomba es una función recursiva . En esencia, crea una función, que se llama a sí misma, que se llama a sí misma, que se llama a sí misma ... hasta que se consuman los recursos del sistema. En este caso específico, la recursión se amplifica mediante el uso de canalizar la función hacia sí misma Y trasladarla en segundo plano.

He visto esto respondido en StackOverflow , y creo que el ejemplo dado allí lo ilustra mejor, solo porque es más fácil ver lo que hace de un vistazo (robado del enlace de arriba ...)

☃(){ ☃|☃& };☃

Defina la función de error ☃() { ... }, cuyo cuerpo se llama a sí mismo (la función de error), canalizando la salida a sí mismo (la función de error) ☃|☃y trasfondo del resultado &. Entonces, después de definir la función, en realidad llamar a la función error, ; ☃.

Observo que al menos en mi Arch VM, la necesidad de poner en segundo plano el proceso no es un requisito para tener el mismo resultado final, para consumir todo el espacio de proceso disponible y hacer que el host se bloquee. En realidad, ahora he dicho que a veces parece terminar el proceso de fuga y después de una pantalla completa -bash: fork: Resource temporarily unavailablese detendrá con un Terminated(y journalctlmuestra bash core dump).

Para responder a su pregunta sobre csh / tcsh, ninguno de esos shells admite funciones, solo puede usar alias. Entonces, para esos shells, tendría que escribir un script de shell que se llame a sí mismo de forma recursiva.

zsh parece sufrir el mismo destino (con el mismo código), no volca el núcleo y hace que Arch ceda Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., pero aún continúa bifurcando. Después de un tiempo, luego declara Killed process 162 (systemd-logind) ...(y aún continúa teniendo una bifurcación zsh).

Arch no parece tener una pacmanversión de ksh, así que tuve que probarlo en Debian. ksh se opone a :como un nombre de función, pero usando algo, digamos, en b()cambio, parece tener el resultado deseado.

Drav Sloan
fuente
¿Qué son esos personajes? Sé que son errores, pero ¿cómo los hiciste?
slm
10
Si bien en un tamaño de fuente pequeño parece un error, encontrará que de hecho es un muñeco de nieve. Ese sería el carácter unicode U + 2603 que se puede mostrar en html ingresando & # x 2603 sin los espacios.
Sambler
2
Aparentemente, en Linux, un buen número de aplicaciones relacionadas con Gnome y Firefox admiten Ctrl+Shift+u+<hex>dónde hexadecimal es el código hexadecimal del carácter unicode que desea mostrar. Puede encontrar una lista de Unicode visible en: fileformat.info/info/unicode/utf8test.htm (la mayoría de los impares se encuentran en las secciones "misceláneas"). Windows debería pagar superuser.com/questions/47420/… , y yo personalmente uso la herramienta mencionada en el enlace unicodeinput.exeo cortar y pegar a través de mi navegador. Siempre puede usar secuencias html como lo sugiere sambler.
Drav Sloan el
1
Wiki también tiene una lista de caracteres Unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan
Me gustó el error del muñeco de nieve, el que está usando aquí no se muestra en mi sistema, 🐛 aparece como una caja con números hexadecimales.
terdon