Comment fonctionne une bombe à fourche?

22
  • AVERTISSEMENT N'ESSAYEZ PAS DE L'EXÉCUTER SUR UNE MACHINE DE PRODUCTION

En lisant la page Wikipedia sur le sujet, je suis généralement ce qui se passe avec le code suivant:

:(){ :|:& };:

extrait de description

La bombe à fourche suivante a été présentée comme art en 2002;56 son origine exacte est inconnue, mais elle existait sur Usenet avant 2002. La bombe est exécutée en collant les 13 caractères suivants dans un shell UNIX tel que bash ou zsh . Il fonctionne en définissant une fonction appelée «:», qui s'appelle deux fois, une fois au premier plan et une fois en arrière-plan.

Cependant, le dernier morceau n'est pas entièrement clair pour moi. Je vois la définition de la fonction:

:(){ ... }

Mais que se passe-t-il d'autre? Est-ce que d'autres obus tels que ksh, cshet tcshsubissent également le même sort de pouvoir construire quelque chose de similaire?

slm
la source
2
Celui-ci apparaît assez souvent sur l'échange de pile, une bonne réponse est ici: stackoverflow.com/questions/991142/…
Drav Sloan
@DravSloan - J'essayais de créer une partie de ce contenu ici, ma question est un peu chargée de cette façon 8-).
slm
Vous voudrez peut-être ajouter l'obligation "Pour l'amour de Dieu, ne l'exécutez pas sur une machine de production, ou si vous souhaitez continuer à utiliser la machine sur laquelle vous l'exécutez !!" message :)
Drav Sloan
1
@ MartinSchröder - vous comprenez que cette question a été la raison pour laquelle cette question a été posée? 8-). J'ai posé cette question un vendredi soir pour faire avancer les choses, puis l'autre question est venue dans une heure ou deux après.
slm
1
@ MartinSchröder - il est probablement préférable de les laisser séparés, ils sont légèrement différents. Cela demande une vue détaillée complète du fonctionnement des bombes à fourche, que l'autre demandait des détails sur le mécanisme derrière la façon dont le système bifurque dans une bombe à fourche. Je sais que cela peut sembler déroutant car ils sont liés, mais ils sont différents (OMI - évidemment). J'ai même répondu à l'autre Q et j'ai essayé de montrer le mécanisme sous le capot qui entraîne la fourche, et je ne l'ai pas signalé comme dup.
slm

Réponses:

23

Cette bombe fourchue me rappelle toujours quelque chose qu'un professeur de programmation d'IA a dit lors d'une des premières leçons auxquelles j'ai assisté "Pour comprendre la récursivité, vous devez d'abord comprendre la récursivité".

Au fond, cette bombe est une fonction récursive . En substance, vous créez une fonction, qui s'appelle, qui s'appelle, qui s'appelle .... jusqu'à ce que les ressources système soient consommées. Dans ce cas précis, la récursivité est amplifiée par l'utilisation de la fonction de tuyauterie pour elle-même ET de son arrière-plan.

J'ai vu cette réponse sur StackOverflow , et je pense que l'exemple donné ici l'illustre mieux, juste parce qu'il est plus facile de voir ce qu'il fait en un coup d'œil (volé à partir du lien ci-dessus ...)

☃(){ ☃|☃& };☃

Définissez la fonction de bogue ☃() { ... }, dont le corps s'appelle (la fonction de bogue), redirigez la sortie vers elle-même (la fonction de bogue) ☃|☃, et mettez le résultat en arrière-plan &. Puis, après la fonction est définie, appelez en fait la fonction de bogue, ; ☃.

Je note qu'au moins sur ma machine virtuelle Arch, la nécessité d'arrière-plan du processus n'est pas une exigence pour avoir le même résultat final, pour consommer tout l'espace de processus disponible et rendre l'hôte b0rked. En fait, maintenant, j'ai dit qu'il semblait parfois mettre fin au processus de fuite et qu'après une sélection, -bash: fork: Resource temporarily unavailableil s'arrêterait avec un Terminated(et montrait le vidage du journalctlnoyau bash).

Pour répondre à votre question sur csh / tcsh, aucun de ces shells ne prend en charge les fonctions, vous pouvez uniquement créer un alias. Donc, pour ces shells, vous devez écrire un script shell qui s'appelle récursivement.

zsh semble subir le même sort (avec le même code), ne fait pas de vidage de mémoire et oblige Arch à donner Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., mais il continue à bifurquer. Après un certain temps, il indique ensuite Killed process 162 (systemd-logind) ...(et continue d'avoir un zsh de fourche).

Arch ne semble pas avoir de pacmanversion de ksh, j'ai donc dû l'essayer sur debian à la place. ksh objecte en :tant que nom de fonction, mais en utilisant quelque chose - dire à la b()place semble avoir le résultat souhaité.

Drav Sloan
la source
Quels sont ces personnages? Je sais que ce sont des bugs mais comment les avez-vous créés?
slm
10
Bien qu'à une petite taille de police, cela ressemble à un bug, vous constaterez qu'il s'agit en fait d'un bonhomme de neige. Ce serait le caractère unicode U + 2603 qui peut être affiché en html en entrant & # x 2603 sans les espaces.
sambler
2
Apparemment, sous Linux, un bon nombre d'applications liées à Gnome et Firefox prennent en charge Ctrl+Shift+u+<hex>où hex est le code hexadécimal du caractère unicode que vous souhaitez afficher. Une liste des unicodes visibles peut être trouvée à: fileformat.info/info/unicode/utf8test.htm (la plupart des bizarres sont dans les sections "divers"). Windows devrait commander superuser.com/questions/47420/… , et j'utilise personnellement l'outil mentionné dans le lien unicodeinput.exeou le copier-coller via mon navigateur. Vous pouvez toujours utiliser des séquences html comme suggéré par sambler.
Drav Sloan
1
Le wiki a également une liste de caractères Unicode: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan
J'ai aimé le bug du bonhomme de neige, celui que vous utilisez ici n'est pas affiché sur mon système, 🐛 apparaît comme une boîte avec des nombres hexadécimaux.
terdon